sql-code-graph 1.35.2__tar.gz → 1.35.3__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 (612) hide show
  1. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/PKG-INFO +1 -1
  2. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/pyproject.toml +1 -1
  3. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/__init__.py +1 -1
  4. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/indexer.py +61 -9
  5. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/bigquery_parser.py +5 -1
  6. sql_code_graph-1.35.3/tests/integration/test_incremental_reindex_parity.py +278 -0
  7. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_subprocess_isolate.py +3 -3
  8. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_timeout_cancel.py +2 -2
  9. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/uv.lock +1 -1
  10. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/api-documenter.md +0 -0
  11. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/architect-planner.md +0 -0
  12. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/architect-reviewer.md +0 -0
  13. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/code-reviewer.md +0 -0
  14. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/developer.md +0 -0
  15. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/plan-reviewer.md +0 -0
  16. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.claude/agents/sprint-planner.md +0 -0
  17. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  18. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  20. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/workflows/benchmark.yml +0 -0
  21. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/workflows/e2e-tests.yml +0 -0
  22. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/workflows/release.yml +0 -0
  23. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.github/workflows/test.yml +0 -0
  24. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.gitignore +0 -0
  25. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.pre-commit-config.yaml +0 -0
  26. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/.sqlcgignore +0 -0
  27. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/ARCHITECTURE_REVIEW.md +0 -0
  28. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  29. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/CHANGELOG.md +0 -0
  30. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/CLAUDE.md +0 -0
  31. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/README.md +0 -0
  32. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  33. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/docs/cli.md +0 -0
  34. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/docs/getting-started.md +0 -0
  35. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/docs/releasing-pypi.md +0 -0
  36. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/e2e_firstuser_report.md +0 -0
  37. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/e2e_run_20260528_101413.output +0 -0
  38. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/main.py +0 -0
  39. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/WORKFLOW.md +0 -0
  40. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  41. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  42. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/pr4_transform_kinds.json +0 -0
  43. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  44. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  45. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  46. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/createkind_dwh_after.json +0 -0
  47. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/createkind_dwh_before.json +0 -0
  48. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  49. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  50. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  51. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  52. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  53. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  54. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  55. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr4_star_promote_after.json +0 -0
  56. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr4_star_promote_before.json +0 -0
  57. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr_b_phantom_after.json +0 -0
  58. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr_b_phantom_before.json +0 -0
  59. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr_c_merge_after.json +0 -0
  60. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/pr_c_merge_before.json +0 -0
  61. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/schema_comparison_with_schema.json +0 -0
  62. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/schema_comparison_without_schema.json +0 -0
  63. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  64. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  65. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  66. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/column_coverage_diagnostic.md +0 -0
  67. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/column_coverage_findings.md +0 -0
  68. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/dwh_graph_analysis.md +0 -0
  69. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  70. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/feature_acceptance_dwh.md +0 -0
  71. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  72. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/island_lever_live_verification.md +0 -0
  73. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  74. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  75. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  76. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  77. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  78. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/sprint_3.1_postmortem.md +0 -0
  79. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  80. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/blueprint.md +0 -0
  81. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  82. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/investigation_e5_e4.md +0 -0
  83. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  84. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/parse_diagnostics.md +0 -0
  85. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/parsing_errors_experiment.md +0 -0
  86. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/snowflake_en_test_suite.md +0 -0
  87. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  88. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/research/sqlcg.md +0 -0
  89. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/bundle_claude_skill.md +0 -0
  90. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  91. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/column_lineage_recall_metric.md +0 -0
  92. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  93. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  94. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/coverage_parse_failures.md +0 -0
  95. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/diff-impact-producer-file.md +0 -0
  96. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/e8_dual_emission.md +0 -0
  97. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  98. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  99. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  100. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  101. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  102. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_downstream_sink_location.md +0 -0
  103. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  104. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  105. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_firstuser_findings.md +0 -0
  106. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  107. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  108. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/gain_coverage_metrics.md +0 -0
  109. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  110. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  111. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  112. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  113. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  114. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/living_codebase_resync.md +0 -0
  115. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/mcp_server_self_healing.md +0 -0
  116. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  117. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_01.md +0 -0
  118. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  119. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_02.md +0 -0
  120. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  121. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_03.md +0 -0
  122. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_04_column_lineage.md +0 -0
  123. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  124. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_05_star_resolution.md +0 -0
  125. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  126. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  127. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  128. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  129. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  130. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  131. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  132. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  133. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  134. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  135. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  136. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/temp_table_namespacing.md +0 -0
  137. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/trust_layer.md +0 -0
  138. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/unfilled_table_impact.md +0 -0
  139. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  140. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  141. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  142. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  143. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1_1_2_bugfix.md +0 -0
  144. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  145. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  146. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/v1_2_1_bugfix.md +0 -0
  147. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/plan/sprints/version-parity-and-restart.md +0 -0
  148. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/profile.html +0 -0
  149. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/pyrightconfig.json +0 -0
  150. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/scripts/collect_parse_errors.py +0 -0
  151. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/scripts/column_coverage_check.py +0 -0
  152. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/scripts/generate_cli_docs.sh +0 -0
  153. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/__main__.py +0 -0
  154. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/__init__.py +0 -0
  155. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/__init__.py +0 -0
  156. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/analyze.py +0 -0
  157. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/catalog.py +0 -0
  158. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/db.py +0 -0
  159. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/find.py +0 -0
  160. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/gain.py +0 -0
  161. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/git.py +0 -0
  162. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/index.py +0 -0
  163. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/install.py +0 -0
  164. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/mcp.py +0 -0
  165. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/reindex.py +0 -0
  166. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/report.py +0 -0
  167. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/uninstall.py +0 -0
  168. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/viz.py +0 -0
  169. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/commands/watch.py +0 -0
  170. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/coverage.py +0 -0
  171. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/cli/main.py +0 -0
  172. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/__init__.py +0 -0
  173. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/config.py +0 -0
  174. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/duckdb_backend.py +0 -0
  175. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/freshness.py +0 -0
  176. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/graph_db.py +0 -0
  177. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/jobs.py +0 -0
  178. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/noise_match.py +0 -0
  179. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/queries.cypher +0 -0
  180. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/queries.py +0 -0
  181. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/queries.sql +0 -0
  182. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/schema.cypher +0 -0
  183. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/core/schema.py +0 -0
  184. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/__init__.py +0 -0
  185. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  186. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/error_classify.py +0 -0
  187. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/git_delta.py +0 -0
  188. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/pool.py +0 -0
  189. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/walker.py +0 -0
  190. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/indexer/watcher.py +0 -0
  191. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/lineage/__init__.py +0 -0
  192. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/lineage/aggregator.py +0 -0
  193. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/lineage/schema_resolver.py +0 -0
  194. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/metrics/__init__.py +0 -0
  195. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/metrics/store.py +0 -0
  196. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/__init__.py +0 -0
  197. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/ansi_parser.py +0 -0
  198. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/base.py +0 -0
  199. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/dynamic_name.py +0 -0
  200. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/postgres_parser.py +0 -0
  201. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/registry.py +0 -0
  202. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  203. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/parsers/tsql_parser.py +0 -0
  204. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/__init__.py +0 -0
  205. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/control.py +0 -0
  206. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/exceptions.py +0 -0
  207. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/models.py +0 -0
  208. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/noise_filter.py +0 -0
  209. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/read_client.py +0 -0
  210. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/selfheal.py +0 -0
  211. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/server.py +0 -0
  212. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/skill.py +0 -0
  213. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/tools.py +0 -0
  214. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/server/writer.py +0 -0
  215. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/utils/__init__.py +0 -0
  216. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/utils/hashing.py +0 -0
  217. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/utils/ignore.py +0 -0
  218. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/utils/logging.py +0 -0
  219. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/__init__.py +0 -0
  220. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/assets/force-graph.min.js +0 -0
  221. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/assets/template.html +0 -0
  222. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/data.py +0 -0
  223. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/render.py +0 -0
  224. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/src/sqlcg/viz/tags.py +0 -0
  225. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/__init__.py +0 -0
  226. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/__init__.py +0 -0
  227. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/adversarial/200_join.sql +0 -0
  228. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/adversarial/500_union.sql +0 -0
  229. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/bench_indexer.py +0 -0
  230. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/conftest.py +0 -0
  231. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  232. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  233. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  234. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  235. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  236. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  237. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  238. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  239. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  240. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  241. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/tpch/q01.sql +0 -0
  242. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/tpch/q02.sql +0 -0
  243. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/tpch/q03.sql +0 -0
  244. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/tpch/q04.sql +0 -0
  245. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/benchmarks/tpch/q05.sql +0 -0
  246. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/conftest.py +0 -0
  247. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/__init__.py +0 -0
  248. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/conftest.py +0 -0
  249. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  250. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_airbnb_e2e.py +0 -0
  251. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_cli_index.py +0 -0
  252. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  253. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_git_hook_install.py +0 -0
  254. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_golden_lineage.py +0 -0
  255. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_mcp_lifecycle.py +0 -0
  256. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_mcp_tools.py +0 -0
  257. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  258. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  259. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_selfheal_e2e.py +0 -0
  260. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_star_resolution_e2e.py +0 -0
  261. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_viz_cli_e2e.py +0 -0
  262. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/e2e/test_watch.py +0 -0
  263. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  264. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  265. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  266. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  267. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  268. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  269. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  270. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  271. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/src_listings.sql +0 -0
  272. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  273. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/bigquery/.gitkeep +0 -0
  274. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  275. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  276. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  277. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  278. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/snowflake/base_tables.sql +0 -0
  279. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/snowflake/reports.sql +0 -0
  280. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/snowflake/views.sql +0 -0
  281. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  282. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  283. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  284. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  285. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/synthetic/base_tables.sql +0 -0
  286. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/synthetic/reports.sql +0 -0
  287. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/fixtures/synthetic/views.sql +0 -0
  288. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/__init__.py +0 -0
  289. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/snowflake/__init__.py +0 -0
  290. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/snowflake/test_insert_select.py +0 -0
  291. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  292. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_T34_presentation_segregation.py +0 -0
  293. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_T35_external_consumers.py +0 -0
  294. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_analyze_case_fold.py +0 -0
  295. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_anchor_tools.py +0 -0
  296. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_backfill_impact_consistency.py +0 -0
  297. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  298. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_bulk_upsert.py +0 -0
  299. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_case_split_seed_regression.py +0 -0
  300. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  301. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_catalog_load_integration.py +0 -0
  302. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  303. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_column_coverage_patterns.py +0 -0
  304. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_column_lineage_e2e.py +0 -0
  305. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_coverage_metrics_integration.py +0 -0
  306. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cross_file_lineage.py +0 -0
  307. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  308. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cte_recall_guard.py +0 -0
  309. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  310. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_cte_source_node_invariant.py +0 -0
  311. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_dialect_auto_resolution.py +0 -0
  312. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_dialect_matrix.py +0 -0
  313. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_duckdb_parity.py +0 -0
  314. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  315. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  316. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  317. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_freshness_mcp.py +0 -0
  318. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_gating_join_retrofit.py +0 -0
  319. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  320. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_identity_counters_integration.py +0 -0
  321. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_impact_consumer_parity.py +0 -0
  322. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_index_degraded_files_metric.py +0 -0
  323. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  324. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_indexer_batching.py +0 -0
  325. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_indexer_commits.py +0 -0
  326. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_indexer_to_graph.py +0 -0
  327. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  328. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_join_col_resolution.py +0 -0
  329. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  330. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_live_anchors.py +0 -0
  331. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_mvcc_rebuild.py +0 -0
  332. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
  333. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_non_table_create_kind_in_graph.py +0 -0
  334. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_parse_diagnostics.py +0 -0
  335. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_phantom_non_table_create_node.py +0 -0
  336. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_pr1_confidence_reason.py +0 -0
  337. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_pr2_source_location.py +0 -0
  338. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_pr3_kind_tagging.py +0 -0
  339. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_pr_impact_integration.py +0 -0
  340. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_qualify_failed_persist.py +0 -0
  341. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_read_via_server.py +0 -0
  342. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_readonly_under_lock.py +0 -0
  343. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_reindex_via_server.py +0 -0
  344. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  345. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  346. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_resync.py +0 -0
  347. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_selects_from_completeness.py +0 -0
  348. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  349. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_selects_from_subscope_source.py +0 -0
  350. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_single_writer_queue.py +0 -0
  351. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_skip_counts_integration.py +0 -0
  352. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_star_promote_temp_columns.py +0 -0
  353. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_star_resolution.py +0 -0
  354. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_temp_table_lineage.py +0 -0
  355. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_temp_table_namespacing.py +0 -0
  356. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  357. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  358. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_usage_derived_catalog.py +0 -0
  359. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  360. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_user_surface_recall_guard.py +0 -0
  361. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_v141_surface_guards.py +0 -0
  362. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  363. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_view_kind_in_graph.py +0 -0
  364. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_viz_data_build.py +0 -0
  365. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/integration/test_write_memory_ceiling.py +0 -0
  366. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/perf/__init__.py +0 -0
  367. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/perf/test_perf.py +0 -0
  368. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E10/__init__.py +0 -0
  369. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E11/__init__.py +0 -0
  370. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E12/__init__.py +0 -0
  371. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E12/e12_json_path.sql +0 -0
  372. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  373. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E12/test_e12.py +0 -0
  374. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E13/__init__.py +0 -0
  375. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E14/__init__.py +0 -0
  376. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E15/__init__.py +0 -0
  377. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E16/__init__.py +0 -0
  378. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E16/e16_merge.sql +0 -0
  379. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  380. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E16/test_e16.py +0 -0
  381. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E17/__init__.py +0 -0
  382. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E18/__init__.py +0 -0
  383. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E18/e18_decode.sql +0 -0
  384. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  385. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  386. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E18/test_e18.py +0 -0
  387. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E19/__init__.py +0 -0
  388. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E2/__init__.py +0 -0
  389. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  390. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  391. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  392. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E2/test_e2.py +0 -0
  393. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E20/__init__.py +0 -0
  394. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E21/__init__.py +0 -0
  395. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  396. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  397. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E21/test_e21.py +0 -0
  398. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E22/__init__.py +0 -0
  399. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E23/__init__.py +0 -0
  400. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  401. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  402. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E23/test_e23.py +0 -0
  403. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E24/__init__.py +0 -0
  404. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E25/__init__.py +0 -0
  405. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  406. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E25/e25_two_part.sql +0 -0
  407. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E25/test_e25.py +0 -0
  408. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  409. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E26/__init__.py +0 -0
  410. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E27/__init__.py +0 -0
  411. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  412. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E27/e27_udf.sql +0 -0
  413. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E27/test_e27.py +0 -0
  414. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E28/__init__.py +0 -0
  415. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E29/__init__.py +0 -0
  416. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E3/__init__.py +0 -0
  417. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  418. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  419. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  420. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E3/test_e3.py +0 -0
  421. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E30/__init__.py +0 -0
  422. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E31/__init__.py +0 -0
  423. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E32/__init__.py +0 -0
  424. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E33/__init__.py +0 -0
  425. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E34/__init__.py +0 -0
  426. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E35/__init__.py +0 -0
  427. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E36/__init__.py +0 -0
  428. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  429. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  430. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E36/test_e36.py +0 -0
  431. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  432. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E37/__init__.py +0 -0
  433. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E38/__init__.py +0 -0
  434. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/__init__.py +0 -0
  435. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  436. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  437. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  438. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  439. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E4/test_e4.py +0 -0
  440. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/__init__.py +0 -0
  441. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  442. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  443. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  444. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/test_e5.py +0 -0
  445. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  446. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E8/__init__.py +0 -0
  447. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  448. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  449. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E8/e8_uuid.sql +0 -0
  450. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E8/test_e8.py +0 -0
  451. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E9/__init__.py +0 -0
  452. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_aggregates/__init__.py +0 -0
  453. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  454. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  455. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  456. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  457. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/__init__.py +0 -0
  458. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  459. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  460. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  461. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  462. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  463. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/README.md +0 -0
  464. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/__init__.py +0 -0
  465. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/__init__.py +0 -0
  466. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  467. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  468. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  469. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/fixture_source.sql +0 -0
  470. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  471. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  472. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/conftest.py +0 -0
  473. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/snowflake/test_plan_review_gates.py +0 -0
  474. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/__init__.py +0 -0
  475. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/snowflake/__init__.py +0 -0
  476. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  477. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  478. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  479. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  480. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_F2_install_skill.py +0 -0
  481. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_F2_skill_render.py +0 -0
  482. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_F2_uninstall_skill.py +0 -0
  483. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_T09_01_qualify_once.py +0 -0
  484. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  485. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  486. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  487. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_T35_config_external_consumers.py +0 -0
  488. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_aggregator.py +0 -0
  489. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_aggregator_skip.py +0 -0
  490. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_analyze_case_fold.py +0 -0
  491. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_base_parser.py +0 -0
  492. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_branch_monitor.py +0 -0
  493. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  494. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_canonical_target_resolution.py +0 -0
  495. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_catalog_csv_parsing.py +0 -0
  496. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_catalog_missing_warning.py +0 -0
  497. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_classify_non_table_create_kind.py +0 -0
  498. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_cli.py +0 -0
  499. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  500. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_cli_help.py +0 -0
  501. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  502. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_closure_depth.py +0 -0
  503. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_column_lineage_wiring.py +0 -0
  504. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_config.py +0 -0
  505. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_coverage_metrics.py +0 -0
  506. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_cte_key_namespacing.py +0 -0
  507. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_cte_source_gap_metric.py +0 -0
  508. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_data_models.py +0 -0
  509. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_db_info.py +0 -0
  510. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_db_info_coverage.py +0 -0
  511. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  512. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_doc_links.py +0 -0
  513. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  514. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_dominant_cause.py +0 -0
  515. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_duckdb_backend.py +0 -0
  516. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_duckdb_backend_shared.py +0 -0
  517. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_dynamic_name_resolution.py +0 -0
  518. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  519. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_e8_dual_emission.py +0 -0
  520. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  521. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_empty_propagation_unit.py +0 -0
  522. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_extract_select_output_columns.py +0 -0
  523. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_file_ignore_defaults.py +0 -0
  524. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_find_cmd.py +0 -0
  525. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_firstuser_findings.py +0 -0
  526. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_freshness_helper.py +0 -0
  527. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_gain_coverage.py +0 -0
  528. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_gain_ratio.py +0 -0
  529. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  530. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_git_delta.py +0 -0
  531. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_git_hooks.py +0 -0
  532. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_git_hooks_notify.py +0 -0
  533. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_graph_backend.py +0 -0
  534. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_graph_completeness_invariant.py +0 -0
  535. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_hard_kill_pool.py +0 -0
  536. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  537. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_hook_reindex_detach.py +0 -0
  538. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_hygiene_config_warning.py +0 -0
  539. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_identity_counters.py +0 -0
  540. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_include_working_tree.py +0 -0
  541. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_index_cmd.py +0 -0
  542. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_index_filter_config.py +0 -0
  543. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_index_flags.py +0 -0
  544. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_index_progress.py +0 -0
  545. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  546. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_indexer_progress.py +0 -0
  547. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_indexer_quality.py +0 -0
  548. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_install.py +0 -0
  549. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_install_message.py +0 -0
  550. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  551. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_jobs.py +0 -0
  552. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_join_col_resolve_marker.py +0 -0
  553. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_judgement.py +0 -0
  554. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_lineage_conversion.py +0 -0
  555. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_literal_column_skip.py +0 -0
  556. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_mcp_best_practices.py +0 -0
  557. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_mcp_control.py +0 -0
  558. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  559. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_merge_column_lineage.py +0 -0
  560. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_metrics.py +0 -0
  561. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_noise_filter.py +0 -0
  562. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_normalize_keys.py +0 -0
  563. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_parse_failed_classification.py +0 -0
  564. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  565. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_parse_quality.py +0 -0
  566. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_parser.py +0 -0
  567. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_perf_scaling_guard.py +0 -0
  568. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_phantom_non_table_create_source.py +0 -0
  569. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_pr07_observability.py +0 -0
  570. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  571. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_pr_impact_unit.py +0 -0
  572. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_qualify_failed_unit.py +0 -0
  573. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_queries_loader.py +0 -0
  574. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_read_client.py +0 -0
  575. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  576. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  577. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  578. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  579. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_schema_resolver.py +0 -0
  580. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  581. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_selfheal_detector.py +0 -0
  582. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  583. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_selfheal_reexec.py +0 -0
  584. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_selfheal_watcher.py +0 -0
  585. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_server.py +0 -0
  586. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_skip_counts_persistence.py +0 -0
  587. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  588. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  589. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_star_resolution_unit.py +0 -0
  590. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_star_schema_unit.py +0 -0
  591. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_submit_feedback.py +0 -0
  592. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  593. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_t03_ddl_skip.py +0 -0
  594. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_temp_table_namespacing.py +0 -0
  595. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_tool_version_stamp.py +0 -0
  596. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_tools_hints.py +0 -0
  597. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_tools_warnings.py +0 -0
  598. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_transform_kind_classification.py +0 -0
  599. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_uninstall.py +0 -0
  600. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  601. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_unqualified_fallback.py +0 -0
  602. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_upsert_batch_invariant.py +0 -0
  603. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_use_schema_session_context.py +0 -0
  604. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_version_parity.py +0 -0
  605. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_view_classification.py +0 -0
  606. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_viz_config_schemas.py +0 -0
  607. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_viz_facets.py +0 -0
  608. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_viz_render_self_contained.py +0 -0
  609. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_walker.py +0 -0
  610. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_watcher.py +0 -0
  611. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/tests/unit/test_worker_error_classification.py +0 -0
  612. {sql_code_graph-1.35.2 → sql_code_graph-1.35.3}/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.35.2
