sql-code-graph 1.37.1__tar.gz → 1.38.0__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 (641) hide show
  1. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/PKG-INFO +1 -1
  2. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/docs/cli.md +8 -0
  3. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/lineage_gold_regression_and_temp_collapse.md +24 -0
  4. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/pyproject.toml +1 -1
  5. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/__init__.py +1 -1
  6. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/analyze.py +42 -0
  7. sql_code_graph-1.38.0/src/sqlcg/lineage/temp_collapse.py +252 -0
  8. sql_code_graph-1.38.0/tests/integration/test_temp_collapse_primitive.py +379 -0
  9. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/uv.lock +1 -1
  10. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/api-documenter.md +0 -0
  11. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/architect-planner.md +0 -0
  12. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/architect-reviewer.md +0 -0
  13. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/code-reviewer.md +0 -0
  14. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/developer.md +0 -0
  15. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/plan-reviewer.md +0 -0
  16. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.claude/agents/sprint-planner.md +0 -0
  17. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  18. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  20. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/workflows/benchmark.yml +0 -0
  21. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/workflows/e2e-tests.yml +0 -0
  22. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/workflows/release.yml +0 -0
  23. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.github/workflows/test.yml +0 -0
  24. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.gitignore +0 -0
  25. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.pre-commit-config.yaml +0 -0
  26. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/.sqlcgignore +0 -0
  27. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/ARCHITECTURE_REVIEW.md +0 -0
  28. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  29. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/CHANGELOG.md +0 -0
  30. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/CLAUDE.md +0 -0
  31. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/README.md +0 -0
  32. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  33. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/docs/getting-started.md +0 -0
  34. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/docs/releasing-pypi.md +0 -0
  35. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/e2e_firstuser_report.md +0 -0
  36. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/e2e_run_20260528_101413.output +0 -0
  37. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/main.py +0 -0
  38. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/WORKFLOW.md +0 -0
  39. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  40. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  41. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/pr4_transform_kinds.json +0 -0
  42. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  43. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  44. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  45. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/createkind_dwh_after.json +0 -0
  46. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/createkind_dwh_before.json +0 -0
  47. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  48. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  49. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  50. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  51. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  52. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_1.36.2_f6a335a.json +0 -0
  53. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/gain_drop_alter_phantom_baseline_v1361.json +0 -0
  54. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_acceptance.md +0 -0
  55. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_after_v1.36.0.json +0 -0
  56. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_before_v1.35.3.json +0 -0
  57. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  58. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  59. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/lineage_gold_set_synthetic.json +0 -0
  60. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr4_star_promote_after.json +0 -0
  61. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr4_star_promote_before.json +0 -0
  62. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr_b_phantom_after.json +0 -0
  63. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr_b_phantom_before.json +0 -0
  64. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr_c_merge_after.json +0 -0
  65. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/pr_c_merge_before.json +0 -0
  66. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/schema_comparison_with_schema.json +0 -0
  67. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/schema_comparison_without_schema.json +0 -0
  68. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  69. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  70. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  71. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/column_coverage_diagnostic.md +0 -0
  72. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/column_coverage_findings.md +0 -0
  73. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/dwh_graph_analysis.md +0 -0
  74. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  75. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/feature_acceptance_dwh.md +0 -0
  76. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  77. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/island_lever_live_verification.md +0 -0
  78. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  79. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  80. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  81. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  82. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  83. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/sprint_3.1_postmortem.md +0 -0
  84. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  85. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/blueprint.md +0 -0
  86. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  87. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/investigation_e5_e4.md +0 -0
  88. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  89. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/parse_diagnostics.md +0 -0
  90. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/parsing_errors_experiment.md +0 -0
  91. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/snowflake_en_test_suite.md +0 -0
  92. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/snowflake_oracle_groundtruth_prep.md +0 -0
  93. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  94. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/research/sqlcg.md +0 -0
  95. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/bundle_claude_skill.md +0 -0
  96. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  97. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/column_lineage_recall_metric.md +0 -0
  98. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  99. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  100. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/coverage_parse_failures.md +0 -0
  101. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/diff-impact-producer-file.md +0 -0
  102. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/e8_dual_emission.md +0 -0
  103. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  104. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  105. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  106. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/feature_generic_var_name_resolution.md +0 -0
  107. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  108. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  109. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_downstream_sink_location.md +0 -0
  110. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_drop_alter_phantom_source_node.md +0 -0
  111. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  112. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  113. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_firstuser_findings.md +0 -0
  114. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  115. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  116. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/gain_coverage_metrics.md +0 -0
  117. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  118. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  119. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  120. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  121. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  122. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/living_codebase_resync.md +0 -0
  123. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/mcp_server_self_healing.md +0 -0
  124. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  125. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_01.md +0 -0
  126. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  127. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_02.md +0 -0
  128. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  129. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_03.md +0 -0
  130. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_04_column_lineage.md +0 -0
  131. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  132. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_05_star_resolution.md +0 -0
  133. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  134. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  135. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  136. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  137. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  138. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  139. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  140. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  141. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  142. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  143. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  144. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/temp_table_namespacing.md +0 -0
  145. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/trust_layer.md +0 -0
  146. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/unfilled_table_impact.md +0 -0
  147. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  148. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  149. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  150. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  151. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1_1_2_bugfix.md +0 -0
  152. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  153. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  154. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/v1_2_1_bugfix.md +0 -0
  155. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/version-parity-and-restart.md +0 -0
  156. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/plan/sprints/viz_usability_neighborhood_highlight.md +0 -0
  157. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/profile.html +0 -0
  158. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/pyrightconfig.json +0 -0
  159. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/scripts/collect_parse_errors.py +0 -0
  160. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/scripts/column_coverage_check.py +0 -0
  161. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/scripts/generate_cli_docs.sh +0 -0
  162. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/__main__.py +0 -0
  163. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/__init__.py +0 -0
  164. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/__init__.py +0 -0
  165. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/catalog.py +0 -0
  166. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/db.py +0 -0
  167. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/find.py +0 -0
  168. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/gain.py +0 -0
  169. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/git.py +0 -0
  170. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/index.py +0 -0
  171. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/install.py +0 -0
  172. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/mcp.py +0 -0
  173. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/reindex.py +0 -0
  174. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/report.py +0 -0
  175. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/uninstall.py +0 -0
  176. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/viz.py +0 -0
  177. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/watch.py +0 -0
  178. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/coverage.py +0 -0
  179. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/cli/main.py +0 -0
  180. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/__init__.py +0 -0
  181. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/config.py +0 -0
  182. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/duckdb_backend.py +0 -0
  183. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/freshness.py +0 -0
  184. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/graph_db.py +0 -0
  185. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/jobs.py +0 -0
  186. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/noise_match.py +0 -0
  187. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.cypher +0 -0
  188. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.py +0 -0
  189. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.sql +0 -0
  190. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/schema.cypher +0 -0
  191. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/core/schema.py +0 -0
  192. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/__init__.py +0 -0
  193. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  194. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/error_classify.py +0 -0
  195. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/git_delta.py +0 -0
  196. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/indexer.py +0 -0
  197. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/pool.py +0 -0
  198. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/walker.py +0 -0
  199. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/indexer/watcher.py +0 -0
  200. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/lineage/__init__.py +0 -0
  201. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/lineage/aggregator.py +0 -0
  202. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/lineage/schema_resolver.py +0 -0
  203. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/metrics/__init__.py +0 -0
  204. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/metrics/store.py +0 -0
  205. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/__init__.py +0 -0
  206. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/ansi_parser.py +0 -0
  207. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/base.py +0 -0
  208. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  209. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/dynamic_name.py +0 -0
  210. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/postgres_parser.py +0 -0
  211. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/registry.py +0 -0
  212. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  213. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/parsers/tsql_parser.py +0 -0
  214. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/__init__.py +0 -0
  215. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/control.py +0 -0
  216. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/exceptions.py +0 -0
  217. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/models.py +0 -0
  218. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/noise_filter.py +0 -0
  219. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/read_client.py +0 -0
  220. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/selfheal.py +0 -0
  221. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/server.py +0 -0
  222. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/skill.py +0 -0
  223. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/tools.py +0 -0
  224. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/server/writer.py +0 -0
  225. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/utils/__init__.py +0 -0
  226. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/utils/hashing.py +0 -0
  227. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/utils/ignore.py +0 -0
  228. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/utils/logging.py +0 -0
  229. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/__init__.py +0 -0
  230. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/assets/force-graph.min.js +0 -0
  231. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/assets/template.html +0 -0
  232. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/data.py +0 -0
  233. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/render.py +0 -0
  234. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/src/sqlcg/viz/tags.py +0 -0
  235. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/__init__.py +0 -0
  236. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/__init__.py +0 -0
  237. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/adversarial/200_join.sql +0 -0
  238. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/adversarial/500_union.sql +0 -0
  239. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/bench_indexer.py +0 -0
  240. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/conftest.py +0 -0
  241. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  242. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  243. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  244. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  245. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  246. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  247. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  248. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  249. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  250. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  251. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q01.sql +0 -0
  252. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q02.sql +0 -0
  253. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q03.sql +0 -0
  254. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q04.sql +0 -0
  255. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q05.sql +0 -0
  256. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/conftest.py +0 -0
  257. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/__init__.py +0 -0
  258. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/conftest.py +0 -0
  259. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  260. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_airbnb_e2e.py +0 -0
  261. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_cli_index.py +0 -0
  262. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  263. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_git_hook_install.py +0 -0
  264. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_golden_lineage.py +0 -0
  265. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_mcp_lifecycle.py +0 -0
  266. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_mcp_tools.py +0 -0
  267. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  268. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  269. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_selfheal_e2e.py +0 -0
  270. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_star_resolution_e2e.py +0 -0
  271. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_viz_cli_e2e.py +0 -0
  272. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/e2e/test_watch.py +0 -0
  273. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  274. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  275. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  276. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  277. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  278. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  279. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  280. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  281. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_listings.sql +0 -0
  282. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  283. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/bigquery/.gitkeep +0 -0
  284. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  285. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/f_brand.sql +0 -0
  286. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/f_compo.sql +0 -0
  287. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/f_fx.sql +0 -0
  288. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/f_loc.sql +0 -0
  289. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/f_orders.sql +0 -0
  290. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/gmdf/f_freight_cost.sql +0 -0
  291. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/gmdf/f_freight_ktn.sql +0 -0
  292. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/int/gmdf/f_freight_misc.sql +0 -0
  293. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/template/dim_person_temp.sql +0 -0
  294. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/template/dim_staff.sql +0 -0
  295. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/gold_set/template/f_compet_article.sql +0 -0
  296. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  297. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  298. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  299. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/base_tables.sql +0 -0
  300. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/reports.sql +0 -0
  301. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/views.sql +0 -0
  302. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  303. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  304. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  305. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  306. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/base_tables.sql +0 -0
  307. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/reports.sql +0 -0
  308. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/views.sql +0 -0
  309. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/__init__.py +0 -0
  310. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/snowflake/__init__.py +0 -0
  311. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_identifier_var_sink_resolution_integration.py +0 -0
  312. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_insert_select.py +0 -0
  313. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  314. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_T34_presentation_segregation.py +0 -0
  315. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_T35_external_consumers.py +0 -0
  316. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_analyze_case_fold.py +0 -0
  317. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_anchor_tools.py +0 -0
  318. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_backfill_impact_consistency.py +0 -0
  319. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  320. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_bulk_upsert.py +0 -0
  321. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_case_split_seed_regression.py +0 -0
  322. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  323. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_catalog_load_integration.py +0 -0
  324. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  325. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_column_coverage_patterns.py +0 -0
  326. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_column_lineage_e2e.py +0 -0
  327. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_coverage_metrics_integration.py +0 -0
  328. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cross_file_lineage.py +0 -0
  329. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  330. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cte_recall_guard.py +0 -0
  331. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  332. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_cte_source_node_invariant.py +0 -0
  333. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_dialect_auto_resolution.py +0 -0
  334. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_dialect_matrix.py +0 -0
  335. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_duckdb_parity.py +0 -0
  336. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  337. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  338. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  339. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_freshness_mcp.py +0 -0
  340. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_gating_join_retrofit.py +0 -0
  341. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  342. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_identity_counters_integration.py +0 -0
  343. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_impact_consumer_parity.py +0 -0
  344. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_incremental_reindex_parity.py +0 -0
  345. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_index_degraded_files_metric.py +0 -0
  346. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  347. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_indexer_batching.py +0 -0
  348. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_indexer_commits.py +0 -0
  349. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_indexer_to_graph.py +0 -0
  350. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  351. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_join_col_resolution.py +0 -0
  352. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  353. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_lineage_gold_set.py +0 -0
  354. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_live_anchors.py +0 -0
  355. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_mvcc_rebuild.py +0 -0
  356. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
  357. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_non_table_create_kind_in_graph.py +0 -0
  358. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_parse_diagnostics.py +0 -0
  359. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_phantom_drop_alter_node.py +0 -0
  360. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_phantom_non_table_create_node.py +0 -0
  361. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_pr1_confidence_reason.py +0 -0
  362. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_pr2_source_location.py +0 -0
  363. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_pr3_kind_tagging.py +0 -0
  364. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_pr_impact_integration.py +0 -0
  365. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_qualify_failed_persist.py +0 -0
  366. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_read_via_server.py +0 -0
  367. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_readonly_under_lock.py +0 -0
  368. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_reindex_via_server.py +0 -0
  369. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  370. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  371. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_resync.py +0 -0
  372. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_completeness.py +0 -0
  373. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  374. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_subscope_source.py +0 -0
  375. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_single_writer_queue.py +0 -0
  376. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_skip_counts_integration.py +0 -0
  377. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_star_promote_temp_columns.py +0 -0
  378. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_star_resolution.py +0 -0
  379. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_temp_table_lineage.py +0 -0
  380. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_temp_table_namespacing.py +0 -0
  381. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  382. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  383. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_usage_derived_catalog.py +0 -0
  384. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  385. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_user_surface_recall_guard.py +0 -0
  386. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_v141_surface_guards.py +0 -0
  387. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  388. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_view_kind_in_graph.py +0 -0
  389. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_viz_data_build.py +0 -0
  390. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/integration/test_write_memory_ceiling.py +0 -0
  391. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/perf/__init__.py +0 -0
  392. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/perf/test_perf.py +0 -0
  393. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E10/__init__.py +0 -0
  394. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E11/__init__.py +0 -0
  395. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E12/__init__.py +0 -0
  396. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E12/e12_json_path.sql +0 -0
  397. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  398. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E12/test_e12.py +0 -0
  399. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E13/__init__.py +0 -0
  400. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E14/__init__.py +0 -0
  401. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E15/__init__.py +0 -0
  402. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E16/__init__.py +0 -0
  403. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E16/e16_merge.sql +0 -0
  404. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  405. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E16/test_e16.py +0 -0
  406. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E17/__init__.py +0 -0
  407. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E18/__init__.py +0 -0
  408. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_decode.sql +0 -0
  409. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  410. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  411. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E18/test_e18.py +0 -0
  412. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E19/__init__.py +0 -0
  413. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E2/__init__.py +0 -0
  414. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  415. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  416. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  417. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E2/test_e2.py +0 -0
  418. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E20/__init__.py +0 -0
  419. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E21/__init__.py +0 -0
  420. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  421. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  422. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E21/test_e21.py +0 -0
  423. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E22/__init__.py +0 -0
  424. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E23/__init__.py +0 -0
  425. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  426. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  427. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E23/test_e23.py +0 -0
  428. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E24/__init__.py +0 -0
  429. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E25/__init__.py +0 -0
  430. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  431. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E25/e25_two_part.sql +0 -0
  432. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E25/test_e25.py +0 -0
  433. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  434. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E26/__init__.py +0 -0
  435. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E27/__init__.py +0 -0
  436. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  437. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E27/e27_udf.sql +0 -0
  438. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E27/test_e27.py +0 -0
  439. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E28/__init__.py +0 -0
  440. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E29/__init__.py +0 -0
  441. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E3/__init__.py +0 -0
  442. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  443. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  444. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  445. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E3/test_e3.py +0 -0
  446. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E30/__init__.py +0 -0
  447. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E31/__init__.py +0 -0
  448. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E32/__init__.py +0 -0
  449. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E33/__init__.py +0 -0
  450. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E34/__init__.py +0 -0
  451. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E35/__init__.py +0 -0
  452. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E36/__init__.py +0 -0
  453. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  454. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  455. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E36/test_e36.py +0 -0
  456. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  457. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E37/__init__.py +0 -0
  458. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E38/__init__.py +0 -0
  459. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/__init__.py +0 -0
  460. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  461. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  462. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  463. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  464. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E4/test_e4.py +0 -0
  465. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/__init__.py +0 -0
  466. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  467. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  468. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  469. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/test_e5.py +0 -0
  470. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  471. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E8/__init__.py +0 -0
  472. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  473. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  474. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_uuid.sql +0 -0
  475. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E8/test_e8.py +0 -0
  476. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E9/__init__.py +0 -0
  477. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/__init__.py +0 -0
  478. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  479. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  480. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  481. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  482. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/__init__.py +0 -0
  483. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  484. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  485. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  486. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  487. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  488. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/README.md +0 -0
  489. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/__init__.py +0 -0
  490. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/__init__.py +0 -0
  491. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  492. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  493. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  494. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_source.sql +0 -0
  495. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  496. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  497. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/conftest.py +0 -0
  498. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/snowflake/test_plan_review_gates.py +0 -0
  499. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/__init__.py +0 -0
  500. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/snowflake/__init__.py +0 -0
  501. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  502. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  503. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  504. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  505. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_F2_install_skill.py +0 -0
  506. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_F2_skill_render.py +0 -0
  507. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_F2_uninstall_skill.py +0 -0
  508. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_T09_01_qualify_once.py +0 -0
  509. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  510. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  511. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  512. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_T35_config_external_consumers.py +0 -0
  513. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_aggregator.py +0 -0
  514. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_aggregator_skip.py +0 -0
  515. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_analyze_case_fold.py +0 -0
  516. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_base_parser.py +0 -0
  517. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_branch_monitor.py +0 -0
  518. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  519. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_canonical_target_resolution.py +0 -0
  520. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_catalog_csv_parsing.py +0 -0
  521. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_catalog_missing_warning.py +0 -0
  522. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_classify_non_table_create_kind.py +0 -0
  523. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_cli.py +0 -0
  524. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  525. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_cli_help.py +0 -0
  526. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  527. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_closure_depth.py +0 -0
  528. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_column_lineage_wiring.py +0 -0
  529. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_config.py +0 -0
  530. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_coverage_metrics.py +0 -0
  531. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_cte_key_namespacing.py +0 -0
  532. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_cte_source_gap_metric.py +0 -0
  533. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_data_models.py +0 -0
  534. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_db_info.py +0 -0
  535. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_db_info_coverage.py +0 -0
  536. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  537. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_doc_links.py +0 -0
  538. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  539. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_dominant_cause.py +0 -0
  540. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_duckdb_backend.py +0 -0
  541. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_duckdb_backend_shared.py +0 -0
  542. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_dynamic_name_resolution.py +0 -0
  543. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  544. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_e8_dual_emission.py +0 -0
  545. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  546. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_empty_propagation_unit.py +0 -0
  547. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_extract_select_output_columns.py +0 -0
  548. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_file_ignore_defaults.py +0 -0
  549. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_find_cmd.py +0 -0
  550. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_firstuser_findings.py +0 -0
  551. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_freshness_helper.py +0 -0
  552. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_gain_coverage.py +0 -0
  553. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_gain_ratio.py +0 -0
  554. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  555. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_git_delta.py +0 -0
  556. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_git_hooks.py +0 -0
  557. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_git_hooks_notify.py +0 -0
  558. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_graph_backend.py +0 -0
  559. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_graph_completeness_invariant.py +0 -0
  560. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_hard_kill_pool.py +0 -0
  561. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  562. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_hook_reindex_detach.py +0 -0
  563. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_hygiene_config_warning.py +0 -0
  564. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_identifier_var_sink_resolution.py +0 -0
  565. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_identity_counters.py +0 -0
  566. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_include_working_tree.py +0 -0
  567. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_index_cmd.py +0 -0
  568. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_index_filter_config.py +0 -0
  569. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_index_flags.py +0 -0
  570. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_index_progress.py +0 -0
  571. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  572. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_indexer_progress.py +0 -0
  573. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_indexer_quality.py +0 -0
  574. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_install.py +0 -0
  575. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_install_message.py +0 -0
  576. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  577. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_jobs.py +0 -0
  578. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_join_col_resolve_marker.py +0 -0
  579. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_judgement.py +0 -0
  580. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_lineage_conversion.py +0 -0
  581. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_literal_column_skip.py +0 -0
  582. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_mcp_best_practices.py +0 -0
  583. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_mcp_control.py +0 -0
  584. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  585. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_merge_column_lineage.py +0 -0
  586. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_metrics.py +0 -0
  587. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_noise_filter.py +0 -0
  588. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_normalize_keys.py +0 -0
  589. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_parse_failed_classification.py +0 -0
  590. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  591. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_parse_quality.py +0 -0
  592. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_parser.py +0 -0
  593. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_perf_scaling_guard.py +0 -0
  594. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_phantom_drop_alter_source.py +0 -0
  595. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_phantom_non_table_create_source.py +0 -0
  596. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_pr07_observability.py +0 -0
  597. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  598. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_pr_impact_unit.py +0 -0
  599. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_qualify_failed_unit.py +0 -0
  600. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_queries_loader.py +0 -0
  601. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_read_client.py +0 -0
  602. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  603. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  604. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  605. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  606. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_schema_resolver.py +0 -0
  607. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  608. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_detector.py +0 -0
  609. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  610. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_reexec.py +0 -0
  611. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_watcher.py +0 -0
  612. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_server.py +0 -0
  613. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_skip_counts_persistence.py +0 -0
  614. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  615. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  616. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_star_resolution_unit.py +0 -0
  617. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_star_schema_unit.py +0 -0
  618. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_submit_feedback.py +0 -0
  619. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_subprocess_isolate.py +0 -0
  620. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  621. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_t03_ddl_skip.py +0 -0
  622. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_temp_table_namespacing.py +0 -0
  623. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_timeout_cancel.py +0 -0
  624. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_tool_version_stamp.py +0 -0
  625. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_tools_hints.py +0 -0
  626. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_tools_warnings.py +0 -0
  627. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_transform_kind_classification.py +0 -0
  628. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_uninstall.py +0 -0
  629. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  630. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_unqualified_fallback.py +0 -0
  631. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_upsert_batch_invariant.py +0 -0
  632. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_use_schema_session_context.py +0 -0
  633. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_version_parity.py +0 -0
  634. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_view_classification.py +0 -0
  635. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_viz_config_schemas.py +0 -0
  636. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_viz_facets.py +0 -0
  637. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_viz_render_self_contained.py +0 -0
  638. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_walker.py +0 -0
  639. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_watcher.py +0 -0
  640. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/tests/unit/test_worker_error_classification.py +0 -0
  641. {sql_code_graph-1.37.1 → sql_code_graph-1.38.0}/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.37.1
