sql-code-graph 1.3.0__tar.gz → 1.4.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 (445) hide show
  1. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/ARCHITECTURE_REVIEW.md +142 -0
  2. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/PKG-INFO +2 -4
  3. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/docs/cli.md +3 -11
  4. sql_code_graph-1.4.1/plan/feature_kuzu_to_duckdb_migration.md +541 -0
  5. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/measurements/sprint_08_changelogs_fullindex.json +14 -14
  6. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/measurements/sprint_08_fullcorpus_index.json +15 -15
  7. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/pyproject.toml +2 -3
  8. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/__init__.py +1 -1
  9. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/analyze.py +142 -124
  10. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/db.py +31 -56
  11. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/find.py +5 -9
  12. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/gain.py +14 -16
  13. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/index.py +6 -17
  14. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/reindex.py +1 -1
  15. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/uninstall.py +9 -20
  16. sql_code_graph-1.4.1/src/sqlcg/core/__init__.py +6 -0
  17. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/config.py +25 -81
  18. sql_code_graph-1.4.1/src/sqlcg/core/duckdb_backend.py +764 -0
  19. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/freshness.py +1 -1
  20. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/graph_db.py +20 -4
  21. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/queries.py +26 -7
  22. sql_code_graph-1.4.1/src/sqlcg/core/queries.sql +249 -0
  23. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/schema.py +1 -1
  24. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/indexer.py +27 -36
  25. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/metrics/store.py +1 -1
  26. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/base.py +82 -0
  27. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/control.py +1 -1
  28. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/noise_filter.py +1 -1
  29. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/read_client.py +2 -2
  30. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/server.py +26 -23
  31. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/skill.py +2 -2
  32. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/tools.py +43 -106
  33. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/writer.py +43 -218
  34. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/bench_indexer.py +3 -3
  35. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_F2_skill_install_e2e.py +1 -1
  36. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_airbnb_e2e.py +20 -21
  37. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_golden_lineage.py +23 -27
  38. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_mcp_tools.py +32 -37
  39. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_star_resolution_e2e.py +10 -10
  40. sql_code_graph-1.4.1/tests/fixtures/duckdb_parity/kuzu_reference.json +146 -0
  41. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/snowflake/test_insert_select.py +8 -7
  42. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_T34_presentation_segregation.py +3 -3
  43. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_T35_external_consumers.py +19 -20
  44. sql_code_graph-1.4.1/tests/integration/test_analyze_case_fold.py +234 -0
  45. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_anchor_tools.py +3 -3
  46. sql_code_graph-1.4.1/tests/integration/test_bare_column_cte_lineage.py +332 -0
  47. sql_code_graph-1.4.1/tests/integration/test_bulk_upsert.py +150 -0
  48. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_column_lineage_e2e.py +3 -3
  49. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_cross_file_lineage.py +9 -9
  50. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_cte_recall_guard.py +22 -22
  51. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_cte_schema_alias_guard.py +21 -28
  52. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_cte_source_node_invariant.py +11 -11
  53. sql_code_graph-1.4.1/tests/integration/test_duckdb_parity.py +246 -0
  54. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_e36_xfile_regression_guard.py +8 -8
  55. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_freshness_mcp.py +9 -46
  56. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_hygiene_config_root_reconciliation.py +3 -3
  57. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_indexer_batching.py +26 -29
  58. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_indexer_commits.py +3 -20
  59. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_indexer_to_graph.py +15 -8
  60. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_live_anchors.py +19 -16
  61. sql_code_graph-1.4.1/tests/integration/test_mvcc_rebuild.py +220 -0
  62. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_parse_diagnostics.py +8 -8
  63. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_pr1_confidence_reason.py +3 -3
  64. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_pr2_source_location.py +14 -14
  65. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_pr3_kind_tagging.py +8 -6
  66. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_read_via_server.py +28 -27
  67. sql_code_graph-1.4.1/tests/integration/test_readonly_under_lock.py +281 -0
  68. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_reindex_via_server.py +12 -11
  69. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_resync.py +17 -16
  70. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_single_writer_queue.py +25 -13
  71. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_star_resolution.py +37 -33
  72. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_union_cte_star_recall_guard.py +17 -25
  73. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_user_surface_recall_guard.py +17 -38
  74. sql_code_graph-1.4.1/tests/integration/test_v141_surface_guards.py +490 -0
  75. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_BugB_escalation_uses_init_path.py +18 -33
  76. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_F2_install_skill.py +1 -1
  77. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_aggregator.py +2 -2
  78. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_aggregator_skip.py +2 -2
  79. sql_code_graph-1.4.1/tests/unit/test_analyze_case_fold.py +229 -0
  80. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_closure_depth.py +8 -8
  81. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_db_info.py +27 -17
  82. sql_code_graph-1.4.1/tests/unit/test_duckdb_backend.py +423 -0
  83. sql_code_graph-1.3.0/tests/unit/test_kuzu_backend.py → sql_code_graph-1.4.1/tests/unit/test_duckdb_backend_shared.py +50 -34
  84. sql_code_graph-1.4.1/tests/unit/test_graph_completeness_invariant.py +188 -0
  85. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_hygiene_config_warning.py +0 -1
  86. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_include_working_tree.py +0 -1
  87. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_index_cmd.py +0 -2
  88. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_index_flags.py +0 -3
  89. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_index_progress.py +3 -3
  90. sql_code_graph-1.4.1/tests/unit/test_mcp_stdio_smoke.py +76 -0
  91. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_pr07_observability.py +6 -6
  92. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_queries_loader.py +23 -25
  93. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_read_client.py +1 -1
  94. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +2 -2
  95. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_star_schema_unit.py +17 -15
  96. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_uninstall.py +42 -45
  97. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_writer_queue.py +10 -126
  98. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/uv.lock +33 -44
  99. sql_code_graph-1.3.0/src/sqlcg/core/__init__.py +0 -8
  100. sql_code_graph-1.3.0/src/sqlcg/core/kuzu_backend.py +0 -449
  101. sql_code_graph-1.3.0/src/sqlcg/core/neo4j_backend.py +0 -233
  102. sql_code_graph-1.3.0/tests/integration/test_bulk_upsert.py +0 -255
  103. sql_code_graph-1.3.0/tests/integration/test_readonly_under_lock.py +0 -419
  104. sql_code_graph-1.3.0/tests/unit/test_kuzu_lock.py +0 -91
  105. sql_code_graph-1.3.0/tests/unit/test_mcp_stdio_smoke.py +0 -68
  106. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/api-documenter.md +0 -0
  107. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/architect-planner.md +0 -0
  108. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/architect-reviewer.md +0 -0
  109. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/code-reviewer.md +0 -0
  110. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/developer.md +0 -0
  111. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/plan-reviewer.md +0 -0
  112. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.claude/agents/sprint-planner.md +0 -0
  113. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  114. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  115. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  116. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/workflows/benchmark.yml +0 -0
  117. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/workflows/e2e-tests.yml +0 -0
  118. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/workflows/release.yml +0 -0
  119. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.github/workflows/test.yml +0 -0
  120. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.gitignore +0 -0
  121. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.pre-commit-config.yaml +0 -0
  122. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/.sqlcgignore +0 -0
  123. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/CHANGELOG.md +0 -0
  124. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/CLAUDE.md +0 -0
  125. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/README.md +0 -0
  126. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  127. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/e2e_firstuser_report.md +0 -0
  128. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/e2e_run_20260528_101413.output +0 -0
  129. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/main.py +0 -0
  130. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/WORKFLOW.md +0 -0
  131. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/blueprint.md +0 -0
  132. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/bundle_claude_skill.md +0 -0
  133. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/feature_34_unused_presentation_segregation.md +0 -0
  134. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/feature_35_external_downstream_injection.md +0 -0
  135. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/feature_F2_bundle_claude_skill.md +0 -0
  136. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_downstream_sink_location.md +0 -0
  137. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_dynamic_table_parsing.md +0 -0
  138. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_expand_qualify_perf.md +0 -0
  139. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_firstuser_findings.md +0 -0
  140. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_issue29_live_test_followups.md +0 -0
  141. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/fix_schema_case_mismatch.md +0 -0
  142. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/hygiene_config_path_and_survivors.md +0 -0
  143. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/investigation_e5_e4.md +0 -0
  144. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/living_codebase_resync.md +0 -0
  145. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/measurements/schema_comparison_with_schema.json +0 -0
  146. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/measurements/schema_comparison_without_schema.json +0 -0
  147. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/measurements/sprint_pool_300s_plan.json +0 -0
  148. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/parse_diagnostics.md +0 -0
  149. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/parsing_errors_experiment.md +0 -0
  150. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/snowflake_en_test_suite.md +0 -0
  151. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_01.md +0 -0
  152. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_01_deployment_pypi.md +0 -0
  153. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_02.md +0 -0
  154. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_02_v0.3.0_core.md +0 -0
  155. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_03.md +0 -0
  156. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_03_v0.3.1_postmortem.md +0 -0
  157. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_04_column_lineage.md +0 -0
  158. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_04_column_lineage_fix.md +0 -0
  159. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_05_star_resolution.md +0 -0
  160. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_06_lineage_coverage.md +0 -0
  161. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_07_open_ecodes.md +0 -0
  162. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_07_perf_and_live_test.md +0 -0
  163. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_08_perf_upsert.md +0 -0
  164. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_09_lineage_coverage.md +0 -0
  165. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_10_anchor_tools.md +0 -0
  166. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_11_v1.0.2_bugfix.md +0 -0
  167. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_12_v1.1.0.md +0 -0
  168. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_13_v1.1.0_cluster_b.md +0 -0
  169. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sprint_3.1_postmortem.md +0 -0
  170. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/sqlcg.md +0 -0
  171. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/trust_layer.md +0 -0
  172. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1.1.0_cluster_b_provenance_trust.md +0 -0
  173. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1.1.0_live_graph_freshness.md +0 -0
  174. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1.1.1_batch_upsert_perf.md +0 -0
  175. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1_1_2_bugfix.md +0 -0
  176. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1_1_3_union_cte_star.md +0 -0
  177. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1_2_0_read_proxy.md +0 -0
  178. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/plan/v1_2_1_bugfix.md +0 -0
  179. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/profile.html +0 -0
  180. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/pyrightconfig.json +0 -0
  181. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/scripts/collect_parse_errors.py +0 -0
  182. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/scripts/generate_cli_docs.sh +0 -0
  183. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/__main__.py +0 -0
  184. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/__init__.py +0 -0
  185. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/__init__.py +0 -0
  186. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/git.py +0 -0
  187. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/install.py +0 -0
  188. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/mcp.py +0 -0
  189. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/report.py +0 -0
  190. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/commands/watch.py +0 -0
  191. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/cli/main.py +0 -0
  192. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/jobs.py +0 -0
  193. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/queries.cypher +0 -0
  194. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/core/schema.cypher +0 -0
  195. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/__init__.py +0 -0
  196. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  197. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/error_classify.py +0 -0
  198. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/git_delta.py +0 -0
  199. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/pool.py +0 -0
  200. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/walker.py +0 -0
  201. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/indexer/watcher.py +0 -0
  202. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/lineage/__init__.py +0 -0
  203. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/lineage/aggregator.py +0 -0
  204. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/lineage/schema_resolver.py +0 -0
  205. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/metrics/__init__.py +0 -0
  206. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/__init__.py +0 -0
  207. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/ansi_parser.py +0 -0
  208. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  209. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/postgres_parser.py +0 -0
  210. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/registry.py +0 -0
  211. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  212. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/parsers/tsql_parser.py +0 -0
  213. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/__init__.py +0 -0
  214. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/exceptions.py +0 -0
  215. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/server/models.py +0 -0
  216. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/utils/__init__.py +0 -0
  217. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/utils/hashing.py +0 -0
  218. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/utils/ignore.py +0 -0
  219. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/src/sqlcg/utils/logging.py +0 -0
  220. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/__init__.py +0 -0
  221. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/__init__.py +0 -0
  222. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/adversarial/200_join.sql +0 -0
  223. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/adversarial/500_union.sql +0 -0
  224. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/conftest.py +0 -0
  225. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  226. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  227. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  228. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  229. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  230. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  231. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  232. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  233. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  234. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  235. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/tpch/q01.sql +0 -0
  236. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/tpch/q02.sql +0 -0
  237. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/tpch/q03.sql +0 -0
  238. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/tpch/q04.sql +0 -0
  239. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/benchmarks/tpch/q05.sql +0 -0
  240. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/__init__.py +0 -0
  241. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/conftest.py +0 -0
  242. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_cli_index.py +0 -0
  243. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_git_hook_install.py +0 -0
  244. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_mcp_lifecycle.py +0 -0
  245. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  246. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/e2e/test_watch.py +0 -0
  247. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  248. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  249. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  250. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  251. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  252. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  253. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  254. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  255. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/src_listings.sql +0 -0
  256. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  257. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/bigquery/.gitkeep +0 -0
  258. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  259. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  260. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  261. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/snowflake/base_tables.sql +0 -0
  262. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/snowflake/reports.sql +0 -0
  263. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/snowflake/views.sql +0 -0
  264. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  265. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  266. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  267. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  268. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/synthetic/base_tables.sql +0 -0
  269. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/synthetic/reports.sql +0 -0
  270. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/fixtures/synthetic/views.sql +0 -0
  271. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/__init__.py +0 -0
  272. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/snowflake/__init__.py +0 -0
  273. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_dialect_auto_resolution.py +0 -0
  274. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_dialect_matrix.py +0 -0
  275. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/integration/test_temp_table_lineage.py +0 -0
  276. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/perf/__init__.py +0 -0
  277. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/perf/test_perf.py +0 -0
  278. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E10/__init__.py +0 -0
  279. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E11/__init__.py +0 -0
  280. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E12/__init__.py +0 -0
  281. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E12/e12_json_path.sql +0 -0
  282. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  283. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E12/test_e12.py +0 -0
  284. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E13/__init__.py +0 -0
  285. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E14/__init__.py +0 -0
  286. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E15/__init__.py +0 -0
  287. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E16/__init__.py +0 -0
  288. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E16/e16_merge.sql +0 -0
  289. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  290. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E16/test_e16.py +0 -0
  291. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E17/__init__.py +0 -0
  292. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E18/__init__.py +0 -0
  293. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E18/e18_decode.sql +0 -0
  294. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  295. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  296. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E18/test_e18.py +0 -0
  297. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E19/__init__.py +0 -0
  298. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E2/__init__.py +0 -0
  299. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  300. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  301. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  302. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E2/test_e2.py +0 -0
  303. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E20/__init__.py +0 -0
  304. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E21/__init__.py +0 -0
  305. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  306. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  307. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E21/test_e21.py +0 -0
  308. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E22/__init__.py +0 -0
  309. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E23/__init__.py +0 -0
  310. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  311. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  312. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E23/test_e23.py +0 -0
  313. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E24/__init__.py +0 -0
  314. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E25/__init__.py +0 -0
  315. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  316. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E25/e25_two_part.sql +0 -0
  317. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E25/test_e25.py +0 -0
  318. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  319. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E26/__init__.py +0 -0
  320. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E27/__init__.py +0 -0
  321. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  322. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E27/e27_udf.sql +0 -0
  323. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E27/test_e27.py +0 -0
  324. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E28/__init__.py +0 -0
  325. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E29/__init__.py +0 -0
  326. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E3/__init__.py +0 -0
  327. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  328. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  329. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  330. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E3/test_e3.py +0 -0
  331. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E30/__init__.py +0 -0
  332. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E31/__init__.py +0 -0
  333. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E32/__init__.py +0 -0
  334. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E33/__init__.py +0 -0
  335. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E34/__init__.py +0 -0
  336. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E35/__init__.py +0 -0
  337. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E36/__init__.py +0 -0
  338. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  339. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  340. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E36/test_e36.py +0 -0
  341. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  342. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E37/__init__.py +0 -0
  343. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E38/__init__.py +0 -0
  344. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/__init__.py +0 -0
  345. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  346. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  347. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  348. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  349. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E4/test_e4.py +0 -0
  350. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/__init__.py +0 -0
  351. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  352. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  353. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  354. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/test_e5.py +0 -0
  355. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  356. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E8/__init__.py +0 -0
  357. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  358. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  359. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E8/e8_uuid.sql +0 -0
  360. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E8/test_e8.py +0 -0
  361. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E9/__init__.py +0 -0
  362. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_aggregates/__init__.py +0 -0
  363. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  364. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  365. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  366. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  367. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/__init__.py +0 -0
  368. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  369. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  370. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  371. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  372. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  373. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/README.md +0 -0
  374. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/__init__.py +0 -0
  375. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/__init__.py +0 -0
  376. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  377. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  378. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  379. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/fixture_source.sql +0 -0
  380. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  381. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  382. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/conftest.py +0 -0
  383. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/snowflake/test_plan_review_gates.py +0 -0
  384. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/__init__.py +0 -0
  385. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/snowflake/__init__.py +0 -0
  386. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  387. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  388. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_F2_skill_render.py +0 -0
  389. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_F2_uninstall_skill.py +0 -0
  390. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_T09_01_qualify_once.py +0 -0
  391. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  392. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  393. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  394. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_T35_config_external_consumers.py +0 -0
  395. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_base_parser.py +0 -0
  396. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_branch_monitor.py +0 -0
  397. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  398. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_canonical_target_resolution.py +0 -0
  399. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_cli.py +0 -0
  400. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_cli_help.py +0 -0
  401. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_column_lineage_wiring.py +0 -0
  402. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_config.py +0 -0
  403. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_data_models.py +0 -0
  404. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_dominant_cause.py +0 -0
  405. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_find_cmd.py +0 -0
  406. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_firstuser_findings.py +0 -0
  407. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_freshness_helper.py +0 -0
  408. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_gain_ratio.py +0 -0
  409. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_git_delta.py +0 -0
  410. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_git_hooks.py +0 -0
  411. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_git_hooks_notify.py +0 -0
  412. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_graph_backend.py +0 -0
  413. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_hard_kill_pool.py +0 -0
  414. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_indexer_progress.py +0 -0
  415. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_indexer_quality.py +0 -0
  416. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_install.py +0 -0
  417. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_install_message.py +0 -0
  418. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_jobs.py +0 -0
  419. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_judgement.py +0 -0
  420. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_lineage_conversion.py +0 -0
  421. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_literal_column_skip.py +0 -0
  422. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_mcp_best_practices.py +0 -0
  423. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_mcp_control.py +0 -0
  424. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_metrics.py +0 -0
  425. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_noise_filter.py +0 -0
  426. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  427. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_parse_quality.py +0 -0
  428. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_parser.py +0 -0
  429. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_perf_scaling_guard.py +0 -0
  430. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_schema_resolver.py +0 -0
  431. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_server.py +0 -0
  432. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  433. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  434. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_star_resolution_unit.py +0 -0
  435. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_submit_feedback.py +0 -0
  436. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_subprocess_isolate.py +0 -0
  437. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  438. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_t03_ddl_skip.py +0 -0
  439. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_timeout_cancel.py +0 -0
  440. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_tools_hints.py +0 -0
  441. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_tools_warnings.py +0 -0
  442. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_unqualified_fallback.py +0 -0
  443. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_upsert_batch_invariant.py +0 -0
  444. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_walker.py +0 -0
  445. {sql_code_graph-1.3.0 → sql_code_graph-1.4.1}/tests/unit/test_watcher.py +0 -0