3
+ Version: 1.35.3
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sql-code-graph"
7
- version = "1.35.2"
7
+ version = "1.35.3"
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.35.2"
3
+ __version__ = "1.35.3"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -388,7 +388,7 @@ def _flush_row_batch(
388
388
  )
389
389
 
390
390
 
391
- def _subprocess_parse_worker(parser_cls, dialect, path, sql, q):
391
+ def _subprocess_parse_worker(parser_cls, dialect, path, sql, q, rel_path=None):
392
392
  """Parse a single file in a subprocess; queue the ParsedFile (or exception).
393
393
 
394
394
  parser_cls must be the *class* (pickleable), not an instance. The worker
@@ -398,10 +398,16 @@ def _subprocess_parse_worker(parser_cls, dialect, path, sql, q):
398
398
  T-09-04: Parser constructors require a SchemaResolver. The subprocess gets a
399
399
  fresh empty resolver; column resolution runs in infer-only mode, the same as
400
400
  small-repo mode.
401
+
402
+ #171: rel_path is the repo-relative posix path used for CTE/temp namespace
403
+ keying. It MUST be forwarded so the incremental path produces the same keys
404
+ as index_repo (which threads rel_path through its task dict); without it the
405
+ namespace falls back to the absolute OS path, creating duplicate CTE/temp
406
+ nodes after an incremental reindex.
401
407
  """
