sql-code-graph 1.34.3__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.
Files changed (591) hide show
  1. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/PKG-INFO +1 -1
  2. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/docs/cli.md +7 -0
  3. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/pyproject.toml +1 -1
  4. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/__init__.py +1 -1
  5. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/analyze.py +25 -3
  6. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.py +1 -0
  7. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.sql +23 -0
  8. sql_code_graph-1.34.4/tests/integration/test_impact_consumer_parity.py +350 -0
  9. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/uv.lock +1 -1
  10. sql_code_graph-1.34.3/tests/integration/test_impact_consumer_parity.py +0 -230
  11. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/api-documenter.md +0 -0
  12. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/architect-planner.md +0 -0
  13. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/architect-reviewer.md +0 -0
  14. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/code-reviewer.md +0 -0
  15. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/developer.md +0 -0
  16. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/plan-reviewer.md +0 -0
  17. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.claude/agents/sprint-planner.md +0 -0
  18. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  21. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/workflows/benchmark.yml +0 -0
  22. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/workflows/e2e-tests.yml +0 -0
  23. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/workflows/release.yml +0 -0
  24. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.github/workflows/test.yml +0 -0
  25. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.gitignore +0 -0
  26. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.pre-commit-config.yaml +0 -0
  27. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/.sqlcgignore +0 -0
  28. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/ARCHITECTURE_REVIEW.md +0 -0
  29. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  30. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/CHANGELOG.md +0 -0
  31. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/CLAUDE.md +0 -0
  32. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/README.md +0 -0
  33. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  34. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/docs/getting-started.md +0 -0
  35. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/docs/releasing-pypi.md +0 -0
  36. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/e2e_firstuser_report.md +0 -0
  37. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/e2e_run_20260528_101413.output +0 -0
  38. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/main.py +0 -0
  39. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/WORKFLOW.md +0 -0
  40. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  41. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  42. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/pr4_transform_kinds.json +0 -0
  43. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  44. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  45. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  46. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/createkind_dwh_after.json +0 -0
  47. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/createkind_dwh_before.json +0 -0
  48. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  49. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  50. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  51. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  52. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  53. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  54. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  55. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/pr4_star_promote_after.json +0 -0
  56. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/pr4_star_promote_before.json +0 -0
  57. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/schema_comparison_with_schema.json +0 -0
  58. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/schema_comparison_without_schema.json +0 -0
  59. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  60. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  61. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  62. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/column_coverage_diagnostic.md +0 -0
  63. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/column_coverage_findings.md +0 -0
  64. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/dwh_graph_analysis.md +0 -0
  65. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  66. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/feature_acceptance_dwh.md +0 -0
  67. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  68. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/island_lever_live_verification.md +0 -0
  69. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  70. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  71. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  72. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  73. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  74. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/sprint_3.1_postmortem.md +0 -0
  75. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  76. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/blueprint.md +0 -0
  77. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  78. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/investigation_e5_e4.md +0 -0
  79. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  80. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/parse_diagnostics.md +0 -0
  81. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/parsing_errors_experiment.md +0 -0
  82. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/snowflake_en_test_suite.md +0 -0
  83. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  84. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/research/sqlcg.md +0 -0
  85. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/bundle_claude_skill.md +0 -0
  86. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  87. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/column_lineage_recall_metric.md +0 -0
  88. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  89. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  90. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/coverage_parse_failures.md +0 -0
  91. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/diff-impact-producer-file.md +0 -0
  92. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/e8_dual_emission.md +0 -0
  93. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  94. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  95. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  96. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  97. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  98. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_downstream_sink_location.md +0 -0
  99. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  100. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  101. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_firstuser_findings.md +0 -0
  102. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  103. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  104. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/gain_coverage_metrics.md +0 -0
  105. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  106. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  107. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  108. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  109. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  110. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/living_codebase_resync.md +0 -0
  111. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/mcp_server_self_healing.md +0 -0
  112. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  113. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_01.md +0 -0
  114. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  115. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_02.md +0 -0
  116. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  117. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_03.md +0 -0
  118. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_04_column_lineage.md +0 -0
  119. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  120. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_05_star_resolution.md +0 -0
  121. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  122. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  123. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  124. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  125. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  126. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  127. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  128. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  129. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  130. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  131. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  132. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/temp_table_namespacing.md +0 -0
  133. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/trust_layer.md +0 -0
  134. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/unfilled_table_impact.md +0 -0
  135. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  136. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  137. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  138. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  139. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1_1_2_bugfix.md +0 -0
  140. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  141. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  142. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/v1_2_1_bugfix.md +0 -0
  143. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/plan/sprints/version-parity-and-restart.md +0 -0
  144. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/profile.html +0 -0
  145. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/pyrightconfig.json +0 -0
  146. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/scripts/collect_parse_errors.py +0 -0
  147. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/scripts/column_coverage_check.py +0 -0
  148. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/scripts/generate_cli_docs.sh +0 -0
  149. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/__main__.py +0 -0
  150. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/__init__.py +0 -0
  151. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/__init__.py +0 -0
  152. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/catalog.py +0 -0
  153. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/db.py +0 -0
  154. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/find.py +0 -0
  155. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/gain.py +0 -0
  156. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/git.py +0 -0
  157. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/index.py +0 -0
  158. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/install.py +0 -0
  159. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/mcp.py +0 -0
  160. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/reindex.py +0 -0
  161. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/report.py +0 -0
  162. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/uninstall.py +0 -0
  163. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/commands/watch.py +0 -0
  164. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/coverage.py +0 -0
  165. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/cli/main.py +0 -0
  166. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/__init__.py +0 -0
  167. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/config.py +0 -0
  168. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/duckdb_backend.py +0 -0
  169. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/freshness.py +0 -0
  170. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/graph_db.py +0 -0
  171. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/jobs.py +0 -0
  172. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/noise_match.py +0 -0
  173. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/queries.cypher +0 -0
  174. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/schema.cypher +0 -0
  175. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/core/schema.py +0 -0
  176. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/__init__.py +0 -0
  177. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  178. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/error_classify.py +0 -0
  179. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/git_delta.py +0 -0
  180. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/indexer.py +0 -0
  181. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/pool.py +0 -0
  182. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/walker.py +0 -0
  183. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/indexer/watcher.py +0 -0
  184. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/lineage/__init__.py +0 -0
  185. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/lineage/aggregator.py +0 -0
  186. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/lineage/schema_resolver.py +0 -0
  187. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/metrics/__init__.py +0 -0
  188. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/metrics/store.py +0 -0
  189. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/__init__.py +0 -0
  190. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/ansi_parser.py +0 -0
  191. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/base.py +0 -0
  192. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  193. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/postgres_parser.py +0 -0
  194. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/registry.py +0 -0
  195. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  196. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/parsers/tsql_parser.py +0 -0
  197. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/__init__.py +0 -0
  198. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/control.py +0 -0
  199. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/exceptions.py +0 -0
  200. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/models.py +0 -0
  201. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/noise_filter.py +0 -0
  202. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/read_client.py +0 -0
  203. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/selfheal.py +0 -0
  204. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/server.py +0 -0
  205. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/skill.py +0 -0
  206. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/tools.py +0 -0
  207. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/server/writer.py +0 -0
  208. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/utils/__init__.py +0 -0
  209. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/utils/hashing.py +0 -0
  210. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/utils/ignore.py +0 -0
  211. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/src/sqlcg/utils/logging.py +0 -0
  212. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/__init__.py +0 -0
  213. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/__init__.py +0 -0
  214. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/adversarial/200_join.sql +0 -0
  215. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/adversarial/500_union.sql +0 -0
  216. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/bench_indexer.py +0 -0
  217. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/conftest.py +0 -0
  218. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  219. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  220. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  221. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  222. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  223. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  224. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  225. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  226. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  227. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  228. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q01.sql +0 -0
  229. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q02.sql +0 -0
  230. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q03.sql +0 -0
  231. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q04.sql +0 -0
  232. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/benchmarks/tpch/q05.sql +0 -0
  233. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/conftest.py +0 -0
  234. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/__init__.py +0 -0
  235. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/conftest.py +0 -0
  236. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  237. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_airbnb_e2e.py +0 -0
  238. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_cli_index.py +0 -0
  239. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  240. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_git_hook_install.py +0 -0
  241. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_golden_lineage.py +0 -0
  242. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_mcp_lifecycle.py +0 -0
  243. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_mcp_tools.py +0 -0
  244. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  245. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  246. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_selfheal_e2e.py +0 -0
  247. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_star_resolution_e2e.py +0 -0
  248. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/e2e/test_watch.py +0 -0
  249. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  250. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  251. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  252. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  253. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  254. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  255. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  256. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  257. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_listings.sql +0 -0
  258. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  259. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/bigquery/.gitkeep +0 -0
  260. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  261. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  262. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  263. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  264. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/base_tables.sql +0 -0
  265. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/reports.sql +0 -0
  266. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/snowflake/views.sql +0 -0
  267. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  268. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  269. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  270. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  271. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/base_tables.sql +0 -0
  272. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/reports.sql +0 -0
  273. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/fixtures/synthetic/views.sql +0 -0
  274. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/__init__.py +0 -0
  275. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/snowflake/__init__.py +0 -0
  276. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/snowflake/test_insert_select.py +0 -0
  277. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  278. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_T34_presentation_segregation.py +0 -0
  279. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_T35_external_consumers.py +0 -0
  280. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_analyze_case_fold.py +0 -0
  281. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_anchor_tools.py +0 -0
  282. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_backfill_impact_consistency.py +0 -0
  283. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  284. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_bulk_upsert.py +0 -0
  285. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_case_split_seed_regression.py +0 -0
  286. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  287. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_catalog_load_integration.py +0 -0
  288. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  289. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_column_coverage_patterns.py +0 -0
  290. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_column_lineage_e2e.py +0 -0
  291. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_coverage_metrics_integration.py +0 -0
  292. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cross_file_lineage.py +0 -0
  293. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  294. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cte_recall_guard.py +0 -0
  295. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  296. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_cte_source_node_invariant.py +0 -0
  297. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_dialect_auto_resolution.py +0 -0
  298. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_dialect_matrix.py +0 -0
  299. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_duckdb_parity.py +0 -0
  300. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  301. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  302. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  303. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_freshness_mcp.py +0 -0
  304. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_gating_join_retrofit.py +0 -0
  305. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  306. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_identity_counters_integration.py +0 -0
  307. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_index_degraded_files_metric.py +0 -0
  308. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  309. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_indexer_batching.py +0 -0
  310. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_indexer_commits.py +0 -0
  311. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_indexer_to_graph.py +0 -0
  312. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  313. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_join_col_resolution.py +0 -0
  314. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  315. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_live_anchors.py +0 -0
  316. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_mvcc_rebuild.py +0 -0
  317. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
  318. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_non_table_create_kind_in_graph.py +0 -0
  319. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_parse_diagnostics.py +0 -0
  320. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_pr1_confidence_reason.py +0 -0
  321. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_pr2_source_location.py +0 -0
  322. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_pr3_kind_tagging.py +0 -0
  323. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_pr_impact_integration.py +0 -0
  324. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_qualify_failed_persist.py +0 -0
  325. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_read_via_server.py +0 -0
  326. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_readonly_under_lock.py +0 -0
  327. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_reindex_via_server.py +0 -0
  328. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  329. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  330. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_resync.py +0 -0
  331. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_completeness.py +0 -0
  332. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  333. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_selects_from_subscope_source.py +0 -0
  334. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_single_writer_queue.py +0 -0
  335. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_skip_counts_integration.py +0 -0
  336. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_star_promote_temp_columns.py +0 -0
  337. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_star_resolution.py +0 -0
  338. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_temp_table_lineage.py +0 -0
  339. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_temp_table_namespacing.py +0 -0
  340. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  341. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  342. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_usage_derived_catalog.py +0 -0
  343. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  344. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_user_surface_recall_guard.py +0 -0
  345. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_v141_surface_guards.py +0 -0
  346. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  347. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_view_kind_in_graph.py +0 -0
  348. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/integration/test_write_memory_ceiling.py +0 -0
  349. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/perf/__init__.py +0 -0
  350. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/perf/test_perf.py +0 -0
  351. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E10/__init__.py +0 -0
  352. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E11/__init__.py +0 -0
  353. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E12/__init__.py +0 -0
  354. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E12/e12_json_path.sql +0 -0
  355. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  356. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E12/test_e12.py +0 -0
  357. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E13/__init__.py +0 -0
  358. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E14/__init__.py +0 -0
  359. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E15/__init__.py +0 -0
  360. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E16/__init__.py +0 -0
  361. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E16/e16_merge.sql +0 -0
  362. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  363. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E16/test_e16.py +0 -0
  364. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E17/__init__.py +0 -0
  365. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E18/__init__.py +0 -0
  366. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_decode.sql +0 -0
  367. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  368. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  369. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E18/test_e18.py +0 -0
  370. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E19/__init__.py +0 -0
  371. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E2/__init__.py +0 -0
  372. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  373. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  374. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  375. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E2/test_e2.py +0 -0
  376. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E20/__init__.py +0 -0
  377. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E21/__init__.py +0 -0
  378. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  379. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  380. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E21/test_e21.py +0 -0
  381. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E22/__init__.py +0 -0
  382. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E23/__init__.py +0 -0
  383. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  384. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  385. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E23/test_e23.py +0 -0
  386. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E24/__init__.py +0 -0
  387. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E25/__init__.py +0 -0
  388. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  389. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E25/e25_two_part.sql +0 -0
  390. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E25/test_e25.py +0 -0
  391. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  392. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E26/__init__.py +0 -0
  393. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E27/__init__.py +0 -0
  394. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  395. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E27/e27_udf.sql +0 -0
  396. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E27/test_e27.py +0 -0
  397. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E28/__init__.py +0 -0
  398. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E29/__init__.py +0 -0
  399. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E3/__init__.py +0 -0
  400. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  401. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  402. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  403. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E3/test_e3.py +0 -0
  404. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E30/__init__.py +0 -0
  405. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E31/__init__.py +0 -0
  406. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E32/__init__.py +0 -0
  407. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E33/__init__.py +0 -0
  408. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E34/__init__.py +0 -0
  409. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E35/__init__.py +0 -0
  410. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E36/__init__.py +0 -0
  411. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  412. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  413. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E36/test_e36.py +0 -0
  414. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  415. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E37/__init__.py +0 -0
  416. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E38/__init__.py +0 -0
  417. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/__init__.py +0 -0
  418. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  419. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  420. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  421. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  422. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E4/test_e4.py +0 -0
  423. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/__init__.py +0 -0
  424. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  425. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  426. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  427. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/test_e5.py +0 -0
  428. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  429. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E8/__init__.py +0 -0
  430. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  431. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  432. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E8/e8_uuid.sql +0 -0
  433. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E8/test_e8.py +0 -0
  434. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E9/__init__.py +0 -0
  435. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/__init__.py +0 -0
  436. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  437. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  438. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  439. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  440. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/__init__.py +0 -0
  441. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  442. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  443. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  444. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  445. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  446. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/README.md +0 -0
  447. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/__init__.py +0 -0
  448. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/__init__.py +0 -0
  449. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  450. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  451. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  452. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/fixture_source.sql +0 -0
  453. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  454. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  455. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/conftest.py +0 -0
  456. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/snowflake/test_plan_review_gates.py +0 -0
  457. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/__init__.py +0 -0
  458. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/snowflake/__init__.py +0 -0
  459. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  460. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  461. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  462. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  463. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_F2_install_skill.py +0 -0
  464. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_F2_skill_render.py +0 -0
  465. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_F2_uninstall_skill.py +0 -0
  466. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_T09_01_qualify_once.py +0 -0
  467. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  468. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  469. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  470. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_T35_config_external_consumers.py +0 -0
  471. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_aggregator.py +0 -0
  472. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_aggregator_skip.py +0 -0
  473. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_analyze_case_fold.py +0 -0
  474. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_base_parser.py +0 -0
  475. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_branch_monitor.py +0 -0
  476. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  477. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_canonical_target_resolution.py +0 -0
  478. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_catalog_csv_parsing.py +0 -0
  479. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_catalog_missing_warning.py +0 -0
  480. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_classify_non_table_create_kind.py +0 -0
  481. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_cli.py +0 -0
  482. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  483. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_cli_help.py +0 -0
  484. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  485. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_closure_depth.py +0 -0
  486. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_column_lineage_wiring.py +0 -0
  487. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_config.py +0 -0
  488. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_coverage_metrics.py +0 -0
  489. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_cte_key_namespacing.py +0 -0
  490. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_cte_source_gap_metric.py +0 -0
  491. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_data_models.py +0 -0
  492. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_db_info.py +0 -0
  493. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_db_info_coverage.py +0 -0
  494. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  495. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_doc_links.py +0 -0
  496. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  497. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_dominant_cause.py +0 -0
  498. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_duckdb_backend.py +0 -0
  499. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_duckdb_backend_shared.py +0 -0
  500. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  501. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_e8_dual_emission.py +0 -0
  502. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  503. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_empty_propagation_unit.py +0 -0
  504. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_extract_select_output_columns.py +0 -0
  505. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_file_ignore_defaults.py +0 -0
  506. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_find_cmd.py +0 -0
  507. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_firstuser_findings.py +0 -0
  508. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_freshness_helper.py +0 -0
  509. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_gain_coverage.py +0 -0
  510. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_gain_ratio.py +0 -0
  511. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  512. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_git_delta.py +0 -0
  513. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_git_hooks.py +0 -0
  514. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_git_hooks_notify.py +0 -0
  515. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_graph_backend.py +0 -0
  516. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_graph_completeness_invariant.py +0 -0
  517. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_hard_kill_pool.py +0 -0
  518. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  519. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_hook_reindex_detach.py +0 -0
  520. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_hygiene_config_warning.py +0 -0
  521. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_identity_counters.py +0 -0
  522. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_include_working_tree.py +0 -0
  523. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_index_cmd.py +0 -0
  524. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_index_filter_config.py +0 -0
  525. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_index_flags.py +0 -0
  526. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_index_progress.py +0 -0
  527. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  528. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_indexer_progress.py +0 -0
  529. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_indexer_quality.py +0 -0
  530. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_install.py +0 -0
  531. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_install_message.py +0 -0
  532. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  533. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_jobs.py +0 -0
  534. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_join_col_resolve_marker.py +0 -0
  535. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_judgement.py +0 -0
  536. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_lineage_conversion.py +0 -0
  537. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_literal_column_skip.py +0 -0
  538. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_mcp_best_practices.py +0 -0
  539. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_mcp_control.py +0 -0
  540. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  541. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_metrics.py +0 -0
  542. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_noise_filter.py +0 -0
  543. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_normalize_keys.py +0 -0
  544. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_parse_failed_classification.py +0 -0
  545. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  546. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_parse_quality.py +0 -0
  547. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_parser.py +0 -0
  548. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_perf_scaling_guard.py +0 -0
  549. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_pr07_observability.py +0 -0
  550. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  551. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_pr_impact_unit.py +0 -0
  552. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_qualify_failed_unit.py +0 -0
  553. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_queries_loader.py +0 -0
  554. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_read_client.py +0 -0
  555. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  556. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  557. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  558. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  559. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_schema_resolver.py +0 -0
  560. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  561. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_detector.py +0 -0
  562. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  563. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_reexec.py +0 -0
  564. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_selfheal_watcher.py +0 -0
  565. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_server.py +0 -0
  566. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_skip_counts_persistence.py +0 -0
  567. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  568. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  569. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_star_resolution_unit.py +0 -0
  570. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_star_schema_unit.py +0 -0
  571. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_submit_feedback.py +0 -0
  572. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_subprocess_isolate.py +0 -0
  573. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  574. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_t03_ddl_skip.py +0 -0
  575. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_temp_table_namespacing.py +0 -0
  576. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_timeout_cancel.py +0 -0
  577. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_tool_version_stamp.py +0 -0
  578. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_tools_hints.py +0 -0
  579. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_tools_warnings.py +0 -0
  580. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_transform_kind_classification.py +0 -0
  581. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_uninstall.py +0 -0
  582. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  583. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_unqualified_fallback.py +0 -0
  584. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_upsert_batch_invariant.py +0 -0
  585. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_use_schema_session_context.py +0 -0
  586. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_version_parity.py +0 -0
  587. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_view_classification.py +0 -0
  588. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_walker.py +0 -0
  589. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_watcher.py +0 -0
  590. {sql_code_graph-1.34.3 → sql_code_graph-1.34.4}/tests/unit/test_worker_error_classification.py +0 -0
  591. {sql_code_graph-1.34.3 → 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
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 |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sql-code-graph"
7
- version = "1.34.3"
7
+ version = "1.34.4"
8
8
  description = "SQL code graph analyzer and lineage tracer"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,5 +1,5 @@
1
1
  """SQL Code Graph - SQL lineage and dependency analysis tool."""
2
2
 
3
- __version__ = "1.34.3"
3
+ __version__ = "1.34.4"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -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 GET_TABLE_EXTERNAL_CONSUMERS_QUERY
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
- results = run_read_routed(
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 = ?
@@ -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()
@@ -2844,7 +2844,7 @@ wheels = [
2844
2844
 
2845
2845
  [[package]]
2846
2846
  name = "sql-code-graph"
2847
- version = "1.34.3"
2847
+ version = "1.34.4"
2848
2848
  source = { editable = "." }
2849
2849
  dependencies = [
2850
2850
  { name = "duckdb" },