sql-code-graph 1.34.0__tar.gz → 1.34.2__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 (587) hide show
  1. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/PKG-INFO +1 -1
  2. sql_code_graph-1.34.2/plan/metrics/createkind_dwh_after.json +31 -0
  3. sql_code_graph-1.34.2/plan/metrics/createkind_dwh_before.json +31 -0
  4. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/pyproject.toml +1 -1
  5. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/__init__.py +1 -1
  6. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/git.py +46 -17
  7. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/reindex.py +65 -0
  8. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/base.py +2 -1
  9. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_git_hook_install.py +132 -5
  10. sql_code_graph-1.34.2/tests/integration/test_non_table_create_coverage_no_regression.py +88 -0
  11. sql_code_graph-1.34.2/tests/integration/test_non_table_create_kind_in_graph.py +148 -0
  12. sql_code_graph-1.34.2/tests/unit/test_classify_non_table_create_kind.py +88 -0
  13. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_git_hooks.py +39 -22
  14. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_hook_reindex_detach.py +188 -0
  15. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/uv.lock +1 -1
  16. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/api-documenter.md +0 -0
  17. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/architect-planner.md +0 -0
  18. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/architect-reviewer.md +0 -0
  19. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/code-reviewer.md +0 -0
  20. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/developer.md +0 -0
  21. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/plan-reviewer.md +0 -0
  22. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.claude/agents/sprint-planner.md +0 -0
  23. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/workflows/benchmark.yml +0 -0
  27. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/workflows/e2e-tests.yml +0 -0
  28. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/workflows/release.yml +0 -0
  29. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.github/workflows/test.yml +0 -0
  30. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.gitignore +0 -0
  31. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.pre-commit-config.yaml +0 -0
  32. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/.sqlcgignore +0 -0
  33. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/ARCHITECTURE_REVIEW.md +0 -0
  34. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  35. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/CHANGELOG.md +0 -0
  36. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/CLAUDE.md +0 -0
  37. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/README.md +0 -0
  38. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  39. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/docs/cli.md +0 -0
  40. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/docs/getting-started.md +0 -0
  41. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/docs/releasing-pypi.md +0 -0
  42. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/e2e_firstuser_report.md +0 -0
  43. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/e2e_run_20260528_101413.output +0 -0
  44. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/main.py +0 -0
  45. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/WORKFLOW.md +0 -0
  46. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  47. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  48. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/pr4_transform_kinds.json +0 -0
  49. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  50. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  51. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  52. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  53. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  54. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  55. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  56. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  57. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  58. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  59. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/schema_comparison_with_schema.json +0 -0
  60. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/schema_comparison_without_schema.json +0 -0
  61. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  62. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  63. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  64. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/column_coverage_diagnostic.md +0 -0
  65. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/column_coverage_findings.md +0 -0
  66. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/dwh_graph_analysis.md +0 -0
  67. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  68. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/feature_acceptance_dwh.md +0 -0
  69. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  70. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/island_lever_live_verification.md +0 -0
  71. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  72. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  73. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  74. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  75. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  76. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/sprint_3.1_postmortem.md +0 -0
  77. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  78. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/blueprint.md +0 -0
  79. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  80. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/investigation_e5_e4.md +0 -0
  81. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  82. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/parse_diagnostics.md +0 -0
  83. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/parsing_errors_experiment.md +0 -0
  84. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/snowflake_en_test_suite.md +0 -0
  85. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  86. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/research/sqlcg.md +0 -0
  87. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/bundle_claude_skill.md +0 -0
  88. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  89. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/column_lineage_recall_metric.md +0 -0
  90. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  91. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  92. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/coverage_parse_failures.md +0 -0
  93. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/diff-impact-producer-file.md +0 -0
  94. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/e8_dual_emission.md +0 -0
  95. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  96. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  97. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  98. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  99. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  100. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_downstream_sink_location.md +0 -0
  101. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  102. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  103. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_firstuser_findings.md +0 -0
  104. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  105. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  106. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/gain_coverage_metrics.md +0 -0
  107. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  108. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  109. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  110. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  111. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  112. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/living_codebase_resync.md +0 -0
  113. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/mcp_server_self_healing.md +0 -0
  114. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  115. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_01.md +0 -0
  116. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  117. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_02.md +0 -0
  118. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  119. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_03.md +0 -0
  120. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_04_column_lineage.md +0 -0
  121. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  122. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_05_star_resolution.md +0 -0
  123. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  124. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  125. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  126. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  127. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  128. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  129. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  130. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  131. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  132. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  133. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  134. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/temp_table_namespacing.md +0 -0
  135. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/trust_layer.md +0 -0
  136. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/unfilled_table_impact.md +0 -0
  137. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  138. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  139. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  140. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  141. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1_1_2_bugfix.md +0 -0
  142. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  143. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  144. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/v1_2_1_bugfix.md +0 -0
  145. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/plan/sprints/version-parity-and-restart.md +0 -0
  146. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/profile.html +0 -0
  147. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/pyrightconfig.json +0 -0
  148. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/scripts/collect_parse_errors.py +0 -0
  149. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/scripts/column_coverage_check.py +0 -0
  150. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/scripts/generate_cli_docs.sh +0 -0
  151. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/__main__.py +0 -0
  152. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/__init__.py +0 -0
  153. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/__init__.py +0 -0
  154. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/analyze.py +0 -0
  155. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/catalog.py +0 -0
  156. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/db.py +0 -0
  157. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/find.py +0 -0
  158. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/gain.py +0 -0
  159. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/index.py +0 -0
  160. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/install.py +0 -0
  161. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/mcp.py +0 -0
  162. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/report.py +0 -0
  163. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/uninstall.py +0 -0
  164. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/commands/watch.py +0 -0
  165. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/coverage.py +0 -0
  166. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/cli/main.py +0 -0
  167. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/__init__.py +0 -0
  168. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/config.py +0 -0
  169. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/duckdb_backend.py +0 -0
  170. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/freshness.py +0 -0
  171. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/graph_db.py +0 -0
  172. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/jobs.py +0 -0
  173. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/noise_match.py +0 -0
  174. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/queries.cypher +0 -0
  175. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/queries.py +0 -0
  176. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/queries.sql +0 -0
  177. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/schema.cypher +0 -0
  178. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/core/schema.py +0 -0
  179. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/__init__.py +0 -0
  180. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  181. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/error_classify.py +0 -0
  182. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/git_delta.py +0 -0
  183. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/indexer.py +0 -0
  184. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/pool.py +0 -0
  185. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/walker.py +0 -0
  186. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/indexer/watcher.py +0 -0
  187. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/lineage/__init__.py +0 -0
  188. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/lineage/aggregator.py +0 -0
  189. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/lineage/schema_resolver.py +0 -0
  190. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/metrics/__init__.py +0 -0
  191. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/metrics/store.py +0 -0
  192. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/__init__.py +0 -0
  193. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/ansi_parser.py +0 -0
  194. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  195. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/postgres_parser.py +0 -0
  196. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/registry.py +0 -0
  197. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  198. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/parsers/tsql_parser.py +0 -0
  199. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/__init__.py +0 -0
  200. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/control.py +0 -0
  201. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/exceptions.py +0 -0
  202. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/models.py +0 -0
  203. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/noise_filter.py +0 -0
  204. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/read_client.py +0 -0
  205. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/selfheal.py +0 -0
  206. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/server.py +0 -0
  207. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/skill.py +0 -0
  208. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/tools.py +0 -0
  209. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/server/writer.py +0 -0
  210. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/utils/__init__.py +0 -0
  211. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/utils/hashing.py +0 -0
  212. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/utils/ignore.py +0 -0
  213. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/src/sqlcg/utils/logging.py +0 -0
  214. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/__init__.py +0 -0
  215. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/__init__.py +0 -0
  216. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/adversarial/200_join.sql +0 -0
  217. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/adversarial/500_union.sql +0 -0
  218. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/bench_indexer.py +0 -0
  219. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/conftest.py +0 -0
  220. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  221. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  222. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  223. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  224. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  225. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  226. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  227. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  228. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  229. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  230. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/tpch/q01.sql +0 -0
  231. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/tpch/q02.sql +0 -0
  232. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/tpch/q03.sql +0 -0
  233. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/tpch/q04.sql +0 -0
  234. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/benchmarks/tpch/q05.sql +0 -0
  235. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/conftest.py +0 -0
  236. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/__init__.py +0 -0
  237. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/conftest.py +0 -0
  238. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  239. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_airbnb_e2e.py +0 -0
  240. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_cli_index.py +0 -0
  241. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  242. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_golden_lineage.py +0 -0
  243. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_mcp_lifecycle.py +0 -0
  244. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_mcp_tools.py +0 -0
  245. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  246. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  247. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_selfheal_e2e.py +0 -0
  248. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_star_resolution_e2e.py +0 -0
  249. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/e2e/test_watch.py +0 -0
  250. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  251. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  252. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  253. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  254. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  255. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  256. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  257. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  258. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/src_listings.sql +0 -0
  259. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  260. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/bigquery/.gitkeep +0 -0
  261. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  262. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  263. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  264. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  265. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/snowflake/base_tables.sql +0 -0
  266. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/snowflake/reports.sql +0 -0
  267. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/snowflake/views.sql +0 -0
  268. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  269. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  270. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  271. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  272. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/synthetic/base_tables.sql +0 -0
  273. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/synthetic/reports.sql +0 -0
  274. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/fixtures/synthetic/views.sql +0 -0
  275. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/__init__.py +0 -0
  276. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/snowflake/__init__.py +0 -0
  277. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/snowflake/test_insert_select.py +0 -0
  278. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  279. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_T34_presentation_segregation.py +0 -0
  280. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_T35_external_consumers.py +0 -0
  281. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_analyze_case_fold.py +0 -0
  282. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_anchor_tools.py +0 -0
  283. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_backfill_impact_consistency.py +0 -0
  284. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  285. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_bulk_upsert.py +0 -0
  286. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_case_split_seed_regression.py +0 -0
  287. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  288. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_catalog_load_integration.py +0 -0
  289. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  290. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_column_coverage_patterns.py +0 -0
  291. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_column_lineage_e2e.py +0 -0
  292. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_coverage_metrics_integration.py +0 -0
  293. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cross_file_lineage.py +0 -0
  294. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  295. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cte_recall_guard.py +0 -0
  296. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  297. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_cte_source_node_invariant.py +0 -0
  298. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_dialect_auto_resolution.py +0 -0
  299. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_dialect_matrix.py +0 -0
  300. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_duckdb_parity.py +0 -0
  301. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  302. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  303. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  304. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_freshness_mcp.py +0 -0
  305. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_gating_join_retrofit.py +0 -0
  306. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  307. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_identity_counters_integration.py +0 -0
  308. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_impact_consumer_parity.py +0 -0
  309. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_index_degraded_files_metric.py +0 -0
  310. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  311. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_indexer_batching.py +0 -0
  312. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_indexer_commits.py +0 -0
  313. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_indexer_to_graph.py +0 -0
  314. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  315. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_join_col_resolution.py +0 -0
  316. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  317. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_live_anchors.py +0 -0
  318. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_mvcc_rebuild.py +0 -0
  319. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_parse_diagnostics.py +0 -0
  320. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_pr1_confidence_reason.py +0 -0
  321. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_pr2_source_location.py +0 -0
  322. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_pr3_kind_tagging.py +0 -0
  323. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_pr_impact_integration.py +0 -0
  324. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_qualify_failed_persist.py +0 -0
  325. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_read_via_server.py +0 -0
  326. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_readonly_under_lock.py +0 -0
  327. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_reindex_via_server.py +0 -0
  328. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  329. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  330. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_resync.py +0 -0
  331. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_selects_from_completeness.py +0 -0
  332. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  333. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_selects_from_subscope_source.py +0 -0
  334. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_single_writer_queue.py +0 -0
  335. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_skip_counts_integration.py +0 -0
  336. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_star_resolution.py +0 -0
  337. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_temp_table_lineage.py +0 -0
  338. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_temp_table_namespacing.py +0 -0
  339. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  340. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  341. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_usage_derived_catalog.py +0 -0
  342. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  343. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_user_surface_recall_guard.py +0 -0
  344. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_v141_surface_guards.py +0 -0
  345. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  346. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_view_kind_in_graph.py +0 -0
  347. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/integration/test_write_memory_ceiling.py +0 -0
  348. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/perf/__init__.py +0 -0
  349. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/perf/test_perf.py +0 -0
  350. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E10/__init__.py +0 -0
  351. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E11/__init__.py +0 -0
  352. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E12/__init__.py +0 -0
  353. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E12/e12_json_path.sql +0 -0
  354. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  355. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E12/test_e12.py +0 -0
  356. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E13/__init__.py +0 -0
  357. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E14/__init__.py +0 -0
  358. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E15/__init__.py +0 -0
  359. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E16/__init__.py +0 -0
  360. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E16/e16_merge.sql +0 -0
  361. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  362. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E16/test_e16.py +0 -0
  363. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E17/__init__.py +0 -0
  364. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E18/__init__.py +0 -0
  365. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E18/e18_decode.sql +0 -0
  366. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  367. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  368. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E18/test_e18.py +0 -0
  369. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E19/__init__.py +0 -0
  370. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E2/__init__.py +0 -0
  371. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  372. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  373. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  374. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E2/test_e2.py +0 -0
  375. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E20/__init__.py +0 -0
  376. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E21/__init__.py +0 -0
  377. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  378. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  379. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E21/test_e21.py +0 -0
  380. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E22/__init__.py +0 -0
  381. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E23/__init__.py +0 -0
  382. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  383. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  384. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E23/test_e23.py +0 -0
  385. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E24/__init__.py +0 -0
  386. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E25/__init__.py +0 -0
  387. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  388. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E25/e25_two_part.sql +0 -0
  389. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E25/test_e25.py +0 -0
  390. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  391. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E26/__init__.py +0 -0
  392. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E27/__init__.py +0 -0
  393. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  394. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E27/e27_udf.sql +0 -0
  395. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E27/test_e27.py +0 -0
  396. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E28/__init__.py +0 -0
  397. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E29/__init__.py +0 -0
  398. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E3/__init__.py +0 -0
  399. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  400. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  401. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  402. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E3/test_e3.py +0 -0
  403. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E30/__init__.py +0 -0
  404. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E31/__init__.py +0 -0
  405. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E32/__init__.py +0 -0
  406. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E33/__init__.py +0 -0
  407. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E34/__init__.py +0 -0
  408. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E35/__init__.py +0 -0
  409. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E36/__init__.py +0 -0
  410. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  411. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  412. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E36/test_e36.py +0 -0
  413. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  414. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E37/__init__.py +0 -0
  415. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E38/__init__.py +0 -0
  416. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/__init__.py +0 -0
  417. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  418. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  419. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  420. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  421. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E4/test_e4.py +0 -0
  422. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/__init__.py +0 -0
  423. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  424. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  425. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  426. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/test_e5.py +0 -0
  427. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  428. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E8/__init__.py +0 -0
  429. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  430. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  431. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E8/e8_uuid.sql +0 -0
  432. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E8/test_e8.py +0 -0
  433. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E9/__init__.py +0 -0
  434. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_aggregates/__init__.py +0 -0
  435. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  436. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  437. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  438. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  439. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/__init__.py +0 -0
  440. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  441. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  442. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  443. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  444. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  445. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/README.md +0 -0
  446. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/__init__.py +0 -0
  447. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/__init__.py +0 -0
  448. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  449. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  450. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  451. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/fixture_source.sql +0 -0
  452. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  453. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  454. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/conftest.py +0 -0
  455. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/snowflake/test_plan_review_gates.py +0 -0
  456. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/__init__.py +0 -0
  457. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/snowflake/__init__.py +0 -0
  458. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  459. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  460. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  461. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  462. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_F2_install_skill.py +0 -0
  463. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_F2_skill_render.py +0 -0
  464. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_F2_uninstall_skill.py +0 -0
  465. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_T09_01_qualify_once.py +0 -0
  466. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  467. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  468. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  469. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_T35_config_external_consumers.py +0 -0
  470. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_aggregator.py +0 -0
  471. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_aggregator_skip.py +0 -0
  472. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_analyze_case_fold.py +0 -0
  473. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_base_parser.py +0 -0
  474. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_branch_monitor.py +0 -0
  475. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  476. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_canonical_target_resolution.py +0 -0
  477. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_catalog_csv_parsing.py +0 -0
  478. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_catalog_missing_warning.py +0 -0
  479. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_cli.py +0 -0
  480. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  481. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_cli_help.py +0 -0
  482. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  483. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_closure_depth.py +0 -0
  484. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_column_lineage_wiring.py +0 -0
  485. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_config.py +0 -0
  486. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_coverage_metrics.py +0 -0
  487. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_cte_key_namespacing.py +0 -0
  488. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_cte_source_gap_metric.py +0 -0
  489. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_data_models.py +0 -0
  490. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_db_info.py +0 -0
  491. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_db_info_coverage.py +0 -0
  492. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  493. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_doc_links.py +0 -0
  494. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  495. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_dominant_cause.py +0 -0
  496. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_duckdb_backend.py +0 -0
  497. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_duckdb_backend_shared.py +0 -0
  498. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  499. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_e8_dual_emission.py +0 -0
  500. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  501. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_empty_propagation_unit.py +0 -0
  502. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_extract_select_output_columns.py +0 -0
  503. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_file_ignore_defaults.py +0 -0
  504. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_find_cmd.py +0 -0
  505. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_firstuser_findings.py +0 -0
  506. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_freshness_helper.py +0 -0
  507. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_gain_coverage.py +0 -0
  508. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_gain_ratio.py +0 -0
  509. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  510. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_git_delta.py +0 -0
  511. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_git_hooks_notify.py +0 -0
  512. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_graph_backend.py +0 -0
  513. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_graph_completeness_invariant.py +0 -0
  514. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_hard_kill_pool.py +0 -0
  515. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  516. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_hygiene_config_warning.py +0 -0
  517. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_identity_counters.py +0 -0
  518. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_include_working_tree.py +0 -0
  519. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_index_cmd.py +0 -0
  520. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_index_filter_config.py +0 -0
  521. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_index_flags.py +0 -0
  522. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_index_progress.py +0 -0
  523. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  524. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_indexer_progress.py +0 -0
  525. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_indexer_quality.py +0 -0
  526. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_install.py +0 -0
  527. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_install_message.py +0 -0
  528. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  529. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_jobs.py +0 -0
  530. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_join_col_resolve_marker.py +0 -0
  531. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_judgement.py +0 -0
  532. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_lineage_conversion.py +0 -0
  533. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_literal_column_skip.py +0 -0
  534. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_mcp_best_practices.py +0 -0
  535. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_mcp_control.py +0 -0
  536. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  537. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_metrics.py +0 -0
  538. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_noise_filter.py +0 -0
  539. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_normalize_keys.py +0 -0
  540. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_parse_failed_classification.py +0 -0
  541. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  542. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_parse_quality.py +0 -0
  543. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_parser.py +0 -0
  544. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_perf_scaling_guard.py +0 -0
  545. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_pr07_observability.py +0 -0
  546. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  547. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_pr_impact_unit.py +0 -0
  548. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_qualify_failed_unit.py +0 -0
  549. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_queries_loader.py +0 -0
  550. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_read_client.py +0 -0
  551. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  552. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  553. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  554. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  555. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_schema_resolver.py +0 -0
  556. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  557. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_selfheal_detector.py +0 -0
  558. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  559. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_selfheal_reexec.py +0 -0
  560. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_selfheal_watcher.py +0 -0
  561. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_server.py +0 -0
  562. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_skip_counts_persistence.py +0 -0
  563. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  564. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  565. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_star_resolution_unit.py +0 -0
  566. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_star_schema_unit.py +0 -0
  567. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_submit_feedback.py +0 -0
  568. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_subprocess_isolate.py +0 -0
  569. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  570. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_t03_ddl_skip.py +0 -0
  571. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_temp_table_namespacing.py +0 -0
  572. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_timeout_cancel.py +0 -0
  573. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_tool_version_stamp.py +0 -0
  574. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_tools_hints.py +0 -0
  575. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_tools_warnings.py +0 -0
  576. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_transform_kind_classification.py +0 -0
  577. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_uninstall.py +0 -0
  578. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  579. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_unqualified_fallback.py +0 -0
  580. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_upsert_batch_invariant.py +0 -0
  581. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_use_schema_session_context.py +0 -0
  582. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_version_parity.py +0 -0
  583. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_view_classification.py +0 -0
  584. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_walker.py +0 -0
  585. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_watcher.py +0 -0
  586. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_worker_error_classification.py +0 -0
  587. {sql_code_graph-1.34.0 → sql_code_graph-1.34.2}/tests/unit/test_writer_queue.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sql-code-graph