402
408
  try:
403
409
  parser = parser_cls(SchemaResolver(dialect=str(dialect) if dialect else None))
404
- out = parser.parse_file(path, sql)
410
+ out = parser.parse_file(path, sql, rel_path=rel_path)
405
411
  q.put(out)
406
412
  except BaseException as exc:
407
413
  # Send the exception back; parent will re-raise.
@@ -1129,6 +1135,22 @@ class Indexer:
1129
1135
  schema_resolver = SchemaResolver(dialect=dialect)
1130
1136
  parser = get_parser(dialect, schema_resolver)
1131
1137
 
1138
+ # #170/#171: load schema_aliases and compute repo-relative posix paths the
1139
+ # SAME way index_repo does, so the incremental path applies the same alias
1140
+ # normalisation (#170) and CTE/temp namespace keys (#171). Without these,
1141
+ # a branch-switch resync produced phantom *_tmp.* nodes (aliases unapplied)
1142
+ # and duplicate CTE/temp nodes (absolute-path keys).
1143
+ from sqlcg.core.config import get_schema_aliases
1144
+
1145
+ schema_aliases = get_schema_aliases(root)
1146
+ root_resolved = Path(root).resolve()
1147
+
1148
+ def _rel_posix(fp: Path) -> str:
1149
+ try:
1150
+ return fp.resolve().relative_to(root_resolved).as_posix()
1151
+ except ValueError:
1152
+ return fp.as_posix()
1153
+
1132
1154
  pass1_results: list[ParsedFile] = []