3
+ Version: 1.38.0
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
@@ -473,11 +473,19 @@ and consumers that read the table only via COLUMN_LINEAGE / STAR_SOURCE
473
473
  one-hop consumer completeness ``find_table_usages`` already has. Stays
474
474
  one-hop (NOT transitive — that is ``downstream``'s job).
475
475
 
476
+ With ``--through-temps`` the consumer set is augmented with the downstream
477
+ **temp-collapsed** closure: physical tables reachable from this table only
478
+ by threading through ``kind IN ('cte','derived','temp')`` intermediates,
479
+ computed from the structural COLUMN_LINEAGE hops (read-only; it never
480
+ mutates the graph). This recovers consumers — e.g. the star-into-temp
481
+ final target — that the one-hop default and TEMP_INLINE do not surface.
482
+
476
483
  ### Options
477
484
 
478
485
  | Option | Type | Required | Repeatable | Default | Description |
479
486
  | --- | --- | --- | --- | --- | --- |
480
487
  | --raw | BOOLEAN | No | No | False | Disable noise filtering on results |
488
+ | --through-temps | BOOLEAN | No | No | False | Also report consumers reachable only THROUGH a temp/cte/derived intermediate (table-grain temp-collapsed closure). Off by default — the default impact stays one-hop and does not thread temps. |
481
489
 
482
490
  ## `sqlcg analyze failures`
483
491
 
@@ -382,6 +382,30 @@ fallback). Grep-confirm the call site lands in this PR.
382
382
 
