sql-code-graph 1.35.0__tar.gz → 1.35.1__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 (606) hide show
  1. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/PKG-INFO +1 -1
  2. sql_code_graph-1.35.1/plan/metrics/pr_b_phantom_after.json +32 -0
  3. sql_code_graph-1.35.1/plan/metrics/pr_b_phantom_before.json +32 -0
  4. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/pyproject.toml +1 -1
  5. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/__init__.py +1 -1
  6. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/ansi_parser.py +35 -16
  7. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_non_table_create_kind_in_graph.py +35 -30
  8. sql_code_graph-1.35.1/tests/integration/test_phantom_non_table_create_node.py +80 -0
  9. sql_code_graph-1.35.1/tests/unit/test_phantom_non_table_create_source.py +149 -0
  10. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/uv.lock +1 -1
  11. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/api-documenter.md +0 -0
  12. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/architect-planner.md +0 -0
  13. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/architect-reviewer.md +0 -0
  14. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/code-reviewer.md +0 -0
  15. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/developer.md +0 -0
  16. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/plan-reviewer.md +0 -0
  17. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/sprint-planner.md +0 -0
  18. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  21. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/benchmark.yml +0 -0
  22. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/e2e-tests.yml +0 -0
  23. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/release.yml +0 -0
  24. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/test.yml +0 -0
  25. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.gitignore +0 -0
  26. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.pre-commit-config.yaml +0 -0
  27. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.sqlcgignore +0 -0
  28. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/ARCHITECTURE_REVIEW.md +0 -0
  29. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  30. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/CHANGELOG.md +0 -0
  31. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/CLAUDE.md +0 -0
  32. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/README.md +0 -0
  33. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  34. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/cli.md +0 -0
  35. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/getting-started.md +0 -0
  36. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/releasing-pypi.md +0 -0
  37. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/e2e_firstuser_report.md +0 -0
  38. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/e2e_run_20260528_101413.output +0 -0
  39. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/main.py +0 -0
  40. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/WORKFLOW.md +0 -0
  41. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  42. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  43. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr4_transform_kinds.json +0 -0
  44. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  45. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  46. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  47. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/createkind_dwh_after.json +0 -0
  48. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/createkind_dwh_before.json +0 -0
  49. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  50. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  51. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  52. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  53. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  54. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  55. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  56. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/pr4_star_promote_after.json +0 -0
  57. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/pr4_star_promote_before.json +0 -0
  58. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_with_schema.json +0 -0
  59. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_without_schema.json +0 -0
  60. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  61. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  62. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  63. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/column_coverage_diagnostic.md +0 -0
  64. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/column_coverage_findings.md +0 -0
  65. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/dwh_graph_analysis.md +0 -0
  66. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  67. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/feature_acceptance_dwh.md +0 -0
  68. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  69. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/island_lever_live_verification.md +0 -0
  70. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  71. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  72. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  73. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  74. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  75. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/sprint_3.1_postmortem.md +0 -0
  76. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  77. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/blueprint.md +0 -0
  78. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  79. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/investigation_e5_e4.md +0 -0
  80. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  81. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/parse_diagnostics.md +0 -0
  82. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/parsing_errors_experiment.md +0 -0
  83. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/snowflake_en_test_suite.md +0 -0
  84. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  85. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/sqlcg.md +0 -0
  86. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/bundle_claude_skill.md +0 -0
  87. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  88. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/column_lineage_recall_metric.md +0 -0
  89. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  90. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  91. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_parse_failures.md +0 -0
  92. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/diff-impact-producer-file.md +0 -0
  93. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/e8_dual_emission.md +0 -0
  94. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  95. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  96. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  97. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  98. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  99. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_downstream_sink_location.md +0 -0
  100. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  101. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  102. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_firstuser_findings.md +0 -0
  103. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  104. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  105. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/gain_coverage_metrics.md +0 -0
  106. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  107. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  108. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  109. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  110. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  111. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/living_codebase_resync.md +0 -0
  112. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/mcp_server_self_healing.md +0 -0
  113. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  114. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_01.md +0 -0
  115. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  116. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_02.md +0 -0
  117. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  118. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_03.md +0 -0
  119. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_04_column_lineage.md +0 -0
  120. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  121. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_05_star_resolution.md +0 -0
  122. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  123. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  124. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  125. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  126. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  127. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  128. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  129. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  130. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  131. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  132. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  133. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/temp_table_namespacing.md +0 -0
  134. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/trust_layer.md +0 -0
  135. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/unfilled_table_impact.md +0 -0
  136. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  137. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  138. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  139. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  140. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_1_2_bugfix.md +0 -0
  141. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  142. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  143. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_2_1_bugfix.md +0 -0
  144. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/version-parity-and-restart.md +0 -0
  145. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/profile.html +0 -0
  146. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/pyrightconfig.json +0 -0
  147. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/collect_parse_errors.py +0 -0
  148. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/column_coverage_check.py +0 -0
  149. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/generate_cli_docs.sh +0 -0
  150. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/__main__.py +0 -0
  151. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/__init__.py +0 -0
  152. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/__init__.py +0 -0
  153. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/analyze.py +0 -0
  154. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/catalog.py +0 -0
  155. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/db.py +0 -0
  156. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/find.py +0 -0
  157. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/gain.py +0 -0
  158. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/git.py +0 -0
  159. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/index.py +0 -0
  160. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/install.py +0 -0
  161. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/mcp.py +0 -0
  162. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/reindex.py +0 -0
  163. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/report.py +0 -0
  164. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/uninstall.py +0 -0
  165. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/viz.py +0 -0
  166. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/watch.py +0 -0
  167. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/coverage.py +0 -0
  168. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/main.py +0 -0
  169. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/__init__.py +0 -0
  170. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/config.py +0 -0
  171. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/duckdb_backend.py +0 -0
  172. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/freshness.py +0 -0
  173. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/graph_db.py +0 -0
  174. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/jobs.py +0 -0
  175. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/noise_match.py +0 -0
  176. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.cypher +0 -0
  177. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.py +0 -0
  178. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.sql +0 -0
  179. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/schema.cypher +0 -0
  180. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/schema.py +0 -0
  181. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/__init__.py +0 -0
  182. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  183. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/error_classify.py +0 -0
  184. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/git_delta.py +0 -0
  185. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/indexer.py +0 -0
  186. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/pool.py +0 -0
  187. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/walker.py +0 -0
  188. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/watcher.py +0 -0
  189. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/__init__.py +0 -0
  190. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/aggregator.py +0 -0
  191. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/schema_resolver.py +0 -0
  192. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/metrics/__init__.py +0 -0
  193. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/metrics/store.py +0 -0
  194. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/__init__.py +0 -0
  195. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/base.py +0 -0
  196. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  197. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/postgres_parser.py +0 -0
  198. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/registry.py +0 -0
  199. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  200. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/tsql_parser.py +0 -0
  201. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/__init__.py +0 -0
  202. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/control.py +0 -0
  203. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/exceptions.py +0 -0
  204. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/models.py +0 -0
  205. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/noise_filter.py +0 -0
  206. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/read_client.py +0 -0
  207. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/selfheal.py +0 -0
  208. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/server.py +0 -0
  209. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/skill.py +0 -0
  210. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/tools.py +0 -0
  211. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/writer.py +0 -0
  212. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/__init__.py +0 -0
  213. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/hashing.py +0 -0
  214. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/ignore.py +0 -0
  215. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/logging.py +0 -0
  216. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/__init__.py +0 -0
  217. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/assets/force-graph.min.js +0 -0
  218. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/assets/template.html +0 -0
  219. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/data.py +0 -0
  220. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/render.py +0 -0
  221. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/tags.py +0 -0
  222. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/__init__.py +0 -0
  223. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/__init__.py +0 -0
  224. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/adversarial/200_join.sql +0 -0
  225. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/adversarial/500_union.sql +0 -0
  226. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/bench_indexer.py +0 -0
  227. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/conftest.py +0 -0
  228. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  229. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  230. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  231. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  232. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  233. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  234. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  235. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  236. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  237. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  238. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q01.sql +0 -0
  239. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q02.sql +0 -0
  240. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q03.sql +0 -0
  241. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q04.sql +0 -0
  242. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q05.sql +0 -0
  243. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/conftest.py +0 -0
  244. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/__init__.py +0 -0
  245. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/conftest.py +0 -0
  246. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  247. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_airbnb_e2e.py +0 -0
  248. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_cli_index.py +0 -0
  249. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  250. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_git_hook_install.py +0 -0
  251. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_golden_lineage.py +0 -0
  252. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_mcp_lifecycle.py +0 -0
  253. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_mcp_tools.py +0 -0
  254. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  255. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  256. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_selfheal_e2e.py +0 -0
  257. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_star_resolution_e2e.py +0 -0
  258. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_viz_cli_e2e.py +0 -0
  259. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_watch.py +0 -0
  260. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  261. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  262. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  263. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  264. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  265. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  266. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  267. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  268. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_listings.sql +0 -0
  269. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  270. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/bigquery/.gitkeep +0 -0
  271. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  272. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  273. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  274. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  275. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/base_tables.sql +0 -0
  276. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/reports.sql +0 -0
  277. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/views.sql +0 -0
  278. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  279. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  280. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  281. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  282. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/base_tables.sql +0 -0
  283. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/reports.sql +0 -0
  284. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/views.sql +0 -0
  285. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/__init__.py +0 -0
  286. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/__init__.py +0 -0
  287. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/test_insert_select.py +0 -0
  288. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  289. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_T34_presentation_segregation.py +0 -0
  290. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_T35_external_consumers.py +0 -0
  291. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_analyze_case_fold.py +0 -0
  292. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_anchor_tools.py +0 -0
  293. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_backfill_impact_consistency.py +0 -0
  294. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  295. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_bulk_upsert.py +0 -0
  296. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_case_split_seed_regression.py +0 -0
  297. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  298. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_catalog_load_integration.py +0 -0
  299. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  300. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_column_coverage_patterns.py +0 -0
  301. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_column_lineage_e2e.py +0 -0
  302. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_coverage_metrics_integration.py +0 -0
  303. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cross_file_lineage.py +0 -0
  304. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  305. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_recall_guard.py +0 -0
  306. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  307. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_source_node_invariant.py +0 -0
  308. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_dialect_auto_resolution.py +0 -0
  309. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_dialect_matrix.py +0 -0
  310. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_duckdb_parity.py +0 -0
  311. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  312. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  313. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  314. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_freshness_mcp.py +0 -0
  315. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_gating_join_retrofit.py +0 -0
  316. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  317. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_identity_counters_integration.py +0 -0
  318. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_impact_consumer_parity.py +0 -0
  319. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_index_degraded_files_metric.py +0 -0
  320. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  321. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_batching.py +0 -0
  322. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_commits.py +0 -0
  323. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_to_graph.py +0 -0
  324. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  325. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_join_col_resolution.py +0 -0
  326. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  327. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_live_anchors.py +0 -0
  328. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_mvcc_rebuild.py +0 -0
  329. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
  330. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_parse_diagnostics.py +0 -0
  331. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr1_confidence_reason.py +0 -0
  332. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr2_source_location.py +0 -0
  333. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr3_kind_tagging.py +0 -0
  334. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr_impact_integration.py +0 -0
  335. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_qualify_failed_persist.py +0 -0
  336. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_read_via_server.py +0 -0
  337. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_readonly_under_lock.py +0 -0
  338. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_reindex_via_server.py +0 -0
  339. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  340. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  341. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_resync.py +0 -0
  342. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_completeness.py +0 -0
  343. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  344. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_subscope_source.py +0 -0
  345. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_single_writer_queue.py +0 -0
  346. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_skip_counts_integration.py +0 -0
  347. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_star_promote_temp_columns.py +0 -0
  348. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_star_resolution.py +0 -0
  349. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_temp_table_lineage.py +0 -0
  350. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_temp_table_namespacing.py +0 -0
  351. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  352. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  353. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_usage_derived_catalog.py +0 -0
  354. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  355. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_user_surface_recall_guard.py +0 -0
  356. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_v141_surface_guards.py +0 -0
  357. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  358. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_view_kind_in_graph.py +0 -0
  359. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_viz_data_build.py +0 -0
  360. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_write_memory_ceiling.py +0 -0
  361. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/perf/__init__.py +0 -0
  362. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/perf/test_perf.py +0 -0
  363. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E10/__init__.py +0 -0
  364. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E11/__init__.py +0 -0
  365. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/__init__.py +0 -0
  366. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/e12_json_path.sql +0 -0
  367. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  368. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/test_e12.py +0 -0
  369. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E13/__init__.py +0 -0
  370. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E14/__init__.py +0 -0
  371. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E15/__init__.py +0 -0
  372. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/__init__.py +0 -0
  373. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/e16_merge.sql +0 -0
  374. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  375. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/test_e16.py +0 -0
  376. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E17/__init__.py +0 -0
  377. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/__init__.py +0 -0
  378. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_decode.sql +0 -0
  379. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  380. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  381. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/test_e18.py +0 -0
  382. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E19/__init__.py +0 -0
  383. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/__init__.py +0 -0
  384. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  385. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  386. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  387. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/test_e2.py +0 -0
  388. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E20/__init__.py +0 -0
  389. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/__init__.py +0 -0
  390. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  391. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  392. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/test_e21.py +0 -0
  393. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E22/__init__.py +0 -0
  394. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/__init__.py +0 -0
  395. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  396. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  397. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/test_e23.py +0 -0
  398. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E24/__init__.py +0 -0
  399. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/__init__.py +0 -0
  400. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  401. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/e25_two_part.sql +0 -0
  402. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/test_e25.py +0 -0
  403. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  404. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E26/__init__.py +0 -0
  405. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/__init__.py +0 -0
  406. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  407. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/e27_udf.sql +0 -0
  408. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/test_e27.py +0 -0
  409. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E28/__init__.py +0 -0
  410. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E29/__init__.py +0 -0
  411. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/__init__.py +0 -0
  412. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  413. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  414. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  415. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/test_e3.py +0 -0
  416. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E30/__init__.py +0 -0
  417. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E31/__init__.py +0 -0
  418. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E32/__init__.py +0 -0
  419. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E33/__init__.py +0 -0
  420. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E34/__init__.py +0 -0
  421. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E35/__init__.py +0 -0
  422. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/__init__.py +0 -0
  423. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  424. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  425. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/test_e36.py +0 -0
  426. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  427. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E37/__init__.py +0 -0
  428. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E38/__init__.py +0 -0
  429. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/__init__.py +0 -0
  430. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  431. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  432. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  433. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  434. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/test_e4.py +0 -0
  435. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/__init__.py +0 -0
  436. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  437. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  438. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  439. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/test_e5.py +0 -0
  440. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  441. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/__init__.py +0 -0
  442. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  443. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  444. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_uuid.sql +0 -0
  445. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/test_e8.py +0 -0
  446. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E9/__init__.py +0 -0
  447. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/__init__.py +0 -0
  448. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  449. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  450. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  451. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  452. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/__init__.py +0 -0
  453. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  454. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  455. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  456. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  457. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  458. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/README.md +0 -0
  459. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/__init__.py +0 -0
  460. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/__init__.py +0 -0
  461. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  462. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  463. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  464. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_source.sql +0 -0
  465. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  466. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  467. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/conftest.py +0 -0
  468. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/test_plan_review_gates.py +0 -0
  469. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/__init__.py +0 -0
  470. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/__init__.py +0 -0
  471. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  472. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  473. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  474. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  475. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_install_skill.py +0 -0
  476. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_skill_render.py +0 -0
  477. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_uninstall_skill.py +0 -0
  478. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_01_qualify_once.py +0 -0
  479. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  480. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  481. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  482. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T35_config_external_consumers.py +0 -0
  483. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_aggregator.py +0 -0
  484. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_aggregator_skip.py +0 -0
  485. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_analyze_case_fold.py +0 -0
  486. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_base_parser.py +0 -0
  487. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_branch_monitor.py +0 -0
  488. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  489. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_canonical_target_resolution.py +0 -0
  490. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_catalog_csv_parsing.py +0 -0
  491. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_catalog_missing_warning.py +0 -0
  492. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_classify_non_table_create_kind.py +0 -0
  493. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli.py +0 -0
  494. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  495. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli_help.py +0 -0
  496. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  497. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_closure_depth.py +0 -0
  498. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_column_lineage_wiring.py +0 -0
  499. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_config.py +0 -0
  500. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_coverage_metrics.py +0 -0
  501. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cte_key_namespacing.py +0 -0
  502. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cte_source_gap_metric.py +0 -0
  503. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_data_models.py +0 -0
  504. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_info.py +0 -0
  505. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_info_coverage.py +0 -0
  506. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  507. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_doc_links.py +0 -0
  508. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  509. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_dominant_cause.py +0 -0
  510. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_duckdb_backend.py +0 -0
  511. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_duckdb_backend_shared.py +0 -0
  512. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  513. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e8_dual_emission.py +0 -0
  514. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  515. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_empty_propagation_unit.py +0 -0
  516. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_extract_select_output_columns.py +0 -0
  517. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_file_ignore_defaults.py +0 -0
  518. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_find_cmd.py +0 -0
  519. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_firstuser_findings.py +0 -0
  520. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_freshness_helper.py +0 -0
  521. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gain_coverage.py +0 -0
  522. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gain_ratio.py +0 -0
  523. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  524. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_delta.py +0 -0
  525. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_hooks.py +0 -0
  526. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_hooks_notify.py +0 -0
  527. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_graph_backend.py +0 -0
  528. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_graph_completeness_invariant.py +0 -0
  529. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hard_kill_pool.py +0 -0
  530. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  531. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hook_reindex_detach.py +0 -0
  532. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hygiene_config_warning.py +0 -0
  533. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_identity_counters.py +0 -0
  534. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_include_working_tree.py +0 -0
  535. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_cmd.py +0 -0
  536. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_filter_config.py +0 -0
  537. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_flags.py +0 -0
  538. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_progress.py +0 -0
  539. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  540. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_indexer_progress.py +0 -0
  541. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_indexer_quality.py +0 -0
  542. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_install.py +0 -0
  543. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_install_message.py +0 -0
  544. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  545. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_jobs.py +0 -0
  546. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_join_col_resolve_marker.py +0 -0
  547. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_judgement.py +0 -0
  548. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_lineage_conversion.py +0 -0
  549. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_literal_column_skip.py +0 -0
  550. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_best_practices.py +0 -0
  551. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_control.py +0 -0
  552. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  553. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_metrics.py +0 -0
  554. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_noise_filter.py +0 -0
  555. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_normalize_keys.py +0 -0
  556. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_failed_classification.py +0 -0
  557. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  558. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_quality.py +0 -0
  559. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parser.py +0 -0
  560. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_perf_scaling_guard.py +0 -0
  561. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr07_observability.py +0 -0
  562. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  563. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr_impact_unit.py +0 -0
  564. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_qualify_failed_unit.py +0 -0
  565. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_queries_loader.py +0 -0
  566. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_read_client.py +0 -0
  567. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  568. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  569. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  570. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  571. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_schema_resolver.py +0 -0
  572. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  573. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_detector.py +0 -0
  574. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  575. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_reexec.py +0 -0
  576. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_watcher.py +0 -0
  577. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_server.py +0 -0
  578. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_skip_counts_persistence.py +0 -0
  579. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  580. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  581. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_star_resolution_unit.py +0 -0
  582. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_star_schema_unit.py +0 -0
  583. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_submit_feedback.py +0 -0
  584. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_subprocess_isolate.py +0 -0
  585. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  586. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_t03_ddl_skip.py +0 -0
  587. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_temp_table_namespacing.py +0 -0
  588. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_timeout_cancel.py +0 -0
  589. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tool_version_stamp.py +0 -0
  590. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tools_hints.py +0 -0
  591. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tools_warnings.py +0 -0
  592. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_transform_kind_classification.py +0 -0
  593. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_uninstall.py +0 -0
  594. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  595. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_unqualified_fallback.py +0 -0
  596. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_upsert_batch_invariant.py +0 -0
  597. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_use_schema_session_context.py +0 -0
  598. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_version_parity.py +0 -0
  599. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_view_classification.py +0 -0
  600. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_config_schemas.py +0 -0
  601. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_facets.py +0 -0
  602. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_render_self_contained.py +0 -0
  603. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_walker.py +0 -0
  604. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_watcher.py +0 -0
  605. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_worker_error_classification.py +0 -0
  606. {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/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.0
3
+ Version: 1.35.1
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,32 @@
1
+ {"total_calls": 1476, "last_7d_calls": 1476, "index_runs": 5, "feedback_tp": 0,
2
+ "feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 496},
3
+ {"name": "trace_column_lineage", "count": 389}, {"name":
4
+ "list_dialects_and_repos", "count": 127}], "execute_sql_ratio": 0.34,
5
+ "parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
6
+ "coverage": {"catalogued_tables": 5800, "total_tables": 6552, "good_edges":
7
+ 52657, "total_edges": 60805, "phantom_edges": 12241, "blindspot_tables": 628,
8
+ "good_edges_strict": 48140, "edge_health_strict_pct": 79.17,
9
+ "good_edges_scoped": 37460, "total_edges_scoped": 38009,
10
+ "edge_health_scoped_pct": 98.56, "phantom_confirmed": 11701,
11
+ "phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
12
+ [{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
13
+ "ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
14
+ "ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
15
+ "da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
16
+ "da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
17
+ "wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
18
+ "da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
19
+ "bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19},
20
+ {"table": "da.hthyb_page_brandplacement", "bad_edges": 17}],
21
+ "blindspot_tables_for_80pct": 17, "files_indexed": 1335, "indexed_sha":
22
+ "fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path":
23
+ "/tmp/sqlcg-gain-after.db", "index_timestamp": 1781466521.041257,
24
+ "degraded_parse_total": 5189, "degraded_parse_queries": 20,
25
+ "degraded_parse_by_dir": {"etl": {"degraded": 1, "total": 2776}, "ddl":
26
+ {"degraded": 19, "total": 2413}}, "zero_edge_write_queries": 1034,
27
+ "total_write_queries": 2323, "cte_key_collisions": 0,
28
+ "rescuable_unqualified_edges": 125, "info_schema_has_column_rows": 100193,
29
+ "cte_source_gap_writes": 0, "resolvable_write_col_edges": 36936,
30
+ "transitive_col_edges": 4168, "qualify_failed_statements": 9,
31
+ "tool_version_stale": false, "indexed_tool_version": "1.34.5",
32
+ "running_tool_version": "1.34.5"}}
@@ -0,0 +1,32 @@
1
+ {"total_calls": 1476, "last_7d_calls": 1476, "index_runs": 5, "feedback_tp": 0,
2
+ "feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 496},
3
+ {"name": "trace_column_lineage", "count": 389}, {"name":
4
+ "list_dialects_and_repos", "count": 127}], "execute_sql_ratio": 0.34,
5
+ "parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
6
+ "coverage": {"catalogued_tables": 5800, "total_tables": 6581, "good_edges":
7
+ 52669, "total_edges": 60817, "phantom_edges": 12241, "blindspot_tables": 628,
8
+ "good_edges_strict": 48140, "edge_health_strict_pct": 79.16,
9
+ "good_edges_scoped": 37460, "total_edges_scoped": 38009,
10
+ "edge_health_scoped_pct": 98.56, "phantom_confirmed": 11701,
11
+ "phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
12
+ [{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
13
+ "ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
14
+ "ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
15
+ "da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
16
+ "da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
17
+ "wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
18
+ "da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
19
+ "bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19},
20
+ {"table": "da.hthyb_page_brandplacement", "bad_edges": 17}],
21
+ "blindspot_tables_for_80pct": 17, "files_indexed": 1335, "indexed_sha":
22
+ "fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path":
23
+ "/tmp/sqlcg-gain-before.db", "index_timestamp": 1781466329.8251324,
24
+ "degraded_parse_total": 5189, "degraded_parse_queries": 20,
25
+ "degraded_parse_by_dir": {"etl": {"degraded": 1, "total": 2776}, "ddl":
26
+ {"degraded": 19, "total": 2413}}, "zero_edge_write_queries": 1034,
27
+ "total_write_queries": 2323, "cte_key_collisions": 0,
28
+ "rescuable_unqualified_edges": 125, "info_schema_has_column_rows": 100193,
29
+ "cte_source_gap_writes": 0, "resolvable_write_col_edges": 36936,
30
+ "transitive_col_edges": 4180, "qualify_failed_statements": 9,
31
+ "tool_version_stale": false, "indexed_tool_version": "1.34.4",
32
+ "running_tool_version": "1.34.4"}}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sql-code-graph"
7
- version = "1.35.0"
7
+ version = "1.35.1"
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.0"
3
+ __version__ = "1.35.1"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -551,25 +551,44 @@ class AnsiParser(SqlParser):
551
551
  # measurement artifact (96.1%/4,544 of 4,727 on the DWH corpus).
552
552
  can_have_lineage = self._can_have_column_lineage(stmt)
553
553
 
554
+ # Phantom source-node gate (#161): a non-table/non-view CREATE
555
+ # (SEQUENCE / STAGE / FILE FORMAT / SCHEMA / INDEX / PROCEDURE / ...) has
556
+ # target=None and no data-flow source. Its only Table node is its own
557
+ # object name, which _fallback_table_scan below would otherwise scoop into
558
+ # `sources`, leaking a phantom SqlTable SOURCE node + SELECTS_FROM edge
559
+ # into the graph. #159 fixed the kind LABEL (-> OTHER); this closes the
560
+ # source-node half. Keying off stmt.kind (the sqlglot AST value, e.g.
561
+ # 'SEQUENCE') keeps the gate independent of the _classify/QueryKind path.
562
+ # CREATE TABLE/VIEW ... AS SELECT keep kind in (TABLE, VIEW) and so retain
563
+ # their real sources. Real procedure lineage comes from the spliced inner
564
+ # DML (a separate node the gate never touches), so gating PROCEDURE is
565
+ # edge-neutral. This single gate feeds all three
566
+ # `referenced_tables.extend(query_node.sources)` sites
567
+ # (ansi_parser.py:246, snowflake_parser.py:784 / :944).
568
+ is_non_table_create = isinstance(stmt, exp.Create) and stmt.kind not in ("TABLE", "VIEW")
569
+
554
570
  # Try to extract table references using scope analysis
555
571
  try:
556
- # Use pre-built scope if provided, otherwise build it here (fallback)
557
- root_scope = scope
558
- if root_scope is None:
559
- from sqlglot.optimizer.scope import build_scope
560
-
561
- root_scope = build_scope(stmt)
562
-
563
- if root_scope:
564
- sources = self._real_tables(root_scope)
572
+ if is_non_table_create:
573
+ sources = []
565
574
  else:
566
- # Fallback to basic table extraction
567
- sources = [
568
- r
569
- for s in self._fallback_table_scan(stmt)
570
- if (r := self._apply_table_alias(s)) is not None
571
- ]
572
- parse_failed = can_have_lineage
575
+ # Use pre-built scope if provided, otherwise build it here (fallback)
576
+ root_scope = scope
577
+ if root_scope is None:
578
+ from sqlglot.optimizer.scope import build_scope
579
+
580
+ root_scope = build_scope(stmt)
581
+
582
+ if root_scope:
583
+ sources = self._real_tables(root_scope)
584
+ else:
585
+ # Fallback to basic table extraction
586
+ sources = [
587
+ r
588
+ for s in self._fallback_table_scan(stmt)
589
+ if (r := self._apply_table_alias(s)) is not None
590
+ ]
591
+ parse_failed = can_have_lineage
573
592
  except Exception as exc:
574
593
  logger.debug("Failed to build scope for statement %d in %s: %s", stmt_index, path, exc)
575
594
  sources = [
@@ -10,11 +10,14 @@ Scope (RESCOPED, kind-only — plan §Scope):
10
10
  * AC3 — the ``analyze impact`` query (analyze.py:317 shape) renders the
11
11
  sequence's producing statement as ``kind=OTHER`` not ``CREATE_TABLE``.
12
12
 
13
- Explicitly OUT OF SCOPE (plan Follow-up §, blast-radius row #1b): the sequence
14
- name persists as a ``SqlTable`` source node via the kind-independent
15
- ``referenced_tables`` → ``indexer.py`` source loop. This fix corrects only the
16
- stored kind; it does NOT remove that phantom node. No assertion here claims the
17
- node is absent.
13
+ Originally OUT OF SCOPE for #159 (plan Follow-up §, blast-radius row #1b): the
14
+ sequence name persisted as a ``SqlTable`` source node via the kind-independent
15
+ ``referenced_tables`` → ``indexer.py`` source loop. **That phantom node has since
16
+ been removed by the PR-B source-gate (#161)**
17
+ ([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md)). The two tests
18
+ below that previously asserted the phantom SELECTS_FROM edge / ``ba.s`` node
19
+ *exists* have been flipped to assert its *absence* — the corrected post-#161
20
+ graph shape. The kind-only assertions (AC1/AC2) are unchanged.
18
21
  """
19
22
 
20
23
  import pytest
@@ -87,13 +90,14 @@ def test_ctas_still_create_table(indexed, db):
87
90
  )
88
91
 
89
92
 
90
- def test_sequence_produces_selects_from_edge(indexed, db):
91
- """The sequence statement carries a SELECTS_FROM edge to its name node.
93
+ def test_sequence_produces_no_phantom_selects_from_edge(indexed, db):
94
+ """Post-#161: the sequence statement carries NO phantom SELECTS_FROM edge.
92
95
 
93
- This is the live shape behind the bug a non-table CREATE that has a
94
- SELECTS_FROM edge yet was mislabeled CREATE_TABLE. Asserting the edge exists
95
- proves the reclassified statement is exactly the kind that leaked into
96
- ``analyze impact`` (NOT a statement with no edges).
96
+ Before PR-B (#161) the sequence's own name ``ba.s`` was scooped into
97
+ ``sources`` and emitted as a ``SELECTS_FROM`` edge from the producing
98
+ statement to a phantom ``ba.s`` SqlTable node. The source-gate suppresses
99
+ this, so no SELECTS_FROM edge points at ``ba.s`` any longer. (Flipped from the
100
+ pre-#161 assertion that the edge existed — see module docstring.)
97
101
  """
98
102
  rows = db.run_read(
99
103
  'SELECT q.id AS id, q.kind AS kind FROM "SqlQuery" q '
@@ -101,21 +105,28 @@ def test_sequence_produces_selects_from_edge(indexed, db):
101
105
  "WHERE sf.dst_key = ?",
102
106
  {"dst": "ba.s"},
103
107
  )
104
- assert len(rows) == 1, f"expected one SELECTS_FROM producer for ba.s, got {rows}"
105
- assert rows[0]["kind"] == "OTHER", (
106
- f"the sequence statement with a SELECTS_FROM edge must be kind=OTHER, "
107
- f"got {rows[0]['kind']!r}"
108
- )
108
+ assert rows == [], f"phantom SELECTS_FROM edge to ba.s should be gone, got {rows}"
109
109
 
110
110
 
111
- def test_analyze_impact_renders_sequence_as_other(indexed, db, monkeypatch):
112
- """AC3: ``analyze impact ba.s`` renders the producing statement kind=OTHER.
111
+ def test_sequence_name_is_not_a_sqltable_node(indexed, db):
112
+ """Post-#161: the sequence object name is not emitted as a SqlTable node.
113
113
 
114
- Runs the exact analyze.py:317 query shape against the indexed graph and the
115
- CLI render path; asserts the kind column shows OTHER, never CREATE_TABLE.
116
- No assertion is made about the ba.s SqlTable node's existence (out of scope).
114
+ The phantom ``ba.s`` SqlTable node previously created by the kind-independent
115
+ source loop is removed by the PR-B source-gate (#161).
117
116
  """
118
- # Direct query (analyze.py:317 shape) observable kind on the producer row.
117
+ rows = db.run_read('SELECT qualified FROM "SqlTable" WHERE qualified = ?', {"q": "ba.s"})
118
+ assert rows == [], f"phantom SqlTable node ba.s should be gone, got {rows}"
119
+
120
+
121
+ def test_analyze_impact_sequence_node_absent(indexed, db, monkeypatch):
122
+ """Post-#161: ``analyze impact ba.s`` finds no phantom producer.
123
+
124
+ The phantom ``ba.s`` node and its SELECTS_FROM edge are removed, so the
125
+ analyze.py:317 query shape returns no rows for ``ba.s`` and the CLI never
126
+ renders a CREATE_TABLE (or any) producer for it. (Flipped from the pre-#161
127
+ assertion that the producer rendered as OTHER — see module docstring.)
128
+ """
129
+ # Direct query (analyze.py:317 shape) — no producer row for the phantom node.
119
130
  results = db.run_read(
120
131
  "SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target"
121
132
  ' FROM "SqlTable" t'
@@ -124,12 +135,9 @@ def test_analyze_impact_renders_sequence_as_other(indexed, db, monkeypatch):
124
135
  " WHERE t.qualified = ? LIMIT 100",
125
136
  {"t": "ba.s"},
126
137
  )
127
- kinds = {r["kind"] for r in results}
128
- assert kinds == {"OTHER"}, (
129
- f"analyze impact on ba.s must render only kind=OTHER for the sequence producer; got {kinds}"
130
- )
138
+ assert results == [], f"no producer should resolve via the removed phantom ba.s; got {results}"
131
139
 
132
- # CLI render path: kind=OTHER appears, CREATE_TABLE does not.
140
+ # CLI render path: CREATE_TABLE must not be rendered for the sequence.
133
141
  from typer.testing import CliRunner
134
142
 
135
143
  from sqlcg.cli.commands.analyze import app
@@ -140,9 +148,6 @@ def test_analyze_impact_renders_sequence_as_other(indexed, db, monkeypatch):
140
148
  monkeypatch.setattr("sqlcg.cli.commands.analyze.run_read_routed", _route_to_db)
141
149
  result = CliRunner().invoke(app, ["impact", "ba.s", "--raw"])
142
150
  assert result.exit_code == 0, result.output
143
- assert "OTHER" in result.output, (
144
- f"analyze impact output must contain kind=OTHER for the sequence.\n{result.output}"
145
- )
146
151
  assert "CREATE_TABLE" not in result.output, (
147
152
  f"analyze impact must NOT render CREATE_TABLE for the sequence.\n{result.output}"
148
153
  )
@@ -0,0 +1,80 @@
1
+ """Non-table CREATE objects must not become SqlTable nodes / SELECTS_FROM edges.
2
+
3
+ Guards the phantom-source-node bugfix (#161)
4
+ ([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md), PR-B).
5
+
6
+ #159 fixed the kind label; the phantom SOURCE node persisted. For a
7
+ `CREATE SEQUENCE ba.s` the object's own name was scooped into
8
+ `QueryNode.sources` and then leaked into the graph as a `SqlTable` node with a
9
+ `SELECTS_FROM` edge. The source-gate in `AnsiParser._parse_statement` suppresses
10
+ this. This integration test indexes a mixed fixture and asserts on the resulting
11
+ graph structure (observable output), confirming:
12
+
13
+ - the SEQUENCE / STAGE / FILE FORMAT names are NOT SqlTable nodes and have NO
14
+ SELECTS_FROM edge;
15
+ - a real `INSERT INTO ba.t SELECT ... FROM ba.real` keeps its `ba.real -> ba.t`
16
+ lineage (gate edge-neutral for real tables).
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import pytest
22
+
23
+ from sqlcg.core.duckdb_backend import DuckDBBackend
24
+ from sqlcg.indexer.indexer import Indexer
25
+
26
+ # A non-table CREATE batch + a genuine INSERT...SELECT control, one file.
27
+ _FIXTURE_SQL = """\
28
+ CREATE SEQUENCE IF NOT EXISTS ba.wsdh_s1;
29
+ CREATE STAGE ba.msstg_ingest URL='s3://bucket/x';
30
+ CREATE FILE FORMAT ba.msfmt_parquet TYPE=PARQUET;
31
+ INSERT INTO ba.t SELECT a FROM ba.real;
32
+ """
33
+
34
+ _PHANTOM_NAMES = ("ba.wsdh_s1", "ba.msstg_ingest", "ba.msfmt_parquet")
35
+
36
+
37
+ @pytest.fixture
38
+ def db():
39
+ """Fresh in-memory DuckDB backend with schema initialised."""
40
+ backend = DuckDBBackend(":memory:")
41
+ backend.init_schema()
42
+ yield backend
43
+ backend.close()
44
+
45
+
46
+ def _table_nodes(db: DuckDBBackend) -> set[str]:
47
+ rows = db.run_read('SELECT qualified FROM "SqlTable"', {})
48
+ return {r["qualified"] for r in rows if r["qualified"]}
49
+
50
+
51
+ def _selects_from_pairs(db: DuckDBBackend) -> set[tuple[str, str]]:
52
+ rows = db.run_read('SELECT src_key, dst_key FROM "SELECTS_FROM"', {})
53
+ return {(r["src_key"], r["dst_key"]) for r in rows}
54
+
55
+
56
+ def test_non_table_create_objects_absent_real_lineage_present(db, tmp_path):
57
+ """SEQUENCE/STAGE/FILE FORMAT names absent; real INSERT...SELECT intact (AC-B3/B4)."""
58
+ (tmp_path / "fixture.sql").write_text(_FIXTURE_SQL)
59
+ Indexer().index_repo(tmp_path, dialect="snowflake", db=db, use_git=False)
60
+
61
+ nodes = _table_nodes(db)
62
+
63
+ # AC-B3: no SqlTable node for any non-table CREATE object.
64
+ for name in _PHANTOM_NAMES:
65
+ assert name not in nodes, f"phantom SqlTable node leaked for {name}: {sorted(nodes)}"
66
+
67
+ # AC-B3: no SELECTS_FROM edge touches a phantom name (as src or dst).
68
+ pairs = _selects_from_pairs(db)
69
+ for name in _PHANTOM_NAMES:
70
+ assert not any(name in pair for pair in pairs), (
71
+ f"phantom SELECTS_FROM edge touches {name}: {sorted(pairs)}"
72
+ )
73
+
74
+ # AC-B4 control: the real source/target survive. SELECTS_FROM is
75
+ # file -> source_table, so the real source must appear as a SELECTS_FROM dst.
76
+ assert "ba.real" in nodes, f"real source ba.real missing from nodes: {sorted(nodes)}"
77
+ assert "ba.t" in nodes, f"real target ba.t missing from nodes: {sorted(nodes)}"
78
+ assert any(dst == "ba.real" for _src, dst in pairs), (
79
+ f"real SELECTS_FROM edge into ba.real missing: {sorted(pairs)}"
80
+ )
@@ -0,0 +1,149 @@
1
+ """Non-table CREATE DDL must not emit its own object name as a source node.
2
+
3
+ Guards the phantom-source-node bugfix (#161)
4
+ ([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md), PR-B).
5
+
6
+ #159 fixed the *kind label* (non-table CREATE -> OTHER). The phantom SOURCE node
7
+ persisted: for a `CREATE SEQUENCE ba.s` / `CREATE STAGE` / `CREATE FILE FORMAT`,
8
+ `build_scope` returns None so source extraction fell to `_fallback_table_scan`,
9
+ which scooped the object's OWN name (`ba.s`) into `QueryNode.sources` -> it then
10
+ leaked into `ParsedFile.referenced_tables` (the unconditional
11
+ `referenced_tables.extend(query_node.sources)` at ansi_parser.py:246 /
12
+ snowflake_parser.py:784 / :944), creating a bogus SqlTable node + SELECTS_FROM
13
+ edge in the graph.
14
+
15
+ The fix is a single source-gate inside `AnsiParser._parse_statement`: when the
16
+ statement is an `exp.Create` whose `kind` is not TABLE/VIEW, `sources = []`. The
17
+ gate is keyed off the sqlglot AST (`stmt.kind`), so it is independent of the
18
+ `_classify` path. CREATE TABLE/VIEW ... AS SELECT keep their kind and therefore
19
+ keep their real sources (control tests below).
20
+
21
+ Each assertion checks observable output (the `sources` list / `referenced_tables`
22
+ list contents), not "no exception raised".
23
+ """
24
+
25
+ from pathlib import Path
26
+
27
+ import sqlglot
28
+
29
+ from sqlcg.lineage.schema_resolver import SchemaResolver
30
+ from sqlcg.parsers.ansi_parser import AnsiParser
31
+
32
+
33
+ def _parse(sql: str) -> "tuple":
34
+ """Parse ``sql`` (snowflake dialect) and return (ParsedFile, first QueryNode)."""
35
+ parser = AnsiParser(SchemaResolver(dialect="snowflake"))
36
+ parsed = parser.parse_file(Path("t.sql"), sql)
37
+ first = parsed.statements[0] if parsed.statements else None
38
+ return parsed, first
39
+
40
+
41
+ def _source_ids(node) -> list[str]:
42
+ return [s.full_id for s in node.sources]
43
+
44
+
45
+ def _ref_ids(parsed) -> list[str]:
46
+ return [r.full_id for r in parsed.referenced_tables]
47
+
48
+
49
+ class TestNonTableCreateEmitsNoPhantomSource:
50
+ """SEQUENCE / STAGE / FILE FORMAT names never appear as sources."""
51
+
52
+ def test_create_sequence_has_no_source(self):
53
+ """CREATE SEQUENCE: object name not scooped into sources (AC-B1)."""
54
+ parsed, node = _parse("CREATE SEQUENCE IF NOT EXISTS ba.wsdh_s1")
55
+ assert node is not None
56
+ assert node.sources == []
57
+ assert "ba.wsdh_s1" not in _ref_ids(parsed)
58
+ assert parsed.referenced_tables == []
59
+
60
+ def test_create_stage_has_no_source(self):
61
+ """CREATE STAGE: object name not scooped into sources (AC-B2)."""
62
+ parsed, node = _parse("CREATE STAGE ma.msstg_ingest URL='s3://x'")
63
+ assert node is not None
64
+ assert _source_ids(node) == []
65
+ assert "ma.msstg_ingest" not in _ref_ids(parsed)
66
+
67
+ def test_create_file_format_has_no_source(self):
68
+ """CREATE FILE FORMAT: object name not scooped into sources (AC-B2)."""
69
+ parsed, node = _parse("CREATE FILE FORMAT ma.msfmt_parquet TYPE=PARQUET")
70
+ assert node is not None
71
+ assert _source_ids(node) == []
72
+ assert "ma.msfmt_parquet" not in _ref_ids(parsed)
73
+
74
+ def test_create_schema_has_no_source(self):
75
+ """CREATE SCHEMA: object name not scooped into sources."""
76
+ parsed, node = _parse("CREATE SCHEMA da")
77
+ assert node is not None
78
+ assert _source_ids(node) == []
79
+
80
+
81
+ class TestProcedurePhantomSuppressedButInnerDmlIntact:
82
+ """CREATE PROCEDURE top-level name is gated; spliced inner DML keeps lineage."""
83
+
84
+ def test_create_procedure_name_not_a_source(self):
85
+ """The procedure's own name is not emitted as a phantom source."""
86
+ sql = "CREATE PROCEDURE da.load_p() RETURNS STRING LANGUAGE SQL AS $$ SELECT 1 $$"
87
+ parsed, node = _parse(sql)
88
+ assert node is not None
89
+ assert "da.load_p" not in _source_ids(node)
90
+ assert "da.load_p" not in _ref_ids(parsed)
91
+
92
+ def test_spliced_inner_dml_lineage_intact(self):
93
+ """Inner DML recovered/spliced from EXECUTE IMMEDIATE still has real sources.
94
+
95
+ Real procedure lineage comes from the spliced inner statement (a separate
96
+ statement node), which the source-gate never touches. The gate only
97
+ suppresses the wrapper CREATE's own name. A recoverable inner CTAS keeps
98
+ its source (`da.real_src`) — proving gate edge-neutrality for the
99
+ inner-DML path.
100
+ """
101
+ from sqlcg.parsers.snowflake_parser import SnowflakeParser
102
+
103
+ sql = "EXECUTE IMMEDIATE 'CREATE TABLE da.sink AS SELECT a FROM da.real_src';"
104
+ parser = SnowflakeParser(SchemaResolver(dialect="snowflake"))
105
+ parsed = parser.parse_file(Path("p.sql"), sql)
106
+ refs = _ref_ids(parsed)
107
+ # The spliced inner CTAS's real source survives the gate.
108
+ assert "da.real_src" in refs
109
+ assert "da.sink" in [d.full_id for d in parsed.defined_tables]
110
+
111
+
112
+ class TestTableAndViewCreateSourcesPreserved:
113
+ """Control: legitimate TABLE/VIEW CREATE keep their real sources."""
114
+
115
+ def test_ctas_keeps_real_source(self):
116
+ """CREATE TABLE t AS SELECT ... FROM real_src keeps the source (AC-B4)."""
117
+ parsed, node = _parse("CREATE TABLE da.t AS SELECT a FROM da.real_src")
118
+ assert node is not None
119
+ assert "da.real_src" in _source_ids(node)
120
+ assert "da.real_src" in _ref_ids(parsed)
121
+ # Target is not scooped as a source.
122
+ assert "da.t" not in _source_ids(node)
123
+
124
+ def test_create_view_keeps_real_source(self):
125
+ """CREATE VIEW v AS SELECT ... FROM real_src keeps the source (AC-B4)."""
126
+ parsed, node = _parse("CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.real_src")
127
+ assert node is not None
128
+ assert "da.real_src" in _source_ids(node)
129
+ assert "da.real_src" in _ref_ids(parsed)
130
+
131
+
132
+ class TestGateKeyedOnAst:
133
+ """The gate keys off the sqlglot AST kind, independent of _classify."""
134
+
135
+ def test_create_kinds_observed(self):
136
+ """Confirm the AST kinds the gate relies on (documentation guard)."""
137
+ kinds = {
138
+ sql: sqlglot.parse_one(sql, dialect="snowflake").kind
139
+ for sql in (
140
+ "CREATE SEQUENCE ba.s",
141
+ "CREATE STAGE ma.stg",
142
+ "CREATE FILE FORMAT ff TYPE=CSV",
143
+ "CREATE TABLE da.t AS SELECT a FROM da.s",
144
+ "CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.s",
145
+ )
146
+ }
147
+ assert kinds["CREATE SEQUENCE ba.s"] == "SEQUENCE"
148
+ assert kinds["CREATE TABLE da.t AS SELECT a FROM da.s"] == "TABLE"
149
+ assert kinds["CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.s"] == "VIEW"
@@ -2844,7 +2844,7 @@ wheels = [
2844
2844
 
2845
2845
  [[package]]
2846
2846
  name = "sql-code-graph"
2847
- version = "1.35.0"
2847
+ version = "1.35.1"
2848
2848
  source = { editable = "." }
2849
2849
  dependencies = [
2850
2850
  { name = "duckdb" },
File without changes