1133
1155
  for file_path in reparse_set:
1134
1156
  try:
@@ -1141,7 +1163,9 @@ class Indexer:
1141
1163
  pass1_results.append(placeholder)
1142
1164
  continue
1143
1165
  try:
1144
- parsed = self._index_single_file(parser, file_path, sql, timeout_per_file)
1166
+ parsed = self._index_single_file(
1167
+ parser, file_path, sql, timeout_per_file, rel_path=_rel_posix(file_path)
1168
+ )
1145
1169
  except Exception as exc:
1146
1170
  logger.warning("resync_changed: parse failed %s: %s", file_path, exc)
1147
1171
  parsed = ParsedFile(path=file_path, dialect=dialect)
@@ -1287,7 +1311,11 @@ class Indexer:
1287
1311
  def_path = Path(definer_fp)
1288
1312
  def_sql = def_path.read_text(encoding="utf-8")
1289
1313
  def_parsed = self._index_single_file(
1290
- parser, def_path, def_sql, timeout_per_file
1314
+ parser,
1315
+ def_path,
1316
+ def_sql,
1317
+ timeout_per_file,
1318
+ rel_path=_rel_posix(def_path),
1291
1319
  )
1292
1320
  # Harvest only — register for cross_file_sources but do NOT upsert
1293
1321
  aggregator.register_pass1(def_parsed)
