sql-code-graph 1.34.2__tar.gz → 1.34.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/PKG-INFO +1 -1
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/docs/cli.md +7 -0
- sql_code_graph-1.34.4/plan/metrics/pr4_star_promote_after.json +31 -0
- sql_code_graph-1.34.4/plan/metrics/pr4_star_promote_before.json +31 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/pyproject.toml +1 -1
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/__init__.py +1 -1
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/analyze.py +25 -3
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.py +1 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.sql +23 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/indexer.py +14 -0
- sql_code_graph-1.34.4/tests/integration/test_impact_consumer_parity.py +350 -0
- sql_code_graph-1.34.4/tests/integration/test_star_promote_temp_columns.py +250 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/uv.lock +1 -1
- sql_code_graph-1.34.2/tests/integration/test_impact_consumer_parity.py +0 -230
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/api-documenter.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/architect-planner.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/architect-reviewer.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/code-reviewer.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/developer.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/plan-reviewer.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.claude/agents/sprint-planner.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/workflows/benchmark.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/workflows/e2e-tests.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/workflows/release.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.github/workflows/test.yml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.gitignore +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.pre-commit-config.yaml +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/.sqlcgignore +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/ARCHITECTURE_REVIEW.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/CHANGELOG.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/CLAUDE.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/README.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/docs/AIRBNB_PARSE_REPORT.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/docs/getting-started.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/docs/releasing-pypi.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/e2e_firstuser_report.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/e2e_run_20260528_101413.output +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/main.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/WORKFLOW.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/pr2_catalog_load_eval.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/pr3_repo_native_plateau.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/pr4_transform_kinds.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/createkind_dwh_after.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/createkind_dwh_before.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/lineage5_dwh_before_master.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/schema_comparison_with_schema.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/schema_comparison_without_schema.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/metrics/sprint_pool_300s_plan.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/column_coverage_diagnostic.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/column_coverage_findings.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/dwh_graph_analysis.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/feature_acceptance_dwh.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/graph_health_sprint_postmortem.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/island_lever_live_verification.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/sprint_3.1_postmortem.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/blueprint.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/investigation_e5_e4.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/parse_diagnostics.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/parsing_errors_experiment.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/snowflake_en_test_suite.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/research/sqlcg.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/bundle_claude_skill.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/column_lineage_recall_metric.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/coverage_p1_p3_p4.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/coverage_p1_p5_metric.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/coverage_parse_failures.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/diff-impact-producer-file.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/e8_dual_emission.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_downstream_sink_location.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_expand_qualify_perf.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_firstuser_findings.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/fix_schema_case_mismatch.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/gain_coverage_metrics.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/living_codebase_resync.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/mcp_server_self_healing.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_01.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_02.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_03.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_04_column_lineage.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_05_star_resolution.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_07_open_ecodes.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_08_perf_upsert.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_10_anchor_tools.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_12_v1.1.0.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/sprint_postmortem_fixes.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/temp_table_namespacing.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/trust_layer.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/unfilled_table_impact.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1_1_2_bugfix.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1_2_0_read_proxy.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/v1_2_1_bugfix.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/plan/sprints/version-parity-and-restart.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/profile.html +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/pyrightconfig.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/scripts/collect_parse_errors.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/scripts/column_coverage_check.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/scripts/generate_cli_docs.sh +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/__main__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/catalog.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/db.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/find.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/gain.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/git.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/index.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/install.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/mcp.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/reindex.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/report.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/uninstall.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/watch.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/coverage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/cli/main.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/config.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/duckdb_backend.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/freshness.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/graph_db.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/jobs.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/noise_match.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.cypher +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/schema.cypher +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/core/schema.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/dbt_adapter.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/error_classify.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/git_delta.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/pool.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/walker.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/indexer/watcher.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/lineage/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/lineage/aggregator.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/lineage/schema_resolver.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/metrics/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/metrics/store.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/ansi_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/base.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/bigquery_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/postgres_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/registry.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/snowflake_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/parsers/tsql_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/control.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/exceptions.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/models.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/noise_filter.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/read_client.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/selfheal.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/server.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/skill.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/tools.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/server/writer.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/utils/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/utils/hashing.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/utils/ignore.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/src/sqlcg/utils/logging.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/adversarial/200_join.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/adversarial/500_union.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/bench_indexer.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/conftest.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q01.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q02.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q03.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q04.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q05.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/conftest.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/conftest.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_airbnb_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_cli_index.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_git_hook_install.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_golden_lineage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_mcp_lifecycle.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_mcp_tools.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_selfheal_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_star_resolution_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/e2e/test_watch.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_listings.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_hosts.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_listings.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_reviews.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/bigquery/.gitkeep +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/customers.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/orders.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/base_tables.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/reports.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/views.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/etl_star.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/base_tables.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/reports.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/views.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/snowflake/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/snowflake/test_insert_select.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_T34_presentation_segregation.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_T35_external_consumers.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_analyze_case_fold.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_anchor_tools.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_backfill_impact_consistency.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_bare_column_cte_lineage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_bulk_upsert.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_case_split_seed_regression.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_catalog_kind_upgrade.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_catalog_load_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_column_coverage_patterns.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_column_lineage_e2e.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_coverage_metrics_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cross_file_lineage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cte_recall_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cte_schema_alias_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_cte_source_node_invariant.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_dialect_auto_resolution.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_dialect_matrix.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_duckdb_parity.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_empty_impact_blast_radius.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_empty_index_rollback_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_freshness_mcp.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_gating_join_retrofit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_identity_counters_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_index_degraded_files_metric.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_index_filter_node_exclusion.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_indexer_batching.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_indexer_commits.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_indexer_to_graph.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_join_col_resolution.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_key_normalization_chokepoint.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_live_anchors.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_mvcc_rebuild.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_non_table_create_kind_in_graph.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_parse_diagnostics.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_pr1_confidence_reason.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_pr2_source_location.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_pr3_kind_tagging.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_pr_impact_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_qualify_failed_persist.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_read_via_server.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_readonly_under_lock.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_reindex_via_server.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_resync.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_completeness.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_cte_body_source.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_subscope_source.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_single_writer_queue.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_skip_counts_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_star_resolution.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_temp_table_lineage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_temp_table_namespacing.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_tool_version_stamp_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_usage_derived_catalog.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_use_schema_session_context_integration.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_user_surface_recall_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_v141_surface_guards.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_view_kind_in_graph.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/integration/test_write_memory_ceiling.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/perf/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/perf/test_perf.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E10/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E11/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E12/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E12/e12_json_path.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E12/test_e12.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E13/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E14/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E15/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E16/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E16/e16_merge.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E16/test_e16.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E17/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E18/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_decode.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_nvl2.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E18/test_e18.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E19/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E2/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_function_alias.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E2/test_e2.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E20/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E21/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E21/test_e21.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E22/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E23/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E23/test_e23.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E24/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E25/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E25/e25_cross_db.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E25/e25_two_part.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E25/test_e25.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E25/test_e25_full_id.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E26/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E27/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E27/e27_udf.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E27/test_e27.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E28/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E29/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E3/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_alter_table.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E3/test_e3.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E30/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E31/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E32/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E33/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E34/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E35/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E36/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E36/e36_temp_table.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E36/test_e36.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E36/test_e36_xfile.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E37/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E38/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_unpivot.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E4/test_e4.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/test_e5.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E8/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_uuid.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E8/test_e8.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E9/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/README.md +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_etl.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_source.sql +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/conftest.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/snowflake/test_plan_review_gates.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/snowflake/__init__.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/snowflake/test_scripting_noise.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_BugC_hook_upgrade.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_F2_install_skill.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_F2_skill_render.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_F2_uninstall_skill.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_T09_01_qualify_once.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_T09_02_ddl_skip.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_T09_06_log_verbosity.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_T35_config_external_consumers.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_aggregator.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_aggregator_skip.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_analyze_case_fold.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_base_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_branch_monitor.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_bulk_upsert_invariant.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_canonical_target_resolution.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_catalog_csv_parsing.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_catalog_missing_warning.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_classify_non_table_create_kind.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_cli.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_cli_help.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_closure_depth.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_column_lineage_wiring.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_config.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_coverage_metrics.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_cte_key_namespacing.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_cte_source_gap_metric.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_data_models.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_db_info.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_db_info_coverage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_db_path_isolation_fixture.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_doc_links.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_doc_markdown_link_existence.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_dominant_cause.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_duckdb_backend.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_duckdb_backend_shared.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_e5_view_alias_resolution.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_e8_dual_emission.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_empty_propagation_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_extract_select_output_columns.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_file_ignore_defaults.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_find_cmd.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_firstuser_findings.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_freshness_helper.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_gain_coverage.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_gain_ratio.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_gating_join_field_docstrings.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_git_delta.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_git_hooks.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_git_hooks_notify.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_graph_backend.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_graph_completeness_invariant.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_hard_kill_pool.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_has_column_precedence_upsert.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_hook_reindex_detach.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_hygiene_config_warning.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_identity_counters.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_include_working_tree.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_index_cmd.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_index_filter_config.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_index_flags.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_index_progress.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_index_summary_degraded_metric.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_indexer_progress.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_indexer_quality.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_install.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_install_message.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_issue_63_readonly_lock.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_jobs.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_join_col_resolve_marker.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_judgement.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_lineage_conversion.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_literal_column_skip.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_mcp_best_practices.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_mcp_control.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_mcp_stdio_smoke.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_metrics.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_noise_filter.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_normalize_keys.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_parse_failed_classification.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_parse_file_dependency_filter.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_parse_quality.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_parser.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_perf_scaling_guard.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_pr07_observability.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_pr_impact_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_qualify_failed_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_queries_loader.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_read_client.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_resolve_join_columns_sql.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_schema_resolver.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_selects_from_completeness_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_detector.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_pr1_messages.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_reexec.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_watcher.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_server.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_skip_counts_persistence.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_sprint_06_t04_t05.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_star_resolution_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_star_schema_unit.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_submit_feedback.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_subprocess_isolate.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_t02_expression_name_extraction.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_t03_ddl_skip.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_temp_table_namespacing.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_timeout_cancel.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_tool_version_stamp.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_tools_hints.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_tools_warnings.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_transform_kind_classification.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_uninstall.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_unknown_sentinel_skip.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_unqualified_fallback.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_upsert_batch_invariant.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_use_schema_session_context.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_version_parity.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_view_classification.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_walker.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_watcher.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_worker_error_classification.py +0 -0
- {sql_code_graph-1.34.2 → sql_code_graph-1.34.4}/tests/unit/test_writer_queue.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sql-code-graph
|
|
3
|
-
Version: 1.34.
|
|
3
|
+
Version: 1.34.4
|
|
4
4
|
Summary: SQL code graph analyzer and lineage tracer
|
|
5
5
|
Project-URL: Homepage, https://github.com/Warhorze/sql-code-graph
|
|
6
6
|
Project-URL: Repository, https://github.com/Warhorze/sql-code-graph
|
|
@@ -438,6 +438,13 @@ sqlcg analyze impact [OPTIONS] TABLE
|
|
|
438
438
|
|
|
439
439
|
Show all queries impacted by a table.
|
|
440
440
|
|
|
441
|
+
One-hop "who reads this table" — the union of direct SELECTS_FROM consumers
|
|
442
|
+
and consumers that read the table only via COLUMN_LINEAGE / STAR_SOURCE
|
|
443
|
+
(CTE-wrapped / promoted-intermediate reads, e.g. the live DWH node
|
|
444
|
+
``ba.all_rows_in_selection``). Bug #6 fix: brings ``impact`` to the same
|
|
445
|
+
one-hop consumer completeness ``find_table_usages`` already has. Stays
|
|
446
|
+
one-hop (NOT transitive — that is ``downstream``'s job).
|
|
447
|
+
|
|
441
448
|
### Options
|
|
442
449
|
|
|
443
450
|
| Option | Type | Required | Repeatable | Default | Description |
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{"total_calls": 1231, "last_7d_calls": 1231, "index_runs": 5, "feedback_tp": 0,
|
|
2
|
+
"feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 412},
|
|
3
|
+
{"name": "trace_column_lineage", "count": 326}, {"name":
|
|
4
|
+
"list_dialects_and_repos", "count": 106}], "execute_sql_ratio": 0.33,
|
|
5
|
+
"parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
|
|
6
|
+
"coverage": {"catalogued_tables": 5800, "total_tables": 6581, "good_edges":
|
|
7
|
+
52673, "total_edges": 60821, "phantom_edges": 12241, "blindspot_tables": 628,
|
|
8
|
+
"good_edges_strict": 48140, "edge_health_strict_pct": 79.15,
|
|
9
|
+
"good_edges_scoped": 37460, "total_edges_scoped": 38009,
|
|
10
|
+
"edge_health_scoped_pct": 98.56, "phantom_confirmed": 11701,
|
|
11
|
+
"phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
|
|
12
|
+
[{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
|
|
13
|
+
"ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
|
|
14
|
+
"ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
|
|
15
|
+
"da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
|
|
16
|
+
"da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
|
|
17
|
+
"wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
|
|
18
|
+
"da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
|
|
19
|
+
"bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19},
|
|
20
|
+
{"table": "da.hthyb_page_brandplacement", "bad_edges": 17}],
|
|
21
|
+
"blindspot_tables_for_80pct": 17, "files_indexed": 1335, "indexed_sha":
|
|
22
|
+
"fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path": "/tmp/pr4_after.duckdb",
|
|
23
|
+
"index_timestamp": 1781457525.4581766, "degraded_parse_total": 5189,
|
|
24
|
+
"degraded_parse_queries": 20, "degraded_parse_by_dir": {"etl": {"degraded": 1,
|
|
25
|
+
"total": 2776}, "ddl": {"degraded": 19, "total": 2413}},
|
|
26
|
+
"zero_edge_write_queries": 1063, "total_write_queries": 2352,
|
|
27
|
+
"cte_key_collisions": 0, "rescuable_unqualified_edges": 125,
|
|
28
|
+
"info_schema_has_column_rows": 100193, "cte_source_gap_writes": 0,
|
|
29
|
+
"resolvable_write_col_edges": 36936, "transitive_col_edges": 4184,
|
|
30
|
+
"qualify_failed_statements": 9, "tool_version_stale": false,
|
|
31
|
+
"indexed_tool_version": "1.34.2", "running_tool_version": "1.34.2"}}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{"total_calls": 1231, "last_7d_calls": 1231, "index_runs": 5, "feedback_tp": 0,
|
|
2
|
+
"feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 412},
|
|
3
|
+
{"name": "trace_column_lineage", "count": 326}, {"name":
|
|
4
|
+
"list_dialects_and_repos", "count": 106}], "execute_sql_ratio": 0.33,
|
|
5
|
+
"parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
|
|
6
|
+
"coverage": {"catalogued_tables": 5796, "total_tables": 6581, "good_edges":
|
|
7
|
+
51336, "total_edges": 59484, "phantom_edges": 12241, "blindspot_tables": 628,
|
|
8
|
+
"good_edges_strict": 46495, "edge_health_strict_pct": 78.16,
|
|
9
|
+
"good_edges_scoped": 36842, "total_edges_scoped": 37619,
|
|
10
|
+
"edge_health_scoped_pct": 97.93, "phantom_confirmed": 11701,
|
|
11
|
+
"phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
|
|
12
|
+
[{"table": "ia_analytics.ba_wtfa_artikel_formule_dagomzet", "bad_edges": 217},
|
|
13
|
+
{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
|
|
14
|
+
"ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
|
|
15
|
+
"ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
|
|
16
|
+
"da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
|
|
17
|
+
"da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
|
|
18
|
+
"wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
|
|
19
|
+
"da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
|
|
20
|
+
"bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19}],
|
|
21
|
+
"blindspot_tables_for_80pct": 15, "files_indexed": 1335, "indexed_sha":
|
|
22
|
+
"fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path": "/tmp/pr4_before.duckdb",
|
|
23
|
+
"index_timestamp": 1781457313.671681, "degraded_parse_total": 5189,
|
|
24
|
+
"degraded_parse_queries": 20, "degraded_parse_by_dir": {"etl": {"degraded": 1,
|
|
25
|
+
"total": 2776}, "ddl": {"degraded": 19, "total": 2413}},
|
|
26
|
+
"zero_edge_write_queries": 1069, "total_write_queries": 2352,
|
|
27
|
+
"cte_key_collisions": 0, "rescuable_unqualified_edges": 125,
|
|
28
|
+
"info_schema_has_column_rows": 110257, "cte_source_gap_writes": 0,
|
|
29
|
+
"resolvable_write_col_edges": 35759, "transitive_col_edges": 4178,
|
|
30
|
+
"qualify_failed_statements": 9, "tool_version_stale": false,
|
|
31
|
+
"indexed_tool_version": "1.34.0", "running_tool_version": "1.34.0"}}
|
|
@@ -8,7 +8,10 @@ import typer
|
|
|
8
8
|
from rich.console import Console
|
|
9
9
|
from rich.table import Table
|
|
10
10
|
|
|
11
|
-
from sqlcg.core.queries import
|
|
11
|
+
from sqlcg.core.queries import (
|
|
12
|
+
GET_TABLE_EXTERNAL_CONSUMERS_QUERY,
|
|
13
|
+
IMPACT_CONSUMERS_VIA_LINEAGE_QUERY,
|
|
14
|
+
)
|
|
12
15
|
from sqlcg.server.read_client import resolved_repo_root, run_read_routed
|
|
13
16
|
|
|
14
17
|
if TYPE_CHECKING:
|
|
@@ -312,8 +315,16 @@ def impact( # noqa: B008
|
|
|
312
315
|
table: str = typer.Argument(..., help="Table name to analyze"), # noqa: B008
|
|
313
316
|
raw: bool = typer.Option(False, "--raw", help="Disable noise filtering on results"), # noqa: B008
|
|
314
317
|
) -> None:
|
|
315
|
-
"""Show all queries impacted by a table.
|
|
316
|
-
|
|
318
|
+
"""Show all queries impacted by a table.
|
|
319
|
+
|
|
320
|
+
One-hop "who reads this table" — the union of direct SELECTS_FROM consumers
|
|
321
|
+
and consumers that read the table only via COLUMN_LINEAGE / STAR_SOURCE
|
|
322
|
+
(CTE-wrapped / promoted-intermediate reads, e.g. the live DWH node
|
|
323
|
+
``ba.all_rows_in_selection``). Bug #6 fix: brings ``impact`` to the same
|
|
324
|
+
one-hop consumer completeness ``find_table_usages`` already has. Stays
|
|
325
|
+
one-hop (NOT transitive — that is ``downstream``'s job).
|
|
326
|
+
"""
|
|
327
|
+
direct = run_read_routed(
|
|
317
328
|
"SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target"
|
|
318
329
|
' FROM "SqlTable" t'
|
|
319
330
|
' JOIN "SELECTS_FROM" sf ON sf.dst_key = t.qualified'
|
|
@@ -321,6 +332,17 @@ def impact( # noqa: B008
|
|
|
321
332
|
" WHERE t.qualified = ? LIMIT 100",
|
|
322
333
|
{"t": table},
|
|
323
334
|
)
|
|
335
|
+
# Consumers reachable only via COLUMN_LINEAGE / STAR_SOURCE. Two "?" both
|
|
336
|
+
# bound to the qualified table name: _params_list returns list(values()) in
|
|
337
|
+
# insertion order, so the ordered dict {"t":..., "t2":...} binds correctly.
|
|
338
|
+
via = run_read_routed(
|
|
339
|
+
IMPACT_CONSUMERS_VIA_LINEAGE_QUERY,
|
|
340
|
+
{"t": table, "t2": table},
|
|
341
|
+
)
|
|
342
|
+
seen = {r["id"] for r in direct}
|
|
343
|
+
results = direct + [r for r in via if r["id"] not in seen]
|
|
344
|
+
# Preserve the existing 100-row bound on the merged consumer set.
|
|
345
|
+
results = results[:100]
|
|
324
346
|
if not raw:
|
|
325
347
|
from sqlcg.server.noise_filter import NoiseFilter
|
|
326
348
|
|
|
@@ -72,3 +72,4 @@ GET_TABLES_EXTERNAL_CONSUMERS_BATCH_QUERY = _Q["GET_TABLES_EXTERNAL_CONSUMERS_BA
|
|
|
72
72
|
COUNT_EXTERNAL_CONSUMERS_QUERY = _Q["COUNT_EXTERNAL_CONSUMERS"]
|
|
73
73
|
GET_TABLE_READS_ADJACENCY_QUERY = _Q["GET_TABLE_READS_ADJACENCY"]
|
|
74
74
|
GET_PRODUCER_TABLES_QUERY = _Q["GET_PRODUCER_TABLES"]
|
|
75
|
+
IMPACT_CONSUMERS_VIA_LINEAGE_QUERY = _Q["IMPACT_CONSUMERS_VIA_LINEAGE"]
|
|
@@ -413,3 +413,26 @@ WHERE t.name = ?
|
|
|
413
413
|
SELECT DISTINCT target_table AS producer_table
|
|
414
414
|
FROM "SqlQuery"
|
|
415
415
|
WHERE target_table <> '' AND target_table IS NOT NULL
|
|
416
|
+
|
|
417
|
+
-- IMPACT_CONSUMERS_VIA_LINEAGE
|
|
418
|
+
-- Bug #6: consumers that read a table only via COLUMN_LINEAGE or STAR_SOURCE
|
|
419
|
+
-- (CTE-wrapped / promoted-intermediate reads that emit no top-level SELECTS_FROM
|
|
420
|
+
-- edge, e.g. the live DWH cross-file-promoted node ba.all_rows_in_selection:
|
|
421
|
+
-- kind='table', non-namespaced, 0 SELECTS_FROM in-edges, 55 COLUMN_LINEAGE
|
|
422
|
+
-- out-edges). Returns the same (id, kind, target) shape as the SELECTS_FROM-only
|
|
423
|
+
-- impact query in analyze.py:impact() so the two result sets merge + dedup on q.id.
|
|
424
|
+
-- Both branches key on the QUALIFIED table name (impact() keys on t.qualified):
|
|
425
|
+
-- COLUMN_LINEAGE branch -> src.table_qualified; STAR_SOURCE branch -> ss.dst_key.
|
|
426
|
+
-- The STAR_SOURCE branch closes the STAR-only-consumer gap (FIND_TABLE_USAGES
|
|
427
|
+
-- itself still lacks it — out of scope, separate follow-up).
|
|
428
|
+
-- params: [table_qualified, table_qualified] (same value bound to BOTH ?)
|
|
429
|
+
SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target
|
|
430
|
+
FROM "SqlColumn" src
|
|
431
|
+
JOIN "COLUMN_LINEAGE" cl ON cl.src_key = src.id
|
|
432
|
+
JOIN "SqlQuery" q ON q.id = cl.query_id
|
|
433
|
+
WHERE src.table_qualified = ?
|
|
434
|
+
UNION
|
|
435
|
+
SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target
|
|
436
|
+
FROM "STAR_SOURCE" ss
|
|
437
|
+
JOIN "SqlQuery" q ON q.id = ss.src_key
|
|
438
|
+
WHERE ss.dst_key = ?
|
|
@@ -896,6 +896,20 @@ class Indexer:
|
|
|
896
896
|
if profile:
|
|
897
897
|
_t_catalog_end = time.perf_counter()
|
|
898
898
|
|
|
899
|
+
# Bug #4 (PR-4): re-run the star expansion AFTER the catalog is applied.
|
|
900
|
+
# The first pass at the top of this block expands STAR_SOURCE rows whose
|
|
901
|
+
# leaf table already had HAS_COLUMN rows (parsed DDL). A temp built as
|
|
902
|
+
# `CREATE TEMP t AS SELECT * FROM src` where `src` is catalogued ONLY via
|
|
903
|
+
# information_schema has NO columns at the first pass — its HAS_COLUMN rows
|
|
904
|
+
# arrive with the catalog above — so the temp (and any promote out of it)
|
|
905
|
+
# produced zero edges. The star-expansion SQL is idempotent
|
|
906
|
+
# (INSERT OR REPLACE) and chains both levels (src -> temp -> persisted) in a
|
|
907
|
+
# single pass once the leaf columns exist, so one extra invocation here is
|
|
908
|
+
# the full fix. Only re-run when the catalog actually added columns; a repo
|
|
909
|
+
# with no configured catalog pays nothing.
|
|
910
|
+
if catalog_result.get("columns_loaded", 0) > 0:
|
|
911
|
+
star_edges_expanded = self._expand_star_sources(db)
|
|
912
|
+
|
|
899
913
|
# Post-catalog: resolve JOIN_COL_RESOLVE markers against the full HAS_COLUMN
|
|
900
914
|
# catalog (Bug #5, PR-5 option b). MUST run after the catalog is applied so
|
|
901
915
|
# information_schema columns are present; the suppressed sqlglot mis-bind
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"""Bug #6 gate: ``analyze impact <T>`` must not under-report consumers that
|
|
2
|
+
``downstream`` / ``empty-impact`` surface.
|
|
3
|
+
|
|
4
|
+
Governing plan: [bugfix_impact_consumer_union]
|
|
5
|
+
([plan doc](plan/sprints/bugfix_impact_consumer_union.md), branch
|
|
6
|
+
``plan/impact-consumer-union``).
|
|
7
|
+
|
|
8
|
+
GATE OUTCOME: REPRODUCED at DWH scale. The bug is real: the live DWH node
|
|
9
|
+
``ba.all_rows_in_selection`` is a *cross-file qualified-name-promoted* inner-CTE
|
|
10
|
+
intermediate — ``kind='table'``, **non-namespaced** (no ``::``), **0
|
|
11
|
+
SELECTS_FROM in-edges**, **55 COLUMN_LINEAGE out-edges**. ``analyze impact``
|
|
12
|
+
joined only SELECTS_FROM, so it returned "No results" for that node while
|
|
13
|
+
``empty-impact`` / ``downstream`` (which follow COLUMN_LINEAGE) found the real
|
|
14
|
+
consumer.
|
|
15
|
+
|
|
16
|
+
Why the earlier "NOT REPRODUCED" claim was wrong (PR #156): the disproven
|
|
17
|
+
hypothesis was that *only namespaced CTE intermediates* (``kind='cte'``) ever
|
|
18
|
+
have a COLUMN_LINEAGE/STAR read without a SELECTS_FROM edge. A from-scratch
|
|
19
|
+
in-memory index of a nested-CTE INSERT…SELECT does indeed only emit a namespaced
|
|
20
|
+
``kind='cte'`` gap node — but the live divergence arises from a **cross-file**
|
|
21
|
+
promotion effect (a source-ref node defaults to ``kind='table'`` and is only
|
|
22
|
+
upgraded to ``kind='cte'`` when the *same* qualified name is later confirmed a
|
|
23
|
+
CTE destination in the same pass; the single-file case namespaces+confirms →
|
|
24
|
+
``cte``). A unit/indexer fixture cannot reproduce the non-namespaced
|
|
25
|
+
``kind='table'`` shape, so the authoritative repro below is **graph-layer
|
|
26
|
+
seeded**: it writes the exact divergence shape directly, with no indexer. The
|
|
27
|
+
nested-CTE indexer fixture is kept only as a *no-regression* case (it proves
|
|
28
|
+
``impact`` on a physical source is unchanged), NOT as the bug repro.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import pytest
|
|
34
|
+
|
|
35
|
+
from sqlcg.core.duckdb_backend import DuckDBBackend
|
|
36
|
+
from sqlcg.core.queries import IMPACT_CONSUMERS_VIA_LINEAGE_QUERY
|
|
37
|
+
from sqlcg.indexer.indexer import Indexer
|
|
38
|
+
|
|
39
|
+
# The exact query the OLD `analyze impact <table>` ran (SELECTS_FROM only): a
|
|
40
|
+
# single hop SqlTable -> SELECTS_FROM -> SqlQuery. Kept here as the negative
|
|
41
|
+
# control — the seeded repro asserts this returns ∅ for the promoted node.
|
|
42
|
+
_IMPACT_SQL = (
|
|
43
|
+
"SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target"
|
|
44
|
+
' FROM "SqlTable" t'
|
|
45
|
+
' JOIN "SELECTS_FROM" sf ON sf.dst_key = t.qualified'
|
|
46
|
+
' JOIN "SqlQuery" q ON q.id = sf.src_key'
|
|
47
|
+
" WHERE t.qualified = ? LIMIT 100"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# DDL shared by all parity cases.
|
|
51
|
+
_DDL = (
|
|
52
|
+
"CREATE TABLE ba.src (col1 INT, col2 INT);\n"
|
|
53
|
+
"CREATE TABLE ba.tgt (col1 INT, col2 INT);\n"
|
|
54
|
+
"CREATE TABLE ba.main (col1 INT, id INT);\n"
|
|
55
|
+
"CREATE TABLE ba.lookup (x INT);\n"
|
|
56
|
+
"CREATE TABLE ba.filt (id INT);\n"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# (case-id, consumer-SQL, physical-target-table) — every shape the validation
|
|
60
|
+
# sprint named, plus subquery / CTE / view / star variants.
|
|
61
|
+
IMPACT_PARITY_CASES = [
|
|
62
|
+
("plain_insert_select", "INSERT INTO ba.tgt SELECT col1, col2 FROM ba.src;\n", "ba.src"),
|
|
63
|
+
("insert_select_star", "INSERT INTO ba.tgt SELECT * FROM ba.src;\n", "ba.src"),
|
|
64
|
+
(
|
|
65
|
+
"cte_wrapped_insert",
|
|
66
|
+
"INSERT INTO ba.tgt WITH c AS (SELECT col1, col2 FROM ba.src) SELECT col1, col2 FROM c;\n",
|
|
67
|
+
"ba.src",
|
|
68
|
+
),
|
|
69
|
+
(
|
|
70
|
+
"cte_wrapped_create_view",
|
|
71
|
+
"CREATE VIEW ba.v AS WITH c AS (SELECT col1 FROM ba.src) SELECT col1 FROM c;\n",
|
|
72
|
+
"ba.src",
|
|
73
|
+
),
|
|
74
|
+
(
|
|
75
|
+
"cte_wrapped_star",
|
|
76
|
+
"INSERT INTO ba.tgt WITH c AS (SELECT * FROM ba.src) SELECT * FROM c;\n",
|
|
77
|
+
"ba.src",
|
|
78
|
+
),
|
|
79
|
+
(
|
|
80
|
+
"nested_cte_source_deep",
|
|
81
|
+
"INSERT INTO ba.tgt WITH a AS (SELECT col1 FROM ba.src), "
|
|
82
|
+
"b AS (SELECT col1 FROM a) SELECT col1 FROM b;\n",
|
|
83
|
+
"ba.src",
|
|
84
|
+
),
|
|
85
|
+
(
|
|
86
|
+
"scalar_subquery_source",
|
|
87
|
+
"INSERT INTO ba.tgt SELECT col1, (SELECT max(x) FROM ba.lookup) FROM ba.main;\n",
|
|
88
|
+
"ba.lookup",
|
|
89
|
+
),
|
|
90
|
+
(
|
|
91
|
+
"where_in_subquery_source",
|
|
92
|
+
"INSERT INTO ba.tgt SELECT col1 FROM ba.main WHERE id IN (SELECT id FROM ba.filt);\n",
|
|
93
|
+
"ba.filt",
|
|
94
|
+
),
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _index(tmp_path, files: dict[str, str]) -> DuckDBBackend:
|
|
99
|
+
for name, content in files.items():
|
|
100
|
+
(tmp_path / name).write_text(content)
|
|
101
|
+
db = DuckDBBackend(":memory:")
|
|
102
|
+
db.init_schema()
|
|
103
|
+
Indexer().index_repo(tmp_path, dialect=None, db=db, use_git=False)
|
|
104
|
+
return db
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _impact_consumers(db: DuckDBBackend, table: str) -> set[str]:
|
|
108
|
+
"""OLD `impact`: direct SELECTS_FROM consumers only (the under-reporting query)."""
|
|
109
|
+
return {r["id"] for r in db.run_read(_IMPACT_SQL, {"t": table})}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _union_consumers(db: DuckDBBackend, table: str) -> set[str]:
|
|
113
|
+
"""The full consumer set across SELECTS_FROM ∪ STAR_SOURCE ∪ COLUMN_LINEAGE.
|
|
114
|
+
|
|
115
|
+
This is the parity yardstick the fixed ``impact`` reaches.
|
|
116
|
+
"""
|
|
117
|
+
sf = db.run_read(
|
|
118
|
+
'SELECT DISTINCT src_key AS q FROM "SELECTS_FROM" WHERE dst_key = ?', {"t": table}
|
|
119
|
+
)
|
|
120
|
+
ss = db.run_read(
|
|
121
|
+
'SELECT DISTINCT src_key AS q FROM "STAR_SOURCE" WHERE dst_key = ?', {"t": table}
|
|
122
|
+
)
|
|
123
|
+
cl = db.run_read(
|
|
124
|
+
'SELECT DISTINCT cl.query_id AS q FROM "COLUMN_LINEAGE" cl '
|
|
125
|
+
'JOIN "SqlColumn" s ON s.id = cl.src_key WHERE s.table_qualified = ?',
|
|
126
|
+
{"t": table},
|
|
127
|
+
)
|
|
128
|
+
return {r["q"] for r in sf} | {r["q"] for r in ss} | {r["q"] for r in cl}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _merged_impact_consumers(db: DuckDBBackend, table: str) -> list[dict]:
|
|
132
|
+
"""The NEW `impact` consumer set: direct (SELECTS_FROM) merged with via-lineage
|
|
133
|
+
(COLUMN_LINEAGE ∪ STAR_SOURCE), deduped on q.id — exactly what
|
|
134
|
+
``analyze.py:impact()`` builds. Two ``?`` both bound to the qualified name via
|
|
135
|
+
an ordered 2-entry dict (``_params_list`` returns ``list(values())``).
|
|
136
|
+
"""
|
|
137
|
+
direct = db.run_read(_IMPACT_SQL, {"t": table})
|
|
138
|
+
via = db.run_read(IMPACT_CONSUMERS_VIA_LINEAGE_QUERY, {"t": table, "t2": table})
|
|
139
|
+
seen = {r["id"] for r in direct}
|
|
140
|
+
return (direct + [r for r in via if r["id"] not in seen])[:100]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _seed_promoted_intermediate(db: DuckDBBackend) -> tuple[str, str]:
|
|
144
|
+
"""Seed the live DWH divergence shape DIRECTLY (no indexer).
|
|
145
|
+
|
|
146
|
+
Writes:
|
|
147
|
+
* a non-namespaced ``kind='table'`` SqlTable (``ba.promoted_intermediate``);
|
|
148
|
+
* a SqlColumn whose ``table_qualified`` is that table;
|
|
149
|
+
* a consumer SqlQuery (INSERT INTO ba.consumer);
|
|
150
|
+
* a COLUMN_LINEAGE edge column -> consumer-column with ``query_id`` = consumer;
|
|
151
|
+
* NO SELECTS_FROM in-edge to the seeded table.
|
|
152
|
+
|
|
153
|
+
Returns ``(table_qualified, consumer_query_id)``. This is the only shape that
|
|
154
|
+
reproduces Bug #6 (cross-file promotion); an indexer cannot emit it.
|
|
155
|
+
"""
|
|
156
|
+
table = "ba.promoted_intermediate"
|
|
157
|
+
consumer_qid = "q:ba.consumer:0"
|
|
158
|
+
src_col = f"{table}.dn_functie_naam"
|
|
159
|
+
dst_col = "ba.consumer.dn_functie_naam"
|
|
160
|
+
|
|
161
|
+
db.upsert_node(
|
|
162
|
+
"SqlTable",
|
|
163
|
+
table,
|
|
164
|
+
{"catalog": None, "db": "ba", "name": "promoted_intermediate", "kind": "table"},
|
|
165
|
+
)
|
|
166
|
+
db.upsert_node(
|
|
167
|
+
"SqlColumn",
|
|
168
|
+
src_col,
|
|
169
|
+
{
|
|
170
|
+
"catalog": None,
|
|
171
|
+
"db": "ba",
|
|
172
|
+
"table_name": "promoted_intermediate",
|
|
173
|
+
"col_name": "dn_functie_naam",
|
|
174
|
+
"table_qualified": table,
|
|
175
|
+
},
|
|
176
|
+
)
|
|
177
|
+
db.upsert_node(
|
|
178
|
+
"SqlColumn",
|
|
179
|
+
dst_col,
|
|
180
|
+
{
|
|
181
|
+
"catalog": None,
|
|
182
|
+
"db": "ba",
|
|
183
|
+
"table_name": "consumer",
|
|
184
|
+
"col_name": "dn_functie_naam",
|
|
185
|
+
"table_qualified": "ba.consumer",
|
|
186
|
+
},
|
|
187
|
+
)
|
|
188
|
+
db.upsert_node(
|
|
189
|
+
"SqlQuery",
|
|
190
|
+
consumer_qid,
|
|
191
|
+
{
|
|
192
|
+
"file_path": "consumer.sql",
|
|
193
|
+
"statement_index": 0,
|
|
194
|
+
"sql": "INSERT INTO ba.consumer SELECT dn_functie_naam FROM ba.promoted_intermediate",
|
|
195
|
+
"kind": "INSERT_SELECT",
|
|
196
|
+
"target_table": "ba.consumer",
|
|
197
|
+
"parse_failed": False,
|
|
198
|
+
"start_line": 1,
|
|
199
|
+
},
|
|
200
|
+
)
|
|
201
|
+
db.upsert_edge(
|
|
202
|
+
"SqlColumn",
|
|
203
|
+
src_col,
|
|
204
|
+
"SqlColumn",
|
|
205
|
+
dst_col,
|
|
206
|
+
"COLUMN_LINEAGE",
|
|
207
|
+
{"transform": "CTE_PROJECTION", "confidence": 1.0, "query_id": consumer_qid},
|
|
208
|
+
)
|
|
209
|
+
return table, consumer_qid
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@pytest.mark.parametrize(
|
|
213
|
+
("case_id", "consumer_sql", "target"),
|
|
214
|
+
IMPACT_PARITY_CASES,
|
|
215
|
+
ids=[c[0] for c in IMPACT_PARITY_CASES],
|
|
216
|
+
)
|
|
217
|
+
def test_impact_matches_full_consumer_set_for_physical_target(
|
|
218
|
+
tmp_path, case_id, consumer_sql, target
|
|
219
|
+
):
|
|
220
|
+
"""`analyze impact <physical table>` covers the full SELECTS_FROM ∪ STAR ∪
|
|
221
|
+
COLUMN_LINEAGE consumer union (the union is a superset, never drops the
|
|
222
|
+
physical consumer).
|
|
223
|
+
|
|
224
|
+
Guards the union fix's superset property
|
|
225
|
+
([plan doc](plan/sprints/bugfix_impact_consumer_union.md), A3): for a physical
|
|
226
|
+
table the merged ``impact`` set equals the full union — it neither under-reports
|
|
227
|
+
nor adds spurious rows.
|
|
228
|
+
"""
|
|
229
|
+
db = _index(tmp_path, {"ddl.sql": _DDL, "etl.sql": consumer_sql})
|
|
230
|
+
try:
|
|
231
|
+
merged = {r["id"] for r in _merged_impact_consumers(db, target)}
|
|
232
|
+
union = _union_consumers(db, target)
|
|
233
|
+
assert merged, f"[{case_id}] impact found no consumer for {target}"
|
|
234
|
+
# Merged impact must equal the full union for a physical target.
|
|
235
|
+
assert union - merged == set(), (
|
|
236
|
+
f"[{case_id}] merged impact UNDER-reports for {target}: "
|
|
237
|
+
f"union has {sorted(union)}, merged has {sorted(merged)}, "
|
|
238
|
+
f"missed {sorted(union - merged)}"
|
|
239
|
+
)
|
|
240
|
+
assert merged - union == set(), (
|
|
241
|
+
f"[{case_id}] merged impact OVER-reports for {target}: extra {sorted(merged - union)}"
|
|
242
|
+
)
|
|
243
|
+
finally:
|
|
244
|
+
db.close()
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def test_impact_surfaces_lineage_only_consumer_of_promoted_intermediate(tmp_path):
|
|
248
|
+
"""The fixed ``impact`` surfaces a consumer reachable ONLY via COLUMN_LINEAGE
|
|
249
|
+
(no SELECTS_FROM edge) — the live ``ba.all_rows_in_selection`` shape.
|
|
250
|
+
|
|
251
|
+
Authoritative Bug #6 repro, GRAPH-LAYER SEEDED
|
|
252
|
+
([plan doc](plan/sprints/bugfix_impact_consumer_union.md), A1). FAILS pre-fix
|
|
253
|
+
(the OLD SELECTS_FROM-only query returns ∅), PASSES post-fix (the union
|
|
254
|
+
surfaces the consumer). The negative control (``_impact_consumers`` == ∅) is
|
|
255
|
+
asserted in the same test so the repro cannot silently pass for the wrong
|
|
256
|
+
reason.
|
|
257
|
+
"""
|
|
258
|
+
db = DuckDBBackend(":memory:")
|
|
259
|
+
db.init_schema()
|
|
260
|
+
try:
|
|
261
|
+
table, consumer_qid = _seed_promoted_intermediate(db)
|
|
262
|
+
|
|
263
|
+
# Negative control: the OLD SELECTS_FROM-only query finds nothing (the bug).
|
|
264
|
+
old = _impact_consumers(db, table)
|
|
265
|
+
assert old == set(), (
|
|
266
|
+
f"negative control broken: the SELECTS_FROM-only impact query should "
|
|
267
|
+
f"return ∅ for a promoted intermediate with no SELECTS_FROM in-edge, "
|
|
268
|
+
f"got {sorted(old)}"
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
# The fix: the merged (direct ∪ via-lineage) impact surfaces the consumer.
|
|
272
|
+
merged = {r["id"] for r in _merged_impact_consumers(db, table)}
|
|
273
|
+
assert consumer_qid in merged, (
|
|
274
|
+
f"fixed impact must surface the lineage-only consumer {consumer_qid}; "
|
|
275
|
+
f"got {sorted(merged)}"
|
|
276
|
+
)
|
|
277
|
+
finally:
|
|
278
|
+
db.close()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def test_impact_physical_source_unchanged_by_union(tmp_path):
|
|
282
|
+
"""``impact`` on a physical source of a nested-CTE INSERT…SELECT is UNCHANGED
|
|
283
|
+
by the union (direct == merged).
|
|
284
|
+
|
|
285
|
+
No-regression case ([plan doc](plan/sprints/bugfix_impact_consumer_union.md),
|
|
286
|
+
A2). This nested-CTE indexer fixture does NOT reproduce Bug #6 (it emits only a
|
|
287
|
+
namespaced ``kind='cte'`` gap node, and ``ba.src`` already has a SELECTS_FROM
|
|
288
|
+
edge) — the live divergence needs cross-file promotion, covered by the seeded
|
|
289
|
+
test above. Here it proves the union adds/drops nothing for a physical source.
|
|
290
|
+
"""
|
|
291
|
+
db = _index(
|
|
292
|
+
tmp_path,
|
|
293
|
+
{
|
|
294
|
+
"ddl.sql": "CREATE TABLE ba.src (col1 INT, col2 INT);\n"
|
|
295
|
+
"CREATE TABLE ba.tgt (col1 INT, col2 INT);\n",
|
|
296
|
+
"etl.sql": "INSERT INTO ba.tgt WITH outer_c AS ("
|
|
297
|
+
" WITH all_rows AS (SELECT col1, col2 FROM ba.src) SELECT col1, col2 FROM all_rows"
|
|
298
|
+
") SELECT col1, col2 FROM outer_c;\n",
|
|
299
|
+
},
|
|
300
|
+
)
|
|
301
|
+
try:
|
|
302
|
+
direct = _impact_consumers(db, "ba.src")
|
|
303
|
+
merged = {r["id"] for r in _merged_impact_consumers(db, "ba.src")}
|
|
304
|
+
assert direct, "physical source ba.src must have a direct SELECTS_FROM consumer"
|
|
305
|
+
assert direct == merged, (
|
|
306
|
+
f"union changed the consumer set for physical source ba.src: "
|
|
307
|
+
f"direct {sorted(direct)} != merged {sorted(merged)}"
|
|
308
|
+
)
|
|
309
|
+
finally:
|
|
310
|
+
db.close()
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def test_impact_dedups_consumer_reachable_via_both_edges(tmp_path):
|
|
314
|
+
"""A consumer reachable via BOTH SELECTS_FROM and COLUMN_LINEAGE is listed
|
|
315
|
+
exactly once (dedup on q.id).
|
|
316
|
+
|
|
317
|
+
Guards A4 ([plan doc](plan/sprints/bugfix_impact_consumer_union.md)): the merge
|
|
318
|
+
must not double-count. A plain ``INSERT … SELECT … FROM ba.src`` yields a
|
|
319
|
+
consumer reachable both ways; assert it appears once.
|
|
320
|
+
"""
|
|
321
|
+
db = _index(
|
|
322
|
+
tmp_path,
|
|
323
|
+
{"ddl.sql": _DDL, "etl.sql": "INSERT INTO ba.tgt SELECT col1 FROM ba.src;\n"},
|
|
324
|
+
)
|
|
325
|
+
try:
|
|
326
|
+
rows = _merged_impact_consumers(db, "ba.src")
|
|
327
|
+
ids = [r["id"] for r in rows]
|
|
328
|
+
assert ids, "expected at least one consumer for ba.src"
|
|
329
|
+
assert len(ids) == len(set(ids)), f"duplicate consumer rows in impact: {ids}"
|
|
330
|
+
finally:
|
|
331
|
+
db.close()
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def test_impact_result_schema_has_id_and_kind(tmp_path):
|
|
335
|
+
"""The merged ``impact`` rows still expose ``id`` and ``kind`` keys (output
|
|
336
|
+
schema unchanged).
|
|
337
|
+
|
|
338
|
+
Guards A5 ([plan doc](plan/sprints/bugfix_impact_consumer_union.md)).
|
|
339
|
+
"""
|
|
340
|
+
db = _index(
|
|
341
|
+
tmp_path,
|
|
342
|
+
{"ddl.sql": _DDL, "etl.sql": "INSERT INTO ba.tgt SELECT col1 FROM ba.src;\n"},
|
|
343
|
+
)
|
|
344
|
+
try:
|
|
345
|
+
rows = _merged_impact_consumers(db, "ba.src")
|
|
346
|
+
assert rows, "expected at least one consumer row"
|
|
347
|
+
for r in rows:
|
|
348
|
+
assert "id" in r and "kind" in r, f"missing id/kind in row keys: {sorted(r)}"
|
|
349
|
+
finally:
|
|
350
|
+
db.close()
|