383
383
  ---
384
384
 
385
+ ### Deviations
386
+
387
+ #### Deviation 1: intermediate node = `kind IN ('cte','derived','temp')` AND namespaced (`::`)
388
+ - **Reason**: The plan said thread *through* nodes whose `kind IN ('cte','derived','temp')`
389
+ and terminate at `kind IN ('table','external')`/unknown. Live indexing of the PR-1
390
+ synthetic fixtures showed the FINAL physical targets — the gold-set endpoints
391
+ `mart.dim_person`, `mart.f_orders`, `stgmart.f_compet_article` — are stamped
392
+ `kind='derived'` (they are INSERT/CTAS targets), NOT `'table'`. Threading through every
393
+ `derived` node would walk past the gold-set finals and never terminate (the recovered
394
+ edge `raw.src_emp_backup -> mart.dim_person` was returned EMPTY under the literal rule).
395
+ - **Change**: A node is treated as a temp/cte/derived INTERMEDIATE to thread *through* only
396
+ when its `kind IN ('cte','derived','temp')` **AND** its key is namespaced
397
+ (`table_qualified LIKE '%::%'`). Namespacing (`<file>::<db>.<name>`, [`base.py:97-98`](../../src/sqlcg/parsers/base.py))
398
+ is the load-bearing discriminator: true CTE/temp intermediates are always namespaced,
399
+ whereas a `derived` INSERT/CTAS target is never namespaced and is a genuine endpoint.
400
+ Endpoints are everything else (non-namespaced, or kind not temp/cte/derived, or NULL).
401
+ This realises the plan's stated NODE-keyed intent against the actual stored data model.
402
+ - **Impact**: No scope change; the headline acceptance (`raw.src_emp_backup -> mart.dim_person`
403
+ recovered, 4 gating absences not fabricated) holds and is asserted. The plan's
404
+ `_PHYSICAL_KIND_VALUES = ('table','external')` constant is therefore not used in the
405
+ traversal predicate (the namespacing test subsumes it); the temp-kind set
406
+ `('cte','derived','temp')` is still the authoritative constant, defined once in the module.
407
+ - **Date**: 2026-06-15
408
+
385
409
  ## Versioning