@@ -1315,7 +1343,7 @@ class Indexer:
1315
1343
  )
1316
1344
  continue
1317
1345
  try:
1318
- cl_parsed = parser.parse_file(cl_path, cl_sql)
1346
+ cl_parsed = parser.parse_file(cl_path, cl_sql, rel_path=_rel_posix(cl_path))
1319
1347
  except Exception as exc:
1320
1348
  logger.warning("resync_changed: parse failed for closure file %s: %s", cl_path, exc)
1321
1349
  cl_parsed = ParsedFile(path=cl_path, dialect=dialect)
@@ -1325,7 +1353,19 @@ class Indexer:
1325
1353
  # ---- Step 7: Batched bulk upsert (same _flush_batch path as index_repo) ----
1326
1354
  all_results = pass1_results + closure_results
1327
1355
 
1328
- # Build a registry for duplicate DDL detection
1356
+ # #170: key-normalisation choke point apply schema_aliases + empty-identity
1357
+ # guard to EVERY parse result BEFORE the defined_table_registry is built and
1358
+ # before _upsert_file_batch. index_repo (line ~797) and reindex_file
1359
+ # (line ~1421) both do this; resync_changed previously did not, so a
1360
+ # branch-switch incremental reindex left staging-alias schemas (e.g. ba_tmp)
1361
+ # un-normalised, producing phantom *_tmp.* nodes that a from-scratch index
1362
+ # never creates. O(edges) per file, once per resync — outside the hot loop.
1363
+ from sqlcg.parsers.base import normalize_keys as _normalize_keys
1364
+
1365
+ for pf in all_results:
1366
+ _normalize_keys(pf, schema_aliases)
1367
+
1368
+ # Build a registry for duplicate DDL detection (post-normalisation full_ids)
1329
1369
  defined_table_registry: dict[str, str] = {}
1330
1370
  for pf in all_results:
1331
1371
  for table in pf.defined_tables:
@@ -1432,7 +1472,14 @@ class Indexer:
1432
1472
  # join-column edges until the next full index (plan-review BLOCKER).
1433
1473
  self._resolve_join_columns(db)
1434
1474
 
1435
- def _index_single_file(self, parser, path: Path, sql: str, timeout: int) -> ParsedFile:
1475
+ def _index_single_file(
1476
+ self,
1477
+ parser,
1478
+ path: Path,
1479
+ sql: str,
1480
+ timeout: int,
1481
+ rel_path: str | None = None,
1482
+ ) -> ParsedFile:
1436
1483
  """Parse one file, with optional timeout via subprocess isolation.
1437
1484
 
1438
1485
  T-09-04: Subprocess isolation via multiprocessing.Process + spawn context.
@@ -1446,12 +1493,17 @@ class Indexer:
1446
1493
  path: Path to the file
1447
1494
  sql: SQL text
1448
1495
  timeout: Timeout in seconds (0 = no timeout)
1496
+ rel_path: Repo-relative posix path for CTE/temp namespace keying
1497
+ (#171). Threaded through to parse_file (both the in-process and
1498
+ subprocess branch) so the incremental path produces the same
1499
+ namespace keys as index_repo. Falls back to str(path) inside the
1500
+ parser when None.
1449
1501
 
1450
1502
  Returns:
1451
1503
  ParsedFile with parse_failed flag set if timeout occurs
1452
1504
  """
1453
1505
  if timeout <= 0:
1454
- return parser.parse_file(path, sql)
1506
+ return parser.parse_file(path, sql, rel_path=rel_path)
1455
1507
 
1456
1508
  ctx = mp.get_context("spawn") # avoid fork-inherit pitfalls (KuzuDB connection FD etc.)
1457
1509
  # Unbounded queue: the child writes one large ParsedFile (192–552 KB pickled).
@@ -1462,7 +1514,7 @@ class Indexer:
1462
1514
  q: mp.Queue = ctx.Queue()