@@ -3276,3 +3276,145 @@ and not delivered), but the shipped behaviour is exercised indirectly and the su
3276
3276
  so they are **follow-up hardening**, not a ship blocker. They should be filed alongside the
3277
3277
  Deviation-1 fix — the B2/W7/reads-block tests in particular guard the exact concurrency
3278
3278
  contract that Deviation 1 currently bypasses.
3279
+
3280
+ ---
3281
+
3282
+ ## Kuzu → DuckDB Migration — Architecture Review (2026-06-05, v1.4.0)
3283
+
3284
+ Reviewed `git diff master..HEAD` on `feat/duckdb-migration` (9 commits, 91 files,
3285
+ ~3885+/2782-). Plan: [`plan/feature_kuzu_to_duckdb_migration.md`](plan/feature_kuzu_to_duckdb_migration.md).
3286
+
3287
+ ### Conformance verdict: SHIP (1 documentation fix + 1 dead-code cleanup recommended)
3288
+
3289
+ Phases 1–5 delivered the specified deliverables. All five Phase-5 exit gates are met:
3290
+ the live DWH acceptance gate (index 1,391 files ~2.5 min; reindex ×3 no crash; column
3291
+ trace) passed today; perf guards green; parity fixture committed; symbol-deletion clean.
3292
+ Two non-blocking gaps (see below).
3293
+
3294
+ ### Plan conformance — deliverable check
3295
+
3296
+ | Phase | Status | Notes |
3297
+ |---|---|---|
3298
+ | 1 — backend skeleton + schema | **PASS** | [`duckdb_backend.py`](src/sqlcg/core/duckdb_backend.py): 7 node + 12 edge tables, src/dst indexes, idempotent `init_schema` in one txn, real reentrant `transaction()`. |
3299
+ | 2 — bulk-upsert sink | **PASS** | `upsert_nodes_bulk`/`upsert_edges_bulk` via `INSERT OR REPLACE … SELECT unnest(?)` — one `execute()` per label/rel per batch. `_flush_row_batch` per-batch shape unchanged ([`indexer.py:90`](src/sqlcg/indexer/indexer.py)). |
3300
+ | 3 — query port + parity | **PASS** | Recursive-CTE traversal with depth + cycle guard ([`analyze.py:38`](src/sqlcg/cli/commands/analyze.py)); kind-filter ported as `LEFT JOIN … WHERE kind IS NULL OR IN ('table','external')`; parity fixture + test committed ([`tests/integration/test_duckdb_parity.py`](tests/integration/test_duckdb_parity.py)). `execute_cypher`→`execute_sql` renamed ([`tools.py:1616`](src/sqlcg/server/tools.py)). |
3301
+ | 4 — rebuild-in-transaction | **PASS (with deviation, see Concurrency)** | Drain body `with backend.transaction(): clear_all_tables(); index_repo()` ([`writer.py:363`](src/sqlcg/server/writer.py)); escalation machinery deleted; single R/W handle. |
3302
+ | 5 — cutover + perf | **PASS** | `kuzu_backend.py`/`neo4j_backend.py` deleted; `KuzuConfig`→`DbConfig` ([`config.py:14`](src/sqlcg/core/config.py)); `buffer_pool` flags removed; `uninstall.py` uses `Path.unlink` + `.wal` ([`uninstall.py:113`](src/sqlcg/cli/commands/uninstall.py)); version 1.4.0; kuzu/neo4j deps dropped. |
3303
+
3304
+ **Gaps (non-blocking):**
3305
+ 1. **Dead Kuzu fallback in the happy path** — [`indexer.py:1393–1423`](src/sqlcg/indexer/indexer.py)
3306
+ `_expand_star_sources` keeps a `# Fallback path for Kuzu legacy backend` branch with inline
3307
+ Cypher `MERGE` strings. Kuzu is deleted, so this branch is unreachable dead code that still
3308
+ references a removed backend's dialect. Plan Tier-1 said cutover removes Kuzu-only code; this
3309
+ is a leftover. Recommend deleting the `else` branch and the `isinstance(db, DuckDBBackend)`
3310
+ guard (the only backend is DuckDB). Not a ship blocker (the live path is the DuckDB branch),
3311
+ but it is exactly the "TODO/stub in the success path" class CLAUDE.md warns against.
3312
+ 2. **`tests/e2e/test_dwh_e2e.py`** migrated on disk but never committed (correct per MEMORY:
3313
+ feedback_dwh_e2e — gitignored). The double-reindex/perf acceptance was run manually today;
3314
+ there is no committed CI guard for it. Accept (matches existing project policy).
3315
+
3316
+ ### Performance invariants — pass/fail (CLAUDE.md table)
3317
+
3318
+ All guard tests green: `test_perf_scaling_guard`, `test_upsert_batch_invariant`,
3319
+ `test_bulk_upsert_invariant`, `test_T09_01_qualify_once` (11 passed).
3320
+
3321
+ | Invariant | Verdict | Evidence |
3322
+ |---|---|---|
3323
+ | `qualify`/`build_scope` module-level import | **PASS** | `base.py` untouched (parser-side, backend-agnostic). |
3324
+ | `exp.expand()` file-level sources + `dependency_filter` | **PASS** | parser-side, untouched. |
3325
+ | `body_scope` built once per statement | **PASS** | untouched. |
3326
+ | Pure-literal skip | **PASS** | untouched. |
3327
+ | No `sources=` when scope present / `copy=False`+`trim_selects=False` | **PASS** | untouched. |
3328
+ | INSERT body copied once | **PASS** | untouched. |
3329
+ | `_upsert_parsed_file` uses bulk (not per-row) | **PASS** | sink re-pointed to `upsert_*_bulk`; no per-row path in flush. |
3330
+ | `_flush_row_batch` once-per-batch (not per-file) | **PASS** | [`indexer.py:162–176`](src/sqlcg/indexer/indexer.py): exactly 10 bulk calls per batch; DuckDB `upsert_*_bulk` issues **one** `execute()` per call ([`duckdb_backend.py:412`,`456`](src/sqlcg/core/duckdb_backend.py)). |
3331
+
3332
+ **No reintroduced O(N²):** the bulk sink uses array-parameter `unnest`, one round-trip per
3333
+ label/rel. Read CTEs carry `WHERE reach.depth < d` + `NOT key = ANY(reach.path)` cycle guard
3334
+ ([`analyze.py:57–58`](src/sqlcg/cli/commands/analyze.py)). `delete_nodes_for_file` is
3335
+ set-based DELETEs, no per-row loop. Edge tables indexed on both `src_key` and `dst_key`.
3336
+ One watch item: `array_append`/`= ANY(path)` cycle guard is O(path-length) per row, acceptable
3337
+ at depth≤100 but is the only place traversal cost grows with path depth — bounded by the depth cap.
3338
+
3339
+ ### Concurrency model — assessment
3340
+
3341
+ **Reentrant `transaction()` ([`duckdb_backend.py:723`](src/sqlcg/core/duckdb_backend.py)):
3342
+ correct.** Depth-counted; only the outermost level emits BEGIN/COMMIT/ROLLBACK; nested calls
3343
+ join and re-raise so a failure anywhere rolls back the whole rebuild. This lets the drain wrap
3344
+ `clear_all_tables()` + `index_repo()` (which opens its own per-batch transactions) in one atomic
3345
+ unit. Verified by `test_mvcc_rebuild.py` (3 passed) and the C6 unit test.
3346
+
3347
+ **`clear_all_tables()` preserving `SchemaVersion`: right call.** It truncates all node/edge
3348
+ tables but leaves the `SchemaVersion` row so the schema-gate survives a rebuild and
3349
+ `indexed_sha` is re-stamped by the indexer inside the same transaction
3350
+ ([`indexer.py:504`](src/sqlcg/indexer/indexer.py)) — the SHA flips atomically with the graph.
3351
+
3352
+ **DEVIATION — "readers never block" is not what shipped (but what shipped is SAFE).**
3353
+ The plan/design (§Concurrency, C3) sells DuckDB MVCC: readers on separate cursors see the OLD
3354
+ snapshot during a write txn and flip on COMMIT, so reads never block. The implementation does
3355
+ **not** use `con.cursor()` per read — `run_read` executes on the **single shared `self._conn`**
3356
+ ([`duckdb_backend.py:476`](src/sqlcg/core/duckdb_backend.py)), and the server serializes every
3357
+ read and the drain through one `anyio` `backend_lock` ([`server.py:347`](src/sqlcg/server/server.py),
3358
+ [`writer.py:330`](src/sqlcg/server/writer.py)). Net effect: a `query` arriving mid-rebuild
3359
+ **waits** for the rebuild to finish rather than being served the old snapshot. This is *safe*
3360
+ (no torn read — the lock prevents a read on a connection with an open uncommitted BEGIN), but
3361
+ it forfeits the headline MVCC non-blocking-read benefit. For the full-rebuild path that holds
3362
+ the lock for the entire ~2.5 min index, **reads are unavailable for the rebuild duration.**
3363
+ Action: fix the plan/docstring claim, OR (better, follow-up) serve reads from `self._conn.cursor()`
3364
+ and drop the read side of `backend_lock` to realize the promised non-blocking reads.
3365
+
3366
+ **Long-transaction risk in the drain body (lock duration / memory / partial-failure):**
3367
+ - *Lock duration:* the full rebuild holds both the OS-level DuckDB file lock and the in-process
3368
+ `backend_lock` for the entire index (~2.5 min on the DWH). Cross-process this is fine (single
3369
+ writer by design); in-process it blocks reads (above). Acceptable for a full rebuild; the real
3370
+ fix is incremental reindex (Option 2, explicitly deferred).
3371
+ - *Memory:* one transaction spanning `clear_all_tables()` + all batch inserts means DuckDB holds
3372
+ the rebuild's undo/WAL state until COMMIT. The plan's batch loop still runs, but per-batch
3373
+ transactions are **subsumed** into the outer txn (reentrancy makes them no-ops), so there is
3374
+ **no intermediate commit** — the OOM-prevention intent of `batch_size` is about parse working-set,
3375
+ not write durability, so this is consistent with CLAUDE.md, but worth noting: write-side memory
3376
+ is now one-transaction-wide, not one-batch-wide. The DWH (47k columns, 45k edges) committed in
3377
+ ~2.5 min with no OOM, so empirically fine at current scale; flag for the 1,600-file ceiling.
3378
+ - *Partial-failure:* correct — a mid-rebuild raise rolls back to the prior graph (C6, tested).
3379
+ Better than the old swap's corruption window.
3380
+
3381
+ ### Backend abstraction — assessment (no action requested)
3382
+
3383
+ With kuzu/neo4j deleted, `GraphBackend` is a **single-impl ABC** — it now adds indirection
3384
+ without polymorphism. It still earns partial keep: (a) tests use an in-memory `:memory:`
3385
+ DuckDBBackend through the same interface; (b) the documented v2 roadmap (Snowflake
3386
+ ACCESS_HISTORY as a second lineage source) may want a second backend. But several smells:
3387
+ - ABC docstrings still say "Cypher for KùzuDB/Neo4j" ([`graph_db.py:121,133`](src/sqlcg/core/graph_db.py))
3388
+ and "skipped by KuzuDB's MERGE semantics" (line 105) — stale, misleading now.
3389
+ - `clear_all_tables()` on the ABC with a `NotImplementedError` default ([`graph_db.py:248`](src/sqlcg/core/graph_db.py))
3390
+ is the wrong shape now that only DuckDB implements it: a `NotImplementedError`-default method on
3391
+ an ABC is a code smell (it is neither abstract-required nor universally provided). With one impl,
3392
+ it should either be a plain method on `DuckDBBackend` (not on the ABC) or a proper `@abstractmethod`.
3393
+ Recommend: move it off the ABC, or make it abstract. Low priority — cosmetic, single caller.
3394
+ - `transaction()`'s ABC no-op default that "logs a warning" is now dead (only DuckDB, which
3395
+ overrides). Harmless.
3396
+
3397
+ **Recommendation (do not act now):** keep the ABC for the v2 second-source path, but schedule a
3398
+ docstring de-Cypher pass and relocate `clear_all_tables` off the ABC. If v2 ACCESS_HISTORY is
3399
+ shelved, collapse the ABC into `DuckDBBackend` directly.
3400
+
3401
+ ### Release risk register for 1.4.0 (ranked likelihood × impact)
3402
+
3403
+ 1. **Reads blocked for the full ~2.5 min rebuild duration (HIGH likelihood × MED impact).**
3404
+ The serialized single-connection model means MCP/CLI reads hang while a full `index`/`reindex`
3405
+ drains. On the DWH that is ~2.5 min of read unavailability per rebuild. Users expecting the
3406
+ plan's "non-blocking reads" will see hangs. Mitigation: cursor-per-read follow-up; for now,
3407
+ document the behavior and rely on rebuild infrequency.
3408
+ 2. **Dead Kuzu fallback branch ([`indexer.py:1393`](src/sqlcg/indexer/indexer.py)) (MED × LOW).**
3409
+ Unreachable but references a deleted backend; a future reader may mistake it for a live path,
3410
+ and it carries Cypher that no longer has an engine. Delete before/just after release.
3411
+ 3. **One-transaction-wide write memory at the 1,600-file ceiling (LOW × MED).**
3412
+ Proven fine at DWH scale (1,391 files); the CLAUDE.md target tops out at ~1,600. The whole
3413
+ rebuild is one DuckDB transaction (per-batch commits subsumed), so peak WAL/undo is the full
3414
+ graph. Measure headroom at 1,600 before declaring the perf budget closed.
3415
+ 4. **No committed CI guard for double-reindex / perf (LOW × MED).**
3416
+ The headline acceptance (double-reindex no-crash + lineage parity) was validated manually via
3417
+ the gitignored e2e test. A regression would not be caught in CI. Accept per project policy, but
3418
+ the committed `test_mvcc_rebuild.py` + parity fixture partially cover the rebuild path.
3419
+ 5. **Stale "Cypher/Kuzu" references in docstrings/comments across server + indexer (LOW × LOW).**
3420
+ Cosmetic; misleads future maintainers about the engine. Sweep in a docs pass.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sql-code-graph
3
- Version: 1.3.0
3
+ Version: 1.4.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
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
18
18
  Classifier: Topic :: Database
