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