1463
1515
  proc = ctx.Process(
1464
1516
  target=_subprocess_parse_worker,
1465
- args=(parser.__class__, parser.DIALECT, path, sql, q),
1517
+ args=(parser.__class__, parser.DIALECT, path, sql, q, rel_path),
1466
1518
  daemon=True,
1467
1519
  )
1468
1520
  proc.start()
@@ -35,12 +35,16 @@ class BigQueryParser(AnsiParser):
35
35
  """
36
36
  super().__init__(schema_resolver, schema_aliases=schema_aliases)
37
37
 
38
- def parse_file(self, path: Path, sql: str) -> ParsedFile:
38
+ def parse_file(self, path: Path, sql: str, rel_path: str | None = None) -> ParsedFile:
39
39
  """Parse BigQuery SQL file with scripting block detection.
40
40
 
41
41
  Args:
42
42
  path: Path to the source file
43
43
  sql: SQL text to parse
44
+ rel_path: Repo-relative posix path for CTE/temp namespace keying.
45
+ Accepted for signature parity with the other parsers (the pool and
46
+ resync paths always pass it); scripting-fallback BigQuery files do
47
+ not register CTE/temp nodes, so it is currently unused here.
44
48
 
45
49
  Returns:
46
50
  ParsedFile with parsed statements and metadata