386
410
 
387
411
  - **Base: master @ `1.37.0`.**
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sql-code-graph"
7
- version = "1.37.1"
7
+ version = "1.38.0"
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.37.1"
3
+ __version__ = "1.38.0"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -314,6 +314,15 @@ def downstream( # noqa: B008
314
314
  def impact( # noqa: B008
315
315
  table: str = typer.Argument(..., help="Table name to analyze"), # noqa: B008
316
316
  raw: bool = typer.Option(False, "--raw", help="Disable noise filtering on results"), # noqa: B008
317
+ through_temps: bool = typer.Option( # noqa: B008
318
+ False,
319
+ "--through-temps",
320
+ help=(
321
+ "Also report consumers reachable only THROUGH a temp/cte/derived "
322
+ "intermediate (table-grain temp-collapsed closure). Off by default — "
323
+ "the default impact stays one-hop and does not thread temps."
324
+ ),
325
+ ),
317
326
  ) -> None:
318
327
  """Show all queries impacted by a table.
319
328
 
@@ -323,6 +332,13 @@ def impact( # noqa: B008
323
332
  ``ba.all_rows_in_selection``). Bug #6 fix: brings ``impact`` to the same
324
333
  one-hop consumer completeness ``find_table_usages`` already has. Stays
325
334
  one-hop (NOT transitive — that is ``downstream``'s job).
335
+
336
+ With ``--through-temps`` the consumer set is augmented with the downstream
337
+ **temp-collapsed** closure: physical tables reachable from this table only
338
+ by threading through ``kind IN ('cte','derived','temp')`` intermediates,
339
+ computed from the structural COLUMN_LINEAGE hops (read-only; it never
340
+ mutates the graph). This recovers consumers — e.g. the star-into-temp
341
+ final target — that the one-hop default and TEMP_INLINE do not surface.
326
342
  """
327
343
  direct = run_read_routed(
328
344
  "SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target"
@@ -341,6 +357,32 @@ def impact( # noqa: B008
341
357
  )
342
358
  seen = {r["id"] for r in direct}
343
359
  results = direct + [r for r in via if r["id"] not in seen]
360
+
361
+ # --through-temps: augment with the temp-collapsed downstream closure. These
362
+ # are physical final tables reached only by threading through a temp/cte/
363
+ # derived node (the one-hop default + the queries above miss them). Rendered
364
+ # as synthetic "[collapsed] <final>" rows so they are visibly distinct from
365
+ # the direct/via consumer-query rows above.
366
+ if through_temps:
367
+ from sqlcg.lineage.temp_collapse import collapse_through_temps
368
+
369
+ collapsed = collapse_through_temps(table.lower(), direction="downstream")
370
+ seen_finals = {r.get("target", "") for r in results}
371
+ for edge in collapsed:
372
+ if not edge.via_temp:
373
+ # reached by a single direct hop; already covered above
374
+ continue
375
+ if edge.final_table in seen_finals:
376
+ continue
377
+ seen_finals.add(edge.final_table)
378
+ results.append(
379
+ {
380
+ "id": f"[collapsed] {edge.final_table}",
381
+ "kind": f"via-temp (hops={edge.hop_count})",
382
+ "target": edge.final_table,
383
+ }
384
+ )
385
+
344
386
  # Preserve the existing 100-row bound on the merged consumer set.
345
387
  results = results[:100]
346
388
  if not raw:
@@ -0,0 +1,252 @@
1
+ """Non-destructive, read-only temp-collapse primitive (PR-2).
2
+
3
+ Given a physical start table, :func:`collapse_through_temps` returns the
4
+ **temp-collapsed transitive closure** — physical ``(src, final)`` table pairs
5
+ threaded *through* intermediate nodes whose ``SqlTable.kind IN
6
+ ('cte','derived','temp')`` — computed from the stored **structural**
7
+ COLUMN_LINEAGE hops (``transform IS DISTINCT FROM 'TEMP_INLINE'``), NOT from
8
+ TEMP_INLINE presence.
9
+
10
+ Why structural-only + node-keyed matters: the star-into-temp gap is precisely
11
+ "TEMP_INLINE did not fire" — but the per-hop structural edges
12
+ (``src -> <ns>::temp`` and ``<ns>::temp -> final``) always exist. Threading
13
+ through the temp *node* (table_qualified, namespace-stripped to its table grain)
14
+ recovers the collapsed ``src -> final`` edge that TEMP_INLINE does not emit.
15
+
16
+ This module performs **read-only** traversal only: every query is a ``SELECT``
17
+ issued through :func:`run_read_routed`. It never deletes, replaces, or mutates
18
+ any stored ``COLUMN_LINEAGE`` row (the HARD non-destructive invariant — guarded
19
+ behaviorally in the test suite). It lives outside ``base.py`` / ``indexer.py``
20
+ so it adds nothing to the parse/qualify hot loop (CLAUDE.md perf invariants).
21
+
22
+ Guards PR-2 of the lineage gold-set + temp-collapse plan
23
+ ([plan doc](../../../plan/sprints/lineage_gold_regression_and_temp_collapse.md)).
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from dataclasses import dataclass
29
+ from pathlib import Path
30
+
31
+ from sqlcg.server.read_client import run_read_routed
32
+
33
+ # ---------------------------------------------------------------------------
34
+ # Authoritative constant sets — mirror the existing read surface, do NOT invent.
35
+ # ---------------------------------------------------------------------------
36
+
37
+ #: Intermediate node kinds the collapse threads *through* (never an endpoint).
38
+ #: Mirrors ``coverage.py``'s ``kind IN ('cte','derived','temp')`` usage and the
39
+ #: cross-batch downgrade guard in ``duckdb_backend.py``. Define once here.
40
+ _TEMP_KIND_VALUES: tuple[str, ...] = ("cte", "derived", "temp")
41
+
42
+ #: COLUMN_LINEAGE.transform value emitted for inlined temp tables (E8
43
+ #: dual-emission). Mirrors ``analyze.py:_TEMP_INLINE_TRANSFORM``. The collapse
44
+ #: is computed from STRUCTURAL hops only, so these edges are filtered out.
45
+ _TEMP_INLINE_TRANSFORM = "TEMP_INLINE"
46
+
47
+ #: Default depth cap for the recursive traversal. Bounds runaway closures on a
48
+ #: dense graph; the visited-path guard already breaks cycles. Mirrors the
49
+ #: depth-bound convention in ``analyze.py`` (1..100).
50
+ _DEFAULT_MAX_DEPTH = 50
51
+
52
+
53
+ @dataclass(frozen=True)
54
+ class CollapsedEdge:
55
+ """One temp-collapsed table-grain edge.
56
+
57
+ Attributes:
58
+ src_table: The physical (table/external/unknown) start endpoint.
59
+ final_table: The physical endpoint reached by threading through temps.
60
+ via_temp: True when the path passed through at least one
61
+ cte/derived/temp node (a genuine collapse), False for a direct
62
+ physical->physical structural hop reached at depth 1.
63
+ hop_count: Number of structural COLUMN_LINEAGE hops on the path.
64
+ """
65
+
66
+ src_table: str
67
+ final_table: str
68
+ via_temp: bool
69
+ hop_count: int
70
+
71
+
72
+ def _temp_kind_in_list_sql() -> str:
73
+ """SQL literal list for the intermediate-kind IN (...) clause."""
74
+ return ", ".join(f"'{v}'" for v in _TEMP_KIND_VALUES)
75
+
76
+
77
+ def _strip_namespace(key: str) -> str:
78
+ """Drop the ``<file>::`` namespace prefix from a temp/cte/derived key.
79
+
80
+ Temp/CTE/derived nodes are keyed ``<repo-rel-file>::<db>.<name>`` in the
81
+ graph (see ``base.py:97-98``). The collapse threads through them but reports
82
+ endpoints at their bare ``<db>.<name>`` table grain — the same convention
83
+ the PR-1 gold-set rollup uses.
84
+ """
85
+ return key.split("::", 1)[1] if "::" in key else key
86
+
87
+
88
+ def _collapse_sql(*, direction: str, max_depth: int) -> str:
89
+ """Build the table-grain temp-collapse recursive-CTE SQL.
90
+
91
+ The traversal rolls COLUMN_LINEAGE to ``SqlColumn.table_qualified`` and
92
+ threads through nodes whose ``SqlTable.kind IN ('cte','derived','temp')``,
93
+ on STRUCTURAL hops only (``transform IS DISTINCT FROM 'TEMP_INLINE'``).
94
+ Every emitted row is a ``(start_physical, reached_physical)`` pair whose
95
+ intermediate hops are all temp/cte/derived and whose endpoint is physical
96
+ (``table``/``external``) or unknown (NULL kind).
97
+
98
+ Cycle-safe: the visited ``path`` of table-qualified node keys carries the
99
+ ``NOT ... = ANY(reach.path)`` guard (mirrors ``analyze.py:144/191``).
100
+ Depth-bounded: ``reach.depth < {max_depth}``.
101
+
102
+ Single ``?`` placeholder: the (lowercased) start table-qualified name.
103
+
104
+ Args:
105
+ direction: ``"downstream"`` (src -> final) or ``"upstream"``
106
+ (final -> src). ``analyze impact --through-temps`` uses downstream.
107
+ max_depth: Maximum number of structural hops to traverse.
108
+
109
+ Returns:
110
+ A parameterised SQL string with one ``?`` placeholder.
111
+ """
112
+ if direction == "downstream":
113
+ from_col, to_col = "src", "dst"
114
+ elif direction == "upstream":
115
+ from_col, to_col = "dst", "src"
116
+ else: # pragma: no cover - guarded by the public function
117
+ raise ValueError(f"direction must be 'downstream' or 'upstream', got {direction!r}")
118
+
119
+ temp_kinds = _temp_kind_in_list_sql()
120
+ structural_base = f"cl.transform IS DISTINCT FROM '{_TEMP_INLINE_TRANSFORM}'"
121
+ structural_rec = f"cl2.transform IS DISTINCT FROM '{_TEMP_INLINE_TRANSFORM}'"
122
+
123
+ # What counts as a temp/cte/derived INTERMEDIATE node to thread *through*:
124
+ # a node whose ``SqlTable.kind IN ('cte','derived','temp')`` AND whose key is
125
+ # NAMESPACED (``<file>::<db>.<name>`` — see base.py:97-98). Namespacing is the
126
+ # load-bearing discriminator: CTE/temp nodes are always namespaced, whereas an
127
+ # INSERT/CTAS *target* table (e.g. ``mart.dim_person``) is also stamped
128
+ # ``kind='derived'`` but is NOT namespaced and is a genuine physical endpoint.
129
+ # Keying on kind alone would thread through final targets and never terminate;
130
+ # requiring the ``::`` namespace keeps endpoints (the gold-set finals) terminal.
131
+ # (See PR-2 Deviation 1 in the plan.)
132
+ def _is_intermediate(kind_alias: str, node_alias: str) -> str:
133
+ return f"({kind_alias}.kind IN ({temp_kinds}) AND {node_alias} LIKE '%::%')"
134
+
135
+ # ``reach`` walks the table-grain structural graph. Each row is a node
136
+ # reached from the start, carrying:
137
+ # node — the table_qualified of the reached endpoint
138
+ # depth — number of structural hops taken
139
+ # via_temp— whether any intermediate node so far was a temp/cte/derived
140
+ # path — visited table_qualified keys (cycle guard)
141
+ # The recursive step only CONTINUES through an intermediate node; a physical
142
+ # endpoint (non-namespaced, or kind not temp/cte/derived) is terminal and is
143
+ # not re-expanded.
144
+ seed_via_temp = _is_intermediate("kt", "n.table_qualified")
145
+ rec_via_temp = _is_intermediate("kt2", "n2.table_qualified")
146
+ cur_is_intermediate = _is_intermediate("kcur", "reach.node")
147
+ return f"""
148
+ WITH RECURSIVE reach(node, depth, via_temp, path) AS (
149
+ SELECT
150
+ n.table_qualified AS node,
151
+ 1 AS depth,
152
+ {seed_via_temp} AS via_temp,
153
+ ARRAY[s.table_qualified, n.table_qualified] AS path
154
+ FROM "COLUMN_LINEAGE" cl
155
+ JOIN "SqlColumn" s ON s.id = cl.{from_col}_key
156
+ JOIN "SqlColumn" n ON n.id = cl.{to_col}_key
157
+ LEFT JOIN "SqlTable" kt ON kt.qualified = n.table_qualified
158
+ WHERE s.table_qualified = ?
159
+ AND {structural_base}
160
+ AND n.table_qualified IS DISTINCT FROM s.table_qualified
161
+ UNION ALL
162
+ SELECT
163
+ n2.table_qualified,
164
+ reach.depth + 1,
165
+ reach.via_temp OR {rec_via_temp},
166
+ array_append(reach.path, n2.table_qualified)
167
+ FROM reach
168
+ JOIN "SqlColumn" cur ON cur.table_qualified = reach.node
169
+ JOIN "COLUMN_LINEAGE" cl2 ON cl2.{from_col}_key = cur.id
170
+ JOIN "SqlColumn" n2 ON n2.id = cl2.{to_col}_key
171
+ LEFT JOIN "SqlTable" kcur ON kcur.qualified = reach.node
172
+ LEFT JOIN "SqlTable" kt2 ON kt2.qualified = n2.table_qualified
173
+ WHERE reach.depth < {max_depth}
174
+ AND {structural_rec}
175
+ -- only thread THROUGH a temp/cte/derived intermediate (namespaced) node
176
+ AND {cur_is_intermediate}
177
+ AND n2.table_qualified IS DISTINCT FROM reach.node
178
+ AND NOT n2.table_qualified = ANY(reach.path)
179
+ )
180
+ SELECT
181
+ reach.node AS final_node,
182
+ min(reach.depth) AS hop_count,
183
+ bool_or(reach.via_temp) AS via_temp
184
+ FROM reach
185
+ LEFT JOIN "SqlTable" fk ON fk.qualified = reach.node
186
+ -- emit only endpoints, never a bare temp/cte intermediate node
187
+ WHERE NOT {_is_intermediate("fk", "reach.node")}
188
+ GROUP BY reach.node
189
+ """
190
+
191
+
192
+ def collapse_through_temps(
193
+ start_table: str,
194
+ direction: str = "downstream",
195
+ max_depth: int = _DEFAULT_MAX_DEPTH,
196
+ db_path: Path | None = None,
197
+ ) -> list[CollapsedEdge]:
198
+ """Return the temp-collapsed transitive closure from ``start_table``.
199
+
200
+ Read-only, NODE-keyed, structural-hop-only table-grain BFS. Threads through
201
+ ``kind IN ('cte','derived','temp')`` intermediates and emits one
202
+ :class:`CollapsedEdge` per physical ``(start, reached)`` pair. Recovers the
203
+ star-into-temp ``src -> final`` edge that TEMP_INLINE does not emit (the
204
+ closure is built from the always-present structural hops, not from
205
+ TEMP_INLINE rows).
206
+
207
+ Non-destructive: issues only ``SELECT`` queries via
208
+ :func:`run_read_routed`. It performs no DELETE/INSERT/UPDATE/upsert and
209
+ never touches any write path.
210
+
211
+ Args:
212
+ start_table: The qualified start table name (case-insensitive — graph
213
+ keys are lowercased at index time, C2 normalization).
214
+ direction: ``"downstream"`` (default; consumers reached from the table)
215
+ or ``"upstream"`` (sources the table is derived from).
216
+ max_depth: Maximum number of structural hops (1..100). Bounds the
217
+ closure; the visited-path guard breaks cycles independently.
218
+ db_path: Explicit database path; defaults to the routed read target.
219
+
220
+ Returns:
221
+ A list of :class:`CollapsedEdge`, one per distinct physical endpoint
222
+ reached. ``src_table`` is the (namespace-stripped) start table;
223
+ ``final_table`` the (namespace-stripped) reached physical table.
224
+
225
+ Raises:
226
+ ValueError: ``direction`` is not ``"downstream"``/``"upstream"`` or
227
+ ``max_depth`` is outside 1..100.
228
+ """
229
+ if direction not in ("downstream", "upstream"):
230
+ raise ValueError(f"direction must be 'downstream' or 'upstream', got {direction!r}")
231
+ if max_depth < 1 or max_depth > 100:
232
+ raise ValueError(f"max_depth must be between 1 and 100, got {max_depth}")
233
+
234
+ start = start_table.lower() # graph keys are lowercased at index time
235
+ sql = _collapse_sql(direction=direction, max_depth=max_depth)
236
+ rows = run_read_routed(sql, {"start": start}, db_path=db_path)
237
+
238
+ src_bare = _strip_namespace(start)
239
+ edges: list[CollapsedEdge] = []
240
+ for r in rows:
241
+ final_bare = _strip_namespace(r["final_node"])
242
+ if final_bare == src_bare:
243
+ continue # never report the start as its own endpoint
244
+ edges.append(
245
+ CollapsedEdge(
246
+ src_table=src_bare,
247
+ final_table=final_bare,
248
+ via_temp=bool(r["via_temp"]),
249
+ hop_count=int(r["hop_count"]),
250
+ )
251
+ )
252
+ return edges