3
- Version: 1.34.0
3
+ Version: 1.34.2
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
@@ -0,0 +1,31 @@
1
+ {"total_calls": 1231, "last_7d_calls": 1231, "index_runs": 5, "feedback_tp": 0,
2
+ "feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 412},
3
+ {"name": "trace_column_lineage", "count": 326}, {"name":
4
+ "list_dialects_and_repos", "count": 106}], "execute_sql_ratio": 0.33,
5
+ "parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
6
+ "coverage": {"catalogued_tables": 5796, "total_tables": 6581, "good_edges":
7
+ 51326, "total_edges": 59474, "phantom_edges": 12241, "blindspot_tables": 628,
8
+ "good_edges_strict": 46495, "edge_health_strict_pct": 78.18,
9
+ "good_edges_scoped": 36842, "total_edges_scoped": 37619,
10
+ "edge_health_scoped_pct": 97.93, "phantom_confirmed": 11701,
11
+ "phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
12
+ [{"table": "ia_analytics.ba_wtfa_artikel_formule_dagomzet", "bad_edges": 217},
13
+ {"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
14
+ "ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
15
+ "ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
16
+ "da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
17
+ "da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
18
+ "wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
19
+ "da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
20
+ "bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19}],
21
+ "blindspot_tables_for_80pct": 15, "files_indexed": 1335, "indexed_sha":
22
+ "fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path": "/tmp/ckm_after.duckdb",
23
+ "index_timestamp": 1781457191.07209, "degraded_parse_total": 5189,
24
+ "degraded_parse_queries": 20, "degraded_parse_by_dir": {"etl": {"degraded": 1,
25
+ "total": 2776}, "ddl": {"degraded": 19, "total": 2413}},
26
+ "zero_edge_write_queries": 1040, "total_write_queries": 2323,
27
+ "cte_key_collisions": 0, "rescuable_unqualified_edges": 125,
28
+ "info_schema_has_column_rows": 110257, "cte_source_gap_writes": 0,
29
+ "resolvable_write_col_edges": 35759, "transitive_col_edges": 4168,
30
+ "qualify_failed_statements": 9, "tool_version_stale": false,
31
+ "indexed_tool_version": "1.34.3", "running_tool_version": "1.34.3"}}
@@ -0,0 +1,31 @@
1
+ {"total_calls": 1231, "last_7d_calls": 1231, "index_runs": 5, "feedback_tp": 0,
2
+ "feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 412},
3
+ {"name": "trace_column_lineage", "count": 326}, {"name":
4
+ "list_dialects_and_repos", "count": 106}], "execute_sql_ratio": 0.33,
5
+ "parse_quality": {"sqlglot": 5162, "scripting": 20, "dynamic_sql": 3},
6
+ "coverage": {"catalogued_tables": 5796, "total_tables": 6572, "good_edges":
7
+ 51235, "total_edges": 59068, "phantom_edges": 12241, "blindspot_tables": 619,
8
+ "good_edges_strict": 46399, "edge_health_strict_pct": 78.55,
9
+ "good_edges_scoped": 36748, "total_edges_scoped": 37524,
10
+ "edge_health_scoped_pct": 97.93, "phantom_confirmed": 11701,
11
+ "phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
12
+ [{"table": "ia_analytics.ba_wtfa_artikel_formule_dagomzet", "bad_edges": 216},
13
+ {"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
14
+ "ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
15
+ "ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
16
+ "da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
17
+ "da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
18
+ "wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
19
+ "da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
20
+ "bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19}],
21
+ "blindspot_tables_for_80pct": 15, "files_indexed": 1335, "indexed_sha":
22
+ "fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path": "/tmp/ckm_before.duckdb",
23
+ "index_timestamp": 1781456971.4233296, "degraded_parse_total": 5185,
24
+ "degraded_parse_queries": 20, "degraded_parse_by_dir": {"etl": {"degraded": 1,
25
+ "total": 2772}, "ddl": {"degraded": 19, "total": 2413}},
26
+ "zero_edge_write_queries": 1069, "total_write_queries": 2351,
27
+ "cte_key_collisions": 0, "rescuable_unqualified_edges": 125,
28
+ "info_schema_has_column_rows": 110257, "cte_source_gap_writes": 0,
29
+ "resolvable_write_col_edges": 35351, "transitive_col_edges": 4174,
30
+ "qualify_failed_statements": 9, "tool_version_stale": false,
31
+ "indexed_tool_version": "1.34.1", "running_tool_version": "1.34.1"}}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sql-code-graph"
7
- version = "1.34.0"
7
+ version = "1.34.2"
8
8
  description = "SQL code graph analyzer and lineage tracer"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,5 +1,5 @@
1
1
  """SQL Code Graph - SQL lineage and dependency analysis tool."""
2
2
 
3
- __version__ = "1.34.0"
3
+ __version__ = "1.34.2"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -23,6 +23,29 @@ class _HookSpec(NamedTuple):
23
23
  # Hook script templates — use {sqlcg_bin} as the placeholder for the resolved binary.
24
24
  # The sentinel comments (e.g. "# sqlcg post-checkout hook") must stay byte-for-byte
25
25
  # unchanged so R9 idempotency is preserved: _install_single_hook matches them verbatim.
26
+ #
27
+ # Run-time binary resolution (#126 + #1): the hook no longer trusts the single embedded
28
+ # absolute literal to stay valid forever (a venv rebuild or tool upgrade makes the
29
+ # install-time path stale and the resync would then run a wrong/missing binary). Instead
30
+ # the shared _RESOLVE_PREAMBLE resolves the binary at *run time* with a hybrid order:
31
+ # 1. the preferred path rendered in at install time ({sqlcg_bin}, normally the stable
32
+ # user-base binary from _resolve_sqlcg_bin) — the fast path, used if still executable;
33
+ # 2. `command -v sqlcg` on $PATH — covers uv-tool, user-base-on-PATH, and active-venv;
34
+ # 3. neither resolves → print a loud stderr error and exit non-zero (never silent).
35
+ # The shell never recomputes getuserbase() — the preferred path is rendered in by Python.
36
+ # It exports SQLCG_BIN for the hook body to invoke.
37
+ _RESOLVE_PREAMBLE = (
38
+ 'if [ -x "{sqlcg_bin}" ]; then\n'
39
+ ' SQLCG_BIN="{sqlcg_bin}"\n'
40
+ "elif command -v sqlcg >/dev/null 2>&1; then\n"
41
+ ' SQLCG_BIN="$(command -v sqlcg)"\n'
42
+ "else\n"
43
+ " echo \"sqlcg: cannot find the sqlcg binary (tried '{sqlcg_bin}' and \\$PATH)"
44
+ " -- run 'sqlcg git install-hooks' to repoint this hook\" >&2\n"
45
+ " exit 1\n"
46
+ "fi\n"
47
+ )
48
+
26
49
  _HOOKS: list[_HookSpec] = [
27
50
  _HookSpec(
28
51
  filename="post-checkout",
@@ -32,7 +55,8 @@ _HOOKS: list[_HookSpec] = [
32
55
  "# sqlcg post-checkout hook — incremental resync after branch switch\n"
33
56
  "# $3 == 1 means branch checkout (not file checkout); skip file checkouts\n"
34
57
  '[ "$3" = "1" ] || exit 0\n'
35
- '{sqlcg_bin} reindex --from "$1" --to "$2"'
58
+ + _RESOLVE_PREAMBLE
59
+ + '"$SQLCG_BIN" reindex --from "$1" --to "$2"'
36
60
  ' "$(git rev-parse --show-toplevel)" --dialect auto --quiet --notify'
37
61
  ' || echo "sqlcg: graph not updated (reindex failed)'
38
62
  " -- run 'sqlcg mcp status'\" >&2\n"
@@ -41,22 +65,27 @@ _HOOKS: list[_HookSpec] = [
41
65
  _HookSpec(
42
66
  filename="post-merge",
43
67
  sentinel="# sqlcg post-merge hook",
44
- script_template="""\
45
- #!/bin/sh
46
- # sqlcg post-merge hook — incremental resync after pull/merge
47
- # git sets ORIG_HEAD to the pre-merge HEAD; pass it as --from so --notify can route
48
- # through a running server (same path as post-checkout). If ORIG_HEAD is unset (e.g.
49
- # first-ever merge / gc'd), fall back to the standalone stored-SHA delta (direct write).
50
- PREV=$(git rev-parse --verify --quiet ORIG_HEAD)
51
- TOP=$(git rev-parse --show-toplevel)
52
- if [ -n "$PREV" ]; then
53
- {sqlcg_bin} reindex --from "$PREV" --to HEAD "$TOP" --dialect auto --quiet --notify \\
54
- || echo "sqlcg: graph not updated (reindex failed) -- run 'sqlcg mcp status'" >&2
55
- else
56
- {sqlcg_bin} reindex "$TOP" --dialect auto --quiet --notify \\
57
- || echo "sqlcg: graph not updated (reindex failed) -- run 'sqlcg mcp status'" >&2
58
- fi
59
- """,
68
+ script_template=(
69
+ "#!/bin/sh\n"
70
+ "# sqlcg post-merge hook — incremental resync after pull/merge\n"
71
+ "# git sets ORIG_HEAD to the pre-merge HEAD; pass it as --from so --notify\n"
72
+ "# can route through a running server (same path as post-checkout). If\n"
73
+ "# ORIG_HEAD is unset (e.g. first-ever merge / gc'd), fall back to the\n"
74
+ "# standalone stored-SHA delta (direct write).\n"
75
+ + _RESOLVE_PREAMBLE
76
+ + "PREV=$(git rev-parse --verify --quiet ORIG_HEAD)\n"
77
+ "TOP=$(git rev-parse --show-toplevel)\n"
78
+ 'if [ -n "$PREV" ]; then\n'
79
+ ' "$SQLCG_BIN" reindex --from "$PREV" --to HEAD "$TOP" --dialect auto'
80
+ " --quiet --notify \\\n"
81
+ ' || echo "sqlcg: graph not updated (reindex failed)'
82
+ " -- run 'sqlcg mcp status'\" >&2\n"
83
+ "else\n"
84
+ ' "$SQLCG_BIN" reindex "$TOP" --dialect auto --quiet --notify \\\n'
85
+ ' || echo "sqlcg: graph not updated (reindex failed)'
86
+ " -- run 'sqlcg mcp status'\" >&2\n"
87
+ "fi\n"
88
+ ),
60
89
  ),
61
90
  ]
62
91
 
@@ -129,6 +129,11 @@ def reindex_cmd( # noqa: B008
129
129
  # below) and return to git immediately. The respawn guard env var prevents
130
130
  # the detached child from detaching again.
131
131
  if _is_hook_path and os.environ.get(_HOOK_DETACHED_ENV) != "1":
132
+ # #1 — loud foreground preflight BEFORE detaching. The detached child's
133
+ # schema gate (below) writes its Exit(1) to the hook-resync log, invisible
134
+ # to the user, so a stale-binary schema skew dies silently (exit 0 to git).
135
+ # Surface a real mismatch in the foreground, where git's terminal can see it.
136
+ _hook_preflight_schema_check()
132
137
  _spawn_detached_hook_resync(path)
133
138
  return
134
139
 
@@ -291,6 +296,66 @@ def _spawn_detached_hook_resync(path: Path) -> None:
291
296
  console.print(f"sqlcg: resyncing graph in background (log: {log_path})")
292
297
 
293
298
 
299
+ def _hook_preflight_schema_check() -> None:
300
+ """Surface a stale-binary schema/version skew in the FOREGROUND hook process (#1).
301
+
302
+ On the hook path the resync is detached (#77), so the existing schema gate
303
+ (``reindex_cmd`` at ~:150) runs in the detached child whose stdout/stderr go to
304
+ ``hook-resync.log`` — its ``Exit(1)`` never reaches the user's terminal and the
305
+ graph silently never refreshes. This preflight runs *before* the detach and, on a
306
+ REAL mismatch, prints a visible, actionable stderr message and exits non-zero
307
+ without detaching.
308
+
309
+ Git runs post-checkout/post-merge AFTER the operation and ignores the hook exit
310
+ status, so the **stderr message** is the load-bearing part (not the exit code).
311
+
312
+ BOUNDED, FAIL-SOFT open (plan-review B1 — MANDATED). DuckDB takes an exclusive
313
+ file lock: per ``config.py`` ``get_backend`` docstring, a second process cannot
314
+ open the DB at all (even read-only) while another holds it — it raises
315
+ ``duckdb.IOException`` (#63). On rapid successive checkouts a prior detached
316
+ resync still holds the lock, so this open WILL contend. We therefore do a SINGLE
317
+ open attempt (NOT ``_open_backend_with_lock_retry``'s ~31 s retry, which would
318
+ stall ``git checkout`` — a #77-class regression) and, on ``IOException`` (lock
319
+ held ⇒ a resync is already in flight), treat it as "cannot determine — fall
320
+ through to the existing detach path unchanged": never block, never emit a
321
+ schema-mismatch error. Only a SUCCESSFUL read showing a real mismatch triggers
322
+ the loud exit. The backend is opened read-only and released before returning so
323
+ the detached child can still acquire the lock.
324
+ """
325
+ import duckdb
326
+
327
+ from sqlcg.core.config import get_backend
328
+ from sqlcg.core.schema import SCHEMA_VERSION
329
+
330
+ try:
331
+ backend = get_backend(read_only=True)
332
+ except duckdb.IOException:
333
+ # Lock held by an in-flight resync — cannot determine; fall through to detach.
334
+ return
335
+
336
+ try:
337
+ with backend:
338
+ stored_version = backend.get_schema_version()
339
+ if stored_version is None or stored_version == SCHEMA_VERSION:
340
+ # Matches (or no stored version yet on a fresh graph) — detach as today.
341
+ return
342
+ indexed_tool_version = backend.get_indexed_version()
343
+ except duckdb.IOException:
344
+ # Lock raced after the open (e.g. closed-then-reopened by the writer);
345
+ # fail soft exactly as the open-time IOException path.
346
+ return
347
+
348
+ skew = f" (graph last indexed by sqlcg {indexed_tool_version})" if indexed_tool_version else ""
349
+ print(
350
+ f"sqlcg: graph schema is v{stored_version} but this tool needs "
351
+ f"v{SCHEMA_VERSION}{skew} — the hook binary is stale. "
352
+ "Run 'sqlcg git install-hooks' to repoint the hook, then "
353
+ "'sqlcg db reset && sqlcg index <root>'.",
354
+ file=sys.stderr,
355
+ )
356
+ raise typer.Exit(1)
357
+
358
+
294
359
  def _open_backend_with_lock_retry() -> "GraphBackend":
295
360
  """Open the DuckDB backend, retrying with backoff if it is locked.
296
361
 
@@ -591,7 +591,8 @@ class SqlParser(ABC):
591
591
  case "PROCEDURE" | "FUNCTION":
592
592
  return QueryKind.CREATE_PROC
593
593
  case _:
594
- return QueryKind.CREATE_TABLE # Default to table
594
+ # non-table CREATE (sequence/stage/file format/schema/index/etc.)
595
+ return QueryKind.OTHER
595
596
  case exp.Merge():
596
597
  return QueryKind.MERGE
597
598
  case _:
@@ -1,6 +1,7 @@
1
1
  """End-to-end tests for git hook installation and execution."""
2
2
 
3
3
  import os
4
+ import shutil
4
5
  import subprocess
5
6
  import tempfile
6
7
  from pathlib import Path
@@ -86,8 +87,10 @@ def test_hook_runs_sqlcg_reindex_on_branch_checkout(temp_git_repo):
86
87
 
87
88
  hook_content = hook_path.read_text()
88
89
 
89
- # post-checkout must call sqlcg reindex --from $1 --to $2 (incremental resync)
90
- assert "sqlcg reindex" in hook_content
90
+ # post-checkout must call reindex via the run-time-resolved $SQLCG_BIN (#126/#1):
91
+ # preferred path -> command -v sqlcg -> loud error.
92
+ assert '"$SQLCG_BIN" reindex' in hook_content
93
+ assert "command -v sqlcg" in hook_content
91
94
  assert '--from "$1"' in hook_content
92
95
  assert '--to "$2"' in hook_content
93
96
  assert "--dialect auto" in hook_content
@@ -112,8 +115,8 @@ def test_idempotency_no_duplicate_hook_lines(temp_git_repo):
112
115
  assert sentinel_count == 1, f"Expected 1 sentinel, found {sentinel_count}"
113
116
 
114
117
  # All three installs should report success/idempotency
115
- hook_lines = content.count("sqlcg reindex")
116
- assert hook_lines == 1, f"Expected 1 sqlcg reindex line, found {hook_lines}"
118
+ hook_lines = content.count('"$SQLCG_BIN" reindex')
119
+ assert hook_lines == 1, f"Expected 1 reindex line, found {hook_lines}"
117
120
 
118
121
 
119
122
  # ---------------------------------------------------------------------------
@@ -147,7 +150,7 @@ def test_post_merge_hook_content_orig_head_guard(temp_git_repo):
147
150
  # The else branch must contain a reindex call without --from
148
151
  else_idx = content.index("else")
149
152
  fallback_section = content[else_idx:]
150
- assert "sqlcg reindex" in fallback_section
153
+ assert '"$SQLCG_BIN" reindex' in fallback_section
151
154
 
152
155
 
153
156
  def test_post_merge_hook_idempotent(temp_git_repo):
@@ -292,3 +295,127 @@ def test_post_merge_hook_orig_head_set_routes_with_shas(temp_git_repo):
292
295
  )
293
296
  assert "--to HEAD" in argv_recorded, f"Expected --to HEAD in argv; got: {argv_recorded!r}"
294
297
  assert "--notify" in argv_recorded
298
+
299
+
300
+ # ---------------------------------------------------------------------------
301
+ # #126 + #1 — run-time binary resolution survives a stale preferred path
302
+ # ---------------------------------------------------------------------------
303
+
304
+
305
+ def _install_hook_with_preferred_bin(repo: Path, preferred_bin: Path) -> Path:
306
+ """Install the post-checkout hook with ``preferred_bin`` rendered as the entry."""
307
+ import sqlcg.cli.commands.git as _git_mod
308
+
309
+ original = _git_mod._resolve_sqlcg_bin
310
+ _git_mod._resolve_sqlcg_bin = lambda: str(preferred_bin)
311
+ try:
312
+ runner.invoke(app, ["git", "install-hooks", "--repo", str(repo)])
313
+ finally:
314
+ _git_mod._resolve_sqlcg_bin = original
315
+ return repo / ".git" / "hooks" / "post-checkout"
316
+
317
+
318
+ def test_hook_resolves_path_binary_after_preferred_path_deleted(temp_git_repo):
319
+ """venv-rebuild sim: preferred path gone -> hook resolves a $PATH sqlcg, exit 0.
320
+
321
+ Models an editable .venv install whose embedded path is deleted by a venv
322
+ rebuild. The run-time preamble must fall back to `command -v sqlcg` and invoke
323
+ the working $PATH binary. Guards the git-hook binary-resolution plan
324
+ ([plan doc](plan/sprints/bugfix_githook_binary_resolution.md)).
325
+ """
326
+ venv_dir = temp_git_repo / ".venv" / "bin"
327
+ venv_dir.mkdir(parents=True)
328
+ preferred = venv_dir / "sqlcg"
329
+ preferred.write_text("#!/bin/sh\nexit 0\n")
330
+ preferred.chmod(0o755)
331
+
332
+ hook_path = _install_hook_with_preferred_bin(temp_git_repo, preferred)
333
+ assert f'if [ -x "{preferred}"' in hook_path.read_text()
334
+
335
+ # Simulate the venv rebuild: the preferred path no longer exists.
336
+ preferred.unlink()
337
+
338
+ # Provide a working sqlcg on $PATH that records its invocation.
339
+ path_dir = temp_git_repo / "pathbin"
340
+ path_dir.mkdir()
341
+ argv_file = temp_git_repo / "argv.txt"
342
+ path_bin = path_dir / "sqlcg"
343
+ path_bin.write_text(f'#!/bin/sh\necho "$@" >> {argv_file}\nexit 0\n')
344
+ path_bin.chmod(0o755)
345
+
346
+ env = os.environ.copy()
347
+ env["PATH"] = f"{path_dir}:{env['PATH']}"
348
+ result = subprocess.run(
349
+ ["sh", str(hook_path), "abc123", "def456", "1"],
350
+ cwd=str(temp_git_repo),
351
+ env=env,
352
+ capture_output=True,
353
+ text=True,
354
+ )
355
+
356
+ assert result.returncode == 0, result.stderr
357
+ assert argv_file.exists(), "the $PATH sqlcg binary was never invoked"
358
+ assert "reindex" in argv_file.read_text()
359
+
360
+
361
+ def test_hook_loud_error_when_no_binary_resolvable_anywhere(temp_git_repo):
362
+ """No sqlcg anywhere -> hook exits NON-ZERO with a stderr message, never silent 0.
363
+
364
+ The exact #1 failure inversion at the hook-script layer. Guards the git-hook
365
+ binary-resolution plan
366
+ ([plan doc](plan/sprints/bugfix_githook_binary_resolution.md)).
367
+ """
368
+ missing = temp_git_repo / "gone" / "sqlcg" # never created
369
+ hook_path = _install_hook_with_preferred_bin(temp_git_repo, missing)
370
+
371
+ # Run with a PATH that has the system shell dirs (so `sh`/`command` resolve)
372
+ # but no sqlcg anywhere — i.e. drop the test runner's venv/user-base dirs.
373
+ sh_bin = shutil.which("sh") or "/bin/sh"
374
+ sh_dir = str(Path(sh_bin).parent)
375
+ empty_path_dir = temp_git_repo / "emptybin"
376
+ empty_path_dir.mkdir()
377
+ env = os.environ.copy()
378
+ env["PATH"] = f"{empty_path_dir}:{sh_dir}:/usr/bin:/bin"
379
+ assert shutil.which("sqlcg", path=env["PATH"]) is None, "test setup: sqlcg still on PATH"
380
+ result = subprocess.run(
381
+ [sh_bin, str(hook_path), "abc123", "def456", "1"],
382
+ cwd=str(temp_git_repo),
383
+ env=env,
384
+ capture_output=True,
385
+ text=True,
386
+ )
387
+
388
+ assert result.returncode != 0, f"hook must exit non-zero when no binary resolves: {result!r}"
389
+ assert "cannot find the sqlcg binary" in result.stderr
390
+ assert "sqlcg git install-hooks" in result.stderr
391
+
392
+
393
+ def test_reinstall_upgrades_stale_template_hook(temp_git_repo):
394
+ """A pre-#126 fixed-path hook is auto-upgraded to the run-time-resilient template.
395
+
396
+ The self-upgrade branch (sentinel present, body differs -> overwrite) rewrites a
397
+ stale v1.33.1-era hook and prints 'Upgraded git hook:'. Guards the git-hook
398
+ binary-resolution plan
399
+ ([plan doc](plan/sprints/bugfix_githook_binary_resolution.md)).
400
+ """
401
+ hooks_dir = temp_git_repo / ".git" / "hooks"
402
+ hooks_dir.mkdir(parents=True, exist_ok=True)
403
+ stale = hooks_dir / "post-checkout"
404
+ # Old v1.33.1-era template: fixed embedded literal, no run-time preamble.
405
+ stale.write_text(
406
+ "#!/bin/sh\n"
407
+ "# sqlcg post-checkout hook — incremental resync after branch switch\n"
408
+ '[ "$3" = "1" ] || exit 0\n'
409
+ '/old/path/sqlcg reindex --from "$1" --to "$2" "$(git rev-parse --show-toplevel)"'
410
+ " --dialect auto --quiet --notify\n"
411
+ )
412
+ stale.chmod(0o755)
413
+
414
+ result = runner.invoke(app, ["git", "install-hooks", "--repo", str(temp_git_repo)])
415
+
416
+ assert result.exit_code == 0
417
+ assert "Upgraded git hook:" in result.output
418
+ upgraded = stale.read_text()
419
+ assert "command -v sqlcg" in upgraded
420
+ assert '"$SQLCG_BIN" reindex' in upgraded
421
+ assert "/old/path/sqlcg reindex" not in upgraded
@@ -0,0 +1,88 @@
1
+ """Coverage no-regression: non-table CREATE DDL is excluded from write-kind metrics.
2
+
3
+ Pins blast-radius item #7 of the create-kind mislabel bugfix
4
+ ([plan doc](plan/sprints/bugfix_create_kind_mislabel.md), AC4).
5
+
6
+ ``_WRITE_KINDS = ("INSERT", "MERGE", "CREATE_TABLE", "UPDATE")`` drives
7
+ ``total_write_queries`` and ``zero_edge_write_queries``. Before the fix a
8
+ ``CREATE SEQUENCE`` was stored as ``CREATE_TABLE`` and so inflated both counters
9
+ (it carries no COLUMN_LINEAGE, so it counted as a "zero-edge write" — a false
10
+ unresolved-write gap). After the fix it classifies as ``OTHER`` and drops out of
11
+ the write population. This is an honest-accounting correction, not a regression.
12
+
13
+ Observable oracle: ``collect_coverage`` routed to the in-memory graph returns the
14
+ write counts that exclude the sequence; an independent kind census on the same
15
+ graph confirms the sequence is stored as ``OTHER``.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ from unittest.mock import patch
21
+
22
+ import pytest
23
+
24
+ from sqlcg.cli.coverage import collect_coverage
25
+ from sqlcg.core.duckdb_backend import DuckDBBackend
26
+ from sqlcg.indexer.indexer import Indexer
27
+
28
+
29
+ @pytest.fixture
30
+ def indexed_db(tmp_path):
31
+ """Index a repo with one resolvable INSERT, one CREATE TABLE, one CREATE SEQUENCE.
32
+
33
+ Expected write population (kind IN _WRITE_KINDS):
34
+ * ba.src — CREATE TABLE (zero COLUMN_LINEAGE → a zero-edge write)
35
+ * ba.dst — INSERT … SELECT (has COLUMN_LINEAGE)
36
+ The CREATE SEQUENCE classifies as OTHER → NOT in the write population.
37
+ """
38
+ db = DuckDBBackend(":memory:")
39
+ db.init_schema()
40
+ repo = tmp_path / "repo"
41
+ repo.mkdir()
42
+ (repo / "src.sql").write_text("CREATE TABLE ba.src (a INT);\n")
43
+ (repo / "ins.sql").write_text("INSERT INTO ba.dst SELECT a FROM ba.src;\n")
44
+ (repo / "seq.sql").write_text("CREATE SEQUENCE ba.s START 1;\n")
45
+ Indexer().index_repo(repo, dialect="snowflake", db=db, use_git=False)
46
+ yield db
47
+ db.close()
48
+
49
+
50
+ def _collect(db: DuckDBBackend):
51
+ def _routed(query: str, params: dict):
52
+ return db.run_read(query, params)
53
+
54
+ with patch("sqlcg.cli.coverage.run_read_routed", side_effect=_routed):
55
+ return collect_coverage()
56
+
57
+
58
+ def test_sequence_excluded_from_total_write_queries(indexed_db):
59
+ """total_write_queries counts only INSERT + CREATE TABLE, not the CREATE SEQUENCE."""
60
+ stats = _collect(indexed_db)
61
+ assert stats is not None
62
+ assert stats.total_write_queries == 2, (
63
+ "total_write_queries must count only the INSERT and the CREATE TABLE "
64
+ f"(the CREATE SEQUENCE is OTHER, excluded); got {stats.total_write_queries}. "
65
+ "A value of 3 means the sequence was mislabeled CREATE_TABLE again."
66
+ )
67
+
68
+
69
+ def test_sequence_does_not_inflate_zero_edge_write_queries(indexed_db):
70
+ """zero_edge_write_queries reflects only the genuine zero-edge CREATE TABLE.
71
+
72
+ The CREATE SEQUENCE has zero COLUMN_LINEAGE; before the fix it would have
73
+ counted here as a false unresolved-write. Expected = 1 (the CREATE TABLE
74
+ 'ba.src' DDL with no SELECT body), not 2.
75
+ """
76
+ stats = _collect(indexed_db)
77
+ assert stats is not None
78
+ assert stats.zero_edge_write_queries == 1, (
79
+ "zero_edge_write_queries must be 1 (the CREATE TABLE DDL only); "
80
+ f"got {stats.zero_edge_write_queries}. A value of 2 means the sequence "
81
+ "was counted as a zero-edge write (the inflation this fix removes)."
82
+ )
83
+
84
+
85
+ def test_sequence_stored_as_other_kind(indexed_db):
86
+ """Independent oracle: the sequence statement is stored as kind=OTHER."""
87
+ rows = indexed_db.run_read('SELECT kind FROM "SqlQuery" WHERE id LIKE ?', {"id": "%seq.sql:0"})
88
+ assert rows and rows[0]["kind"] == "OTHER", f"sequence must be stored as OTHER; got {rows}"