@@ -0,0 +1,278 @@
1
+ """Incremental-reindex == from-scratch parity guard (#170, #171).
2
+
3
+ Two correctness bugs let the incremental ``resync_changed`` path drift from a
4
+ from-scratch ``index_repo`` after a branch switch:
5
+
6
+ - #170: ``resync_changed`` upserted parse results WITHOUT first calling
7
+ ``normalize_keys`` (schema-alias normalisation), so a staging-alias schema
8
+ such as ``ba_tmp`` reached the graph un-normalised — phantom ``ba_tmp.*``
9
+ nodes a from-scratch index never creates.
10
+ - #171: ``_index_single_file`` (the incremental pass-1 parse) did not thread a
11
+ repo-relative ``rel_path`` into ``parse_file``, so CTE/temp namespace keys
12
+ used the absolute OS path instead of the repo-relative posix path
13
+ ``index_repo`` uses — duplicate CTE/temp nodes after an incremental reindex.
14
+
15
+ This module builds the SAME final tree two ways and asserts the resulting graphs
16
+ are EQUAL (same SqlTable nodes + kinds, same COLUMN_LINEAGE edges, same
17
+ SELECTS_FROM edges):
18
+
19
+ (a) incremental — index the base tree, then apply a branch delta and run
20
+ ``resync_changed`` (and, separately, ``reindex_file``);
21
+ (b) from-scratch — ``index_repo`` of the final tree.
22
+
23
+ The fixture deliberately exercises BOTH bugs: a ``*_tmp`` schema-alias table
24
+ (catches #170) and an in-file CTE (catches #171).
25
+
26
+ Guards the incremental-reindex parity fix
27
+ ([plan reference](https://github.com/Warhorze/sql-code-graph/issues/170)).
28
+ A future incremental path that skips a normalisation or rel_path step goes red.
29
+ """
30
+
31
+ import subprocess
32
+ from pathlib import Path
33
+
34
+ from sqlcg.core.duckdb_backend import DuckDBBackend
35
+ from sqlcg.indexer.indexer import Indexer
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Fixture SQL — final state of each file
39
+ # ---------------------------------------------------------------------------
40
+
41
+ # .sqlcg.toml content: ba_tmp is a staging alias for ba (#170 trigger).
42
+ SQLCG_TOML = """\
43
+ [sqlcg.schema_aliases]
44
+ ba_tmp = "ba"
45
+ """
46
+
47
+ # Unchanged base file: defines a permanent table from a raw source.
48
+ DIM_SQL = "CREATE TABLE ba.dim AS SELECT id, name FROM raw.source"
49
+
50
+ # Modified-in-delta file: writes a *_tmp staging table (alias) and reads it back
51
+ # via a CTE into a permanent fact table. The CTE (#171) and the ba_tmp alias
52
+ # (#170) both appear here.
53
+ FACT_SQL_V1 = (
54
+ "CREATE TABLE ba_tmp.staging AS SELECT id, name FROM ba.dim;\n"
55
+ "CREATE TABLE ba.fact AS\n"
56
+ "WITH enriched AS (SELECT id, name FROM ba_tmp.staging)\n"
57
+ "SELECT id, name FROM enriched"
58
+ )
59
+ FACT_SQL_V2 = (
60
+ "CREATE TABLE ba_tmp.staging AS SELECT id, name FROM ba.dim;\n"
61
+ "CREATE TABLE ba.fact AS\n"
62
+ "WITH enriched AS (SELECT id, name AS renamed_name FROM ba_tmp.staging)\n"
63
+ "SELECT id, renamed_name FROM enriched"
64
+ )
65
+
66
+ # Added-in-delta file: a fresh aggregate reading the fact table through its own
67
+ # CTE — exercises the rel_path keying on a brand-new file.
68
+ AGG_SQL = "CREATE TABLE ba.agg AS\nWITH rolled AS (SELECT id FROM ba.fact)\nSELECT id FROM rolled"
69
+
70
+ DIALECT = "snowflake"
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # Helpers
75
+ # ---------------------------------------------------------------------------
76
+
77
+
78
+ def _git(repo: Path, *args: str) -> str:
79
+ result = subprocess.run(["git", *args], cwd=repo, check=True, capture_output=True, text=True)
80
+ return result.stdout.strip()
81
+
82
+
83
+ def _init_repo(repo: Path) -> None:
84
+ _git(repo, "init", "--initial-branch=main")
85
+ _git(repo, "config", "user.email", "test@example.com")
86
+ _git(repo, "config", "user.name", "Test")
87
+
88
+
89
+ def _commit_all(repo: Path, msg: str) -> str:
90
+ _git(repo, "add", "-A")
91
+ _git(repo, "commit", "-m", msg)
92
+ return _git(repo, "rev-parse", "HEAD")
93
+
94
+
95
+ def _fresh_db() -> DuckDBBackend:
96
+ backend = DuckDBBackend(":memory:")
97
+ backend.init_schema()
98
+ return backend
99
+
100
+
101
+ def _sql_table_keys(db: DuckDBBackend) -> set[tuple[str, str]]:
102
+ """All (qualified, kind) SqlTable identities in the graph."""
103
+ rows = db.run_read('SELECT qualified, kind FROM "SqlTable"', {})
104
+ return {(r["qualified"], r["kind"]) for r in rows}
105
+
106
+
107
+ def _column_lineage_edges(db: DuckDBBackend) -> set[tuple[str, str]]:
108
+ rows = db.run_read('SELECT src_key AS s, dst_key AS d FROM "COLUMN_LINEAGE"', {})
109
+ return {(r["s"], r["d"]) for r in rows}
110
+
111
+
112
+ def _selects_from_edges(db: DuckDBBackend, repo: Path) -> set[tuple[str, str]]:
113
+ """SELECTS_FROM edges with the absolute-repo-path prefix stripped from src.
114
+
115
+ The src_key is a query id of the form ``<abs file path>:<stmt idx>``. The
116
+ File-node path is intentionally absolute and so differs between two repos
117
+ rooted at different temp dirs; strip the repo prefix so the comparison
118
+ reflects only the graph identity (which is what the bugs corrupt), not the
119
+ incidental temp-dir location.
120
+ """
121
+ prefix = str(repo.resolve())
122
+ rows = db.run_read('SELECT src_key AS s, dst_key AS d FROM "SELECTS_FROM"', {})
123
+ out: set[tuple[str, str]] = set()
124
+ for r in rows:
125
+ s = r["s"]
126
+ if s.startswith(prefix):
127
+ s = s[len(prefix) :].lstrip("/")
128
+ out.add((s, r["d"]))
129
+ return out
130
+
131
+
132
+ def _write_base_tree(repo: Path) -> None:
133
+ (repo / ".sqlcg.toml").write_text(SQLCG_TOML)
134
+ (repo / "dim.sql").write_text(DIM_SQL)
135
+ (repo / "fact.sql").write_text(FACT_SQL_V1)
136
+
137
+
138
+ def _apply_delta(repo: Path) -> None:
139
+ """Branch delta: modify fact.sql + add agg.sql (dim.sql untouched)."""
140
+ (repo / "fact.sql").write_text(FACT_SQL_V2)
141
+ (repo / "agg.sql").write_text(AGG_SQL)
142
+
143
+
144
+ def _write_final_tree(repo: Path) -> None:
145
+ (repo / ".sqlcg.toml").write_text(SQLCG_TOML)
146
+ (repo / "dim.sql").write_text(DIM_SQL)
147
+ (repo / "fact.sql").write_text(FACT_SQL_V2)
148
+ (repo / "agg.sql").write_text(AGG_SQL)
149
+
150
+
151
+ # ---------------------------------------------------------------------------
152
+ # Tests
153
+ # ---------------------------------------------------------------------------
154
+
155
+
156
+ def test_resync_changed_graph_equals_from_scratch(tmp_path):
157
+ """resync_changed of a branch delta must yield the SAME graph as a full index.
158
+
159
+ Builds the final tree two ways and asserts SqlTable nodes, COLUMN_LINEAGE
160
+ edges, and SELECTS_FROM edges are identical. Fails pre-fix because:
161
+ - #170 leaves phantom ``ba_tmp.staging`` nodes/edges (aliases unapplied);
162
+ - #171 keys the CTE node by the absolute path instead of the repo-relative
163
+ path, so the incremental and from-scratch CTE keys differ.
164
+ """
165
+ # ---- (a) incremental path -------------------------------------------------
166
+ inc_repo = tmp_path / "incremental"
167
+ inc_repo.mkdir()
168
+ _init_repo(inc_repo)
169
+ _write_base_tree(inc_repo)
170
+ old_sha = _commit_all(inc_repo, "base")
171
+
172
+ inc_db = _fresh_db()
173
+ indexer = Indexer()
174
+ indexer.index_repo(inc_repo, dialect=DIALECT, db=inc_db)
175
+
176
+ _apply_delta(inc_repo)
177
+ new_sha = _commit_all(inc_repo, "delta")
178
+
179
+ result = indexer.resync_changed(inc_repo, old_sha, new_sha, inc_db, dialect=DIALECT)
180
+ assert result["fell_back_to_full"] is False, (
181
+ "resync must take the incremental path, not fall back to a full reindex"
182
+ )
183
+
184
+ # ---- (b) from-scratch path ------------------------------------------------
185
+ scr_repo = tmp_path / "scratch"
186
+ scr_repo.mkdir()
187
+ _init_repo(scr_repo)
188
+ _write_final_tree(scr_repo)
189
+ _commit_all(scr_repo, "final")
190
+
191
+ scr_db = _fresh_db()
192
+ indexer.index_repo(scr_repo, dialect=DIALECT, db=scr_db)
193
+
194
+ # ---- Compare graphs (path-independent identities) -------------------------
195
+ inc_tables = _sql_table_keys(inc_db)
196
+ scr_tables = _sql_table_keys(scr_db)
197
+
198
+ # No phantom *_tmp.* nodes survived the incremental path (#170).
199
+ inc_tmp = {q for (q, _k) in inc_tables if ".staging" in q and "ba_tmp" in q}
200
+ assert inc_tmp == set(), (
201
+ f"#170: incremental path leaked un-aliased ba_tmp nodes: {sorted(inc_tmp)}"
202
+ )
203
+
204
+ assert inc_tables == scr_tables, (
205
+ "SqlTable identities differ between incremental and from-scratch.\n"
206
+ f" only-incremental: {sorted(inc_tables - scr_tables)}\n"
207
+ f" only-from-scratch: {sorted(scr_tables - inc_tables)}"
208
+ )
209
+
210
+ inc_edges = _column_lineage_edges(inc_db)
211
+ scr_edges = _column_lineage_edges(scr_db)
212
+ assert inc_edges == scr_edges, (
213
+ "COLUMN_LINEAGE edges differ between incremental and from-scratch.\n"
214
+ f" only-incremental: {sorted(inc_edges - scr_edges)}\n"
215
+ f" only-from-scratch: {sorted(scr_edges - inc_edges)}"
216
+ )
217
+
218
+ inc_sf = _selects_from_edges(inc_db, inc_repo)
219
+ scr_sf = _selects_from_edges(scr_db, scr_repo)
220
+ assert inc_sf == scr_sf, (
221
+ "SELECTS_FROM edges differ between incremental and from-scratch.\n"
222
+ f" only-incremental: {sorted(inc_sf - scr_sf)}\n"
223
+ f" only-from-scratch: {sorted(scr_sf - inc_sf)}"
224
+ )
225
+
226
+ # Observable-output floor: the from-scratch graph is non-trivial, so equality
227
+ # is not vacuously satisfied by two empty graphs.
228
+ assert len(scr_tables) >= 3, "fixture must register at least dim/fact/agg + CTE nodes"
229
+ assert len(scr_edges) >= 1, "fixture must produce column lineage"
230
+
231
+ inc_db.close()
232
+ scr_db.close()
233
+
234
+
235
+ def test_reindex_file_cte_node_matches_from_scratch(tmp_path):
236
+ """reindex_file of a CTE+alias file must key CTE/temp nodes like index_repo.
237
+
238
+ Guards the single-file incremental path (``reindex_file``) for the same
239
+ rel_path/alias parity (#170/#171): the CTE node key and any ba_tmp alias
240
+ must match the from-scratch graph for the same file.
241
+ """
242
+ # from-scratch reference graph
243
+ scr_repo = tmp_path / "scratch"
244
+ scr_repo.mkdir()
245
+ _init_repo(scr_repo)
246
+ (scr_repo / ".sqlcg.toml").write_text(SQLCG_TOML)
247
+ (scr_repo / "fact.sql").write_text(FACT_SQL_V2)
248
+ _commit_all(scr_repo, "final")
249
+ scr_db = _fresh_db()
250
+ indexer = Indexer()
251
+ indexer.index_repo(scr_repo, dialect=DIALECT, db=scr_db)
252
+ scr_tables = _sql_table_keys(scr_db)
253
+
254
+ # incremental: index v1, then reindex the changed file to v2
255
+ inc_repo = tmp_path / "incremental"
256
+ inc_repo.mkdir()
257
+ _init_repo(inc_repo)
258
+ (inc_repo / ".sqlcg.toml").write_text(SQLCG_TOML)
259
+ (inc_repo / "fact.sql").write_text(FACT_SQL_V1)
260
+ _commit_all(inc_repo, "base")
261
+ inc_db = _fresh_db()
262
+ indexer.index_repo(inc_repo, dialect=DIALECT, db=inc_db)
263
+
264
+ (inc_repo / "fact.sql").write_text(FACT_SQL_V2)
265
+ indexer.reindex_file(str((inc_repo / "fact.sql").resolve()), inc_db, dialect=DIALECT)
266
+ inc_tables = _sql_table_keys(inc_db)
267
+
268
+ inc_tmp = {q for (q, _k) in inc_tables if ".staging" in q and "ba_tmp" in q}
269
+ assert inc_tmp == set(), f"#170: reindex_file leaked un-aliased ba_tmp nodes: {sorted(inc_tmp)}"
270
+ assert inc_tables == scr_tables, (
271
+ "reindex_file SqlTable identities differ from from-scratch.\n"
272
+ f" only-incremental: {sorted(inc_tables - scr_tables)}\n"
273
+ f" only-from-scratch: {sorted(scr_tables - inc_tables)}"
274
+ )
275
+ assert len(scr_tables) >= 3
276
+
277
+ inc_db.close()
278
+ scr_db.close()
@@ -31,7 +31,7 @@ class SlowParser:
31
31
  def __init__(self, schema_resolver=None):