19
19
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
20
  Requires-Python: >=3.12
21
- Requires-Dist: kuzu==0.11.3
21
+ Requires-Dist: duckdb<2.0,>=1.0.0
22
22
  Requires-Dist: mcp<2.0,>=1.27.0
23
23
  Requires-Dist: pathspec>=0.12.1
24
24
  Requires-Dist: pydantic>=2.0
@@ -30,8 +30,6 @@ Requires-Dist: typer>=0.9.0
30
30
  Requires-Dist: watchdog>=3.0.0
31
31
  Provides-Extra: dbt
32
32
  Requires-Dist: dbt-core>=1.7; extra == 'dbt'
33
- Provides-Extra: neo4j
34
- Requires-Dist: neo4j>=5.15.0; extra == 'neo4j'
35
33
  Provides-Extra: snowflake
36
34
  Requires-Dist: acryl-datahub<0.15.0,>=0.14.0; extra == 'snowflake'
37
35
  Description-Content-Type: text/markdown
@@ -79,8 +79,7 @@ Schema aliases (staging schema → canonical schema) can be configured in
79
79
  | --dialect, -d | TEXT | No | No | | SQL dialect (or 'auto' to read from .sqlcg.toml) |
80
80
  | --dbt-manifest | PATH | No | No | | Path to dbt manifest |