32
32
  self.schema_resolver = schema_resolver
33
33
 
34
- def parse_file(self, path, sql):
34
+ def parse_file(self, path, sql, rel_path=None):
35
35
  time.sleep(60)
36
36
  return ParsedFile(path=path, dialect=self.DIALECT)
37
37
 
@@ -44,7 +44,7 @@ class FailingParser:
44
44
  def __init__(self, schema_resolver=None):
45
45
  self.schema_resolver = schema_resolver
46
46
 
47
- def parse_file(self, path, sql):
47
+ def parse_file(self, path, sql, rel_path=None):
48
48
  raise ValueError("bad sql")
49
49
 
50
50
 
@@ -56,7 +56,7 @@ class ExitParser:
56
56
  def __init__(self, schema_resolver=None):
57
57
  self.schema_resolver = schema_resolver
58
58
 
59
- def parse_file(self, path, sql):
59
+ def parse_file(self, path, sql, rel_path=None):
60
60
  os._exit(0)
61
61
 
62
62
 
@@ -18,7 +18,7 @@ class _FastParser:
18
18
  def __init__(self, schema_resolver=None):
19
19
  self.schema_resolver = schema_resolver
20
20
 
21
- def parse_file(self, path, sql):
21
+ def parse_file(self, path, sql, rel_path=None):
22
22
  return ParsedFile(path=path, dialect=self.DIALECT)
23
23
 
24
24
 
@@ -28,7 +28,7 @@ class _SlowParser:
28
28
  def __init__(self, schema_resolver=None):
29
29
  self.schema_resolver = schema_resolver
30
30
 
31
- def parse_file(self, path, sql):
31
+ def parse_file(self, path, sql, rel_path=None):
32
32
  time.sleep(10)
33
33
  return ParsedFile(path=path, dialect=self.DIALECT)
34
34
 
@@ -2844,7 +2844,7 @@ wheels = [
2844
2844
 
2845
2845
  [[package]]
2846
2846
  name = "sql-code-graph"
2847
- version = "1.35.2"
2847
+ version = "1.35.3"
2848
2848
  source = { editable = "." }
2849
2849
  dependencies = [
2850
2850
  { name = "duckdb" },
File without changes