81
81
  | --timeout-per-file | INTEGER | No | No | 10 | Timeout per file in seconds |
82
- | --buffer-pool-size | INTEGER | No | No | 0 | KuzuDB buffer pool size in MB (0 = default). Set to 256-512 on memory-constrained machines. |
83
- | --batch-size | INTEGER | No | No | 50 | Files per KuzuDB transaction in the upsert pass. Default 50 balances commit-overhead reduction (vs. legacy per-file commits) against per-batch memory cost. Lower values are safer for memory-constrained machines; higher values give marginal speedup at the cost of larger working sets. Set to 1 to reproduce legacy per-file commit behaviour. |
82
+ | --batch-size | INTEGER | No | No | 50 | Files per DuckDB transaction in the upsert pass. Default 50 balances commit-overhead reduction (vs. legacy per-file commits) against per-batch memory cost. Lower values are safer for memory-constrained machines; higher values give marginal speedup at the cost of larger working sets. Set to 1 to reproduce legacy per-file commit behaviour. |
84
83
  | --no-ddl | BOOLEAN | No | No | False | Skip table-node upserts for DDL-only files |
85
84
  | --quiet, -q | BOOLEAN | No | No | False | Suppress summary console output |
86
85
  | --verbose, -v | BOOLEAN | No | No | False | Print parse warnings to stderr instead of log file |
@@ -219,7 +218,7 @@ sqlcg uninstall [OPTIONS]
219
218
  Uninstall sqlcg from Claude Code and optionally clean up resources.
220
219
 
221
220
  Step 1: Remove MCP registration from ~/.claude/settings.json
222
- Step 2: Optionally delete the KùzuDB graph database
221
+ Step 2: Optionally delete the DuckDB graph database
223
222
  Step 3: Remove git hook sentinel block from .git/hooks/post-checkout
224
223
  Step 4: Remove sqlcg skill directory from ~/.claude/skills/sqlcg/ and
225
224
  <repo>/.claude/skills/sqlcg/
@@ -275,7 +274,7 @@ Initialise the graph database (idempotent).
275
274
 
276
275
  | Option | Type | Required | Repeatable | Default | Description |
277
276
  | --- | --- | --- | --- | --- | --- |
278
- | --buffer-pool-size | INTEGER | No | No | 0 | KuzuDB buffer pool size in MB (0 = default). Set to 256-512 on memory-constrained machines. |
277
+ | _none_ | | | | | |
279
278
 
280
279
  ## `sqlcg db reset`
281
280
 
@@ -449,13 +448,6 @@ sqlcg analyze failures [OPTIONS]
449
448
 
450
449
  List files that failed to parse, with their dominant cause (E-code bucket).
451
450
 
452
- Valid --cause buckets (from highest to lowest severity):
453
- timeout, E8, E3, E2, E5, E1, qualify_failed, func_fallback, pure_ddl_skip.
454
-
455
- Requires a graph indexed with sqlcg >= v3 (schema version 3). Re-index
456
- with 'sqlcg db reset && sqlcg index <path>' if the graph was built with
457
- an earlier version.
458
-
459
451
  ### Options
460
452
 
461
453
  | Option | Type | Required | Repeatable | Default | Description |