sql-code-graph 1.35.0__tar.gz → 1.35.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/PKG-INFO +1 -1
- sql_code_graph-1.35.1/plan/metrics/pr_b_phantom_after.json +32 -0
- sql_code_graph-1.35.1/plan/metrics/pr_b_phantom_before.json +32 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/pyproject.toml +1 -1
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/__init__.py +1 -1
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/ansi_parser.py +35 -16
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_non_table_create_kind_in_graph.py +35 -30
- sql_code_graph-1.35.1/tests/integration/test_phantom_non_table_create_node.py +80 -0
- sql_code_graph-1.35.1/tests/unit/test_phantom_non_table_create_source.py +149 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/uv.lock +1 -1
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/api-documenter.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/architect-planner.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/architect-reviewer.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/code-reviewer.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/developer.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/plan-reviewer.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.claude/agents/sprint-planner.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/benchmark.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/e2e-tests.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/release.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.github/workflows/test.yml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.gitignore +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.pre-commit-config.yaml +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/.sqlcgignore +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/ARCHITECTURE_REVIEW.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/CHANGELOG.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/CLAUDE.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/README.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/AIRBNB_PARSE_REPORT.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/cli.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/getting-started.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/docs/releasing-pypi.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/e2e_firstuser_report.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/e2e_run_20260528_101413.output +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/main.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/WORKFLOW.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr2_catalog_load_eval.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr3_repo_native_plateau.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr4_transform_kinds.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/createkind_dwh_after.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/createkind_dwh_before.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/lineage5_dwh_before_master.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/pr4_star_promote_after.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/pr4_star_promote_before.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_with_schema.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_without_schema.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_pool_300s_plan.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/column_coverage_diagnostic.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/column_coverage_findings.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/dwh_graph_analysis.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/feature_acceptance_dwh.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/graph_health_sprint_postmortem.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/island_lever_live_verification.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/sprint_3.1_postmortem.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/blueprint.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/investigation_e5_e4.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/parse_diagnostics.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/parsing_errors_experiment.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/snowflake_en_test_suite.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/research/sqlcg.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/bundle_claude_skill.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/column_lineage_recall_metric.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_p1_p3_p4.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_p1_p5_metric.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/coverage_parse_failures.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/diff-impact-producer-file.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/e8_dual_emission.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_downstream_sink_location.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_expand_qualify_perf.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_firstuser_findings.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/fix_schema_case_mismatch.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/gain_coverage_metrics.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/living_codebase_resync.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/mcp_server_self_healing.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_01.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_02.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_03.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_04_column_lineage.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_05_star_resolution.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_07_open_ecodes.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_08_perf_upsert.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_10_anchor_tools.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_12_v1.1.0.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/sprint_postmortem_fixes.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/temp_table_namespacing.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/trust_layer.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/unfilled_table_impact.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_1_2_bugfix.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_2_0_read_proxy.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/v1_2_1_bugfix.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/sprints/version-parity-and-restart.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/profile.html +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/pyrightconfig.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/collect_parse_errors.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/column_coverage_check.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/scripts/generate_cli_docs.sh +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/__main__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/analyze.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/catalog.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/db.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/find.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/gain.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/git.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/index.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/install.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/mcp.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/reindex.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/report.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/uninstall.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/viz.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/commands/watch.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/coverage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/cli/main.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/config.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/duckdb_backend.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/freshness.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/graph_db.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/jobs.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/noise_match.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.cypher +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/queries.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/schema.cypher +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/core/schema.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/dbt_adapter.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/error_classify.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/git_delta.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/indexer.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/pool.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/walker.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/indexer/watcher.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/aggregator.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/lineage/schema_resolver.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/metrics/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/metrics/store.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/base.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/bigquery_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/postgres_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/registry.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/snowflake_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/parsers/tsql_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/control.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/exceptions.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/models.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/noise_filter.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/read_client.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/selfheal.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/server.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/skill.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/tools.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/server/writer.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/hashing.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/ignore.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/utils/logging.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/assets/force-graph.min.js +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/assets/template.html +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/data.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/render.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/src/sqlcg/viz/tags.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/adversarial/200_join.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/adversarial/500_union.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/bench_indexer.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/conftest.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q01.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q02.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q03.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q04.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/benchmarks/tpch/q05.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/conftest.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/conftest.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_airbnb_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_cli_index.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_git_hook_install.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_golden_lineage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_mcp_lifecycle.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_mcp_tools.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_selfheal_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_star_resolution_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_viz_cli_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/e2e/test_watch.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_listings.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_hosts.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_listings.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/airbnb/src_reviews.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/bigquery/.gitkeep +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/customers.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/orders.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/base_tables.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/reports.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/snowflake/views.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/star_corpus/etl_star.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/base_tables.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/reports.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/fixtures/synthetic/views.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/test_insert_select.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_T34_presentation_segregation.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_T35_external_consumers.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_analyze_case_fold.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_anchor_tools.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_backfill_impact_consistency.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_bare_column_cte_lineage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_bulk_upsert.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_case_split_seed_regression.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_catalog_kind_upgrade.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_catalog_load_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_column_coverage_patterns.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_column_lineage_e2e.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_coverage_metrics_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cross_file_lineage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_recall_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_schema_alias_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_cte_source_node_invariant.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_dialect_auto_resolution.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_dialect_matrix.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_duckdb_parity.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_empty_impact_blast_radius.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_empty_index_rollback_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_freshness_mcp.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_gating_join_retrofit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_identity_counters_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_impact_consumer_parity.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_index_degraded_files_metric.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_index_filter_node_exclusion.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_batching.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_commits.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_indexer_to_graph.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_join_col_resolution.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_key_normalization_chokepoint.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_live_anchors.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_mvcc_rebuild.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_parse_diagnostics.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr1_confidence_reason.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr2_source_location.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr3_kind_tagging.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_pr_impact_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_qualify_failed_persist.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_read_via_server.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_readonly_under_lock.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_reindex_via_server.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_resync.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_completeness.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_cte_body_source.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_selects_from_subscope_source.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_single_writer_queue.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_skip_counts_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_star_promote_temp_columns.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_star_resolution.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_temp_table_lineage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_temp_table_namespacing.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_tool_version_stamp_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_usage_derived_catalog.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_use_schema_session_context_integration.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_user_surface_recall_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_v141_surface_guards.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_view_kind_in_graph.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_viz_data_build.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/integration/test_write_memory_ceiling.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/perf/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/perf/test_perf.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E10/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E11/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/e12_json_path.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E12/test_e12.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E13/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E14/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E15/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/e16_merge.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E16/test_e16.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E17/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_decode.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/e18_nvl2.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E18/test_e18.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E19/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_function_alias.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E2/test_e2.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E20/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E21/test_e21.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E22/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E23/test_e23.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E24/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/e25_cross_db.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/e25_two_part.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/test_e25.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E25/test_e25_full_id.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E26/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/e27_udf.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E27/test_e27.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E28/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E29/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_alter_table.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E3/test_e3.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E30/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E31/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E32/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E33/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E34/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E35/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/e36_temp_table.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/test_e36.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E36/test_e36_xfile.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E37/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E38/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/e4_unpivot.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E4/test_e4.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/test_e5.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/e8_uuid.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E8/test_e8.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E9/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/README.md +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_etl.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/fixture_source.sql +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/conftest.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/snowflake/test_plan_review_gates.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/__init__.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/snowflake/test_scripting_noise.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_BugC_hook_upgrade.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_install_skill.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_skill_render.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_F2_uninstall_skill.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_01_qualify_once.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_02_ddl_skip.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T09_06_log_verbosity.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_T35_config_external_consumers.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_aggregator.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_aggregator_skip.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_analyze_case_fold.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_base_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_branch_monitor.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_bulk_upsert_invariant.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_canonical_target_resolution.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_catalog_csv_parsing.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_catalog_missing_warning.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_classify_non_table_create_kind.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cli_help.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_closure_depth.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_column_lineage_wiring.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_config.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_coverage_metrics.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cte_key_namespacing.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_cte_source_gap_metric.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_data_models.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_info.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_info_coverage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_db_path_isolation_fixture.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_doc_links.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_doc_markdown_link_existence.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_dominant_cause.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_duckdb_backend.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_duckdb_backend_shared.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e5_view_alias_resolution.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e8_dual_emission.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_empty_propagation_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_extract_select_output_columns.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_file_ignore_defaults.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_find_cmd.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_firstuser_findings.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_freshness_helper.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gain_coverage.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gain_ratio.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_gating_join_field_docstrings.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_delta.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_hooks.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_git_hooks_notify.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_graph_backend.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_graph_completeness_invariant.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hard_kill_pool.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_has_column_precedence_upsert.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hook_reindex_detach.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_hygiene_config_warning.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_identity_counters.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_include_working_tree.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_cmd.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_filter_config.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_flags.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_progress.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_index_summary_degraded_metric.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_indexer_progress.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_indexer_quality.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_install.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_install_message.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_issue_63_readonly_lock.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_jobs.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_join_col_resolve_marker.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_judgement.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_lineage_conversion.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_literal_column_skip.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_best_practices.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_control.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_mcp_stdio_smoke.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_metrics.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_noise_filter.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_normalize_keys.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_failed_classification.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_file_dependency_filter.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parse_quality.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_parser.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_perf_scaling_guard.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr07_observability.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_pr_impact_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_qualify_failed_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_queries_loader.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_read_client.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolve_join_columns_sql.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_schema_resolver.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selects_from_completeness_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_detector.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_pr1_messages.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_reexec.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_selfheal_watcher.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_server.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_skip_counts_persistence.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_sprint_06_t04_t05.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_star_resolution_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_star_schema_unit.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_submit_feedback.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_subprocess_isolate.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_t02_expression_name_extraction.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_t03_ddl_skip.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_temp_table_namespacing.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_timeout_cancel.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tool_version_stamp.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tools_hints.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_tools_warnings.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_transform_kind_classification.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_uninstall.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_unknown_sentinel_skip.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_unqualified_fallback.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_upsert_batch_invariant.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_use_schema_session_context.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_version_parity.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_view_classification.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_config_schemas.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_facets.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_viz_render_self_contained.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_walker.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_watcher.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_worker_error_classification.py +0 -0
- {sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/tests/unit/test_writer_queue.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sql-code-graph
|
|
3
|
-
Version: 1.35.
|
|
3
|
+
Version: 1.35.1
|
|
4
4
|
Summary: SQL code graph analyzer and lineage tracer
|
|
5
5
|
Project-URL: Homepage, https://github.com/Warhorze/sql-code-graph
|
|
6
6
|
Project-URL: Repository, https://github.com/Warhorze/sql-code-graph
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{"total_calls": 1476, "last_7d_calls": 1476, "index_runs": 5, "feedback_tp": 0,
|
|
2
|
+
"feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 496},
|
|
3
|
+
{"name": "trace_column_lineage", "count": 389}, {"name":
|
|
4
|
+
"list_dialects_and_repos", "count": 127}], "execute_sql_ratio": 0.34,
|
|
5
|
+
"parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
|
|
6
|
+
"coverage": {"catalogued_tables": 5800, "total_tables": 6552, "good_edges":
|
|
7
|
+
52657, "total_edges": 60805, "phantom_edges": 12241, "blindspot_tables": 628,
|
|
8
|
+
"good_edges_strict": 48140, "edge_health_strict_pct": 79.17,
|
|
9
|
+
"good_edges_scoped": 37460, "total_edges_scoped": 38009,
|
|
10
|
+
"edge_health_scoped_pct": 98.56, "phantom_confirmed": 11701,
|
|
11
|
+
"phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
|
|
12
|
+
[{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
|
|
13
|
+
"ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
|
|
14
|
+
"ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
|
|
15
|
+
"da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
|
|
16
|
+
"da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
|
|
17
|
+
"wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
|
|
18
|
+
"da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
|
|
19
|
+
"bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19},
|
|
20
|
+
{"table": "da.hthyb_page_brandplacement", "bad_edges": 17}],
|
|
21
|
+
"blindspot_tables_for_80pct": 17, "files_indexed": 1335, "indexed_sha":
|
|
22
|
+
"fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path":
|
|
23
|
+
"/tmp/sqlcg-gain-after.db", "index_timestamp": 1781466521.041257,
|
|
24
|
+
"degraded_parse_total": 5189, "degraded_parse_queries": 20,
|
|
25
|
+
"degraded_parse_by_dir": {"etl": {"degraded": 1, "total": 2776}, "ddl":
|
|
26
|
+
{"degraded": 19, "total": 2413}}, "zero_edge_write_queries": 1034,
|
|
27
|
+
"total_write_queries": 2323, "cte_key_collisions": 0,
|
|
28
|
+
"rescuable_unqualified_edges": 125, "info_schema_has_column_rows": 100193,
|
|
29
|
+
"cte_source_gap_writes": 0, "resolvable_write_col_edges": 36936,
|
|
30
|
+
"transitive_col_edges": 4168, "qualify_failed_statements": 9,
|
|
31
|
+
"tool_version_stale": false, "indexed_tool_version": "1.34.5",
|
|
32
|
+
"running_tool_version": "1.34.5"}}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{"total_calls": 1476, "last_7d_calls": 1476, "index_runs": 5, "feedback_tp": 0,
|
|
2
|
+
"feedback_total": 0, "top_tools": [{"name": "execute_sql", "count": 496},
|
|
3
|
+
{"name": "trace_column_lineage", "count": 389}, {"name":
|
|
4
|
+
"list_dialects_and_repos", "count": 127}], "execute_sql_ratio": 0.34,
|
|
5
|
+
"parse_quality": {"sqlglot": 5166, "scripting": 20, "dynamic_sql": 3},
|
|
6
|
+
"coverage": {"catalogued_tables": 5800, "total_tables": 6581, "good_edges":
|
|
7
|
+
52669, "total_edges": 60817, "phantom_edges": 12241, "blindspot_tables": 628,
|
|
8
|
+
"good_edges_strict": 48140, "edge_health_strict_pct": 79.16,
|
|
9
|
+
"good_edges_scoped": 37460, "total_edges_scoped": 38009,
|
|
10
|
+
"edge_health_scoped_pct": 98.56, "phantom_confirmed": 11701,
|
|
11
|
+
"phantom_contradicted": 352, "phantom_unverified": 188, "top_blindspot_tables":
|
|
12
|
+
[{"table": "ba.wtfa_kpi_datum_klant", "bad_edges": 70}, {"table":
|
|
13
|
+
"ba.wtfs_voorraad_dagstand", "bad_edges": 55}, {"table":
|
|
14
|
+
"ba.wtfs_voorraad_zondagstand", "bad_edges": 55}, {"table":
|
|
15
|
+
"da.rtgmd_postnl_customer_usage", "bad_edges": 43}, {"table":
|
|
16
|
+
"da.rtgmd_postnl_athome_3s", "bad_edges": 33}, {"table":
|
|
17
|
+
"wtfe_kpi_voorraad_artikel_voorraadlocatie", "bad_edges": 32}, {"table":
|
|
18
|
+
"da.rtgmd_postnl_facturen", "bad_edges": 30}, {"table": "da.hthyb_pages",
|
|
19
|
+
"bad_edges": 23}, {"table": "da.rtgmd_dhb_extra_kosten", "bad_edges": 19},
|
|
20
|
+
{"table": "da.hthyb_page_brandplacement", "bad_edges": 17}],
|
|
21
|
+
"blindspot_tables_for_80pct": 17, "files_indexed": 1335, "indexed_sha":
|
|
22
|
+
"fdf1b551a34601a6cf3ce1c8b9f76e27ce2753e6", "db_path":
|
|
23
|
+
"/tmp/sqlcg-gain-before.db", "index_timestamp": 1781466329.8251324,
|
|
24
|
+
"degraded_parse_total": 5189, "degraded_parse_queries": 20,
|
|
25
|
+
"degraded_parse_by_dir": {"etl": {"degraded": 1, "total": 2776}, "ddl":
|
|
26
|
+
{"degraded": 19, "total": 2413}}, "zero_edge_write_queries": 1034,
|
|
27
|
+
"total_write_queries": 2323, "cte_key_collisions": 0,
|
|
28
|
+
"rescuable_unqualified_edges": 125, "info_schema_has_column_rows": 100193,
|
|
29
|
+
"cte_source_gap_writes": 0, "resolvable_write_col_edges": 36936,
|
|
30
|
+
"transitive_col_edges": 4180, "qualify_failed_statements": 9,
|
|
31
|
+
"tool_version_stale": false, "indexed_tool_version": "1.34.4",
|
|
32
|
+
"running_tool_version": "1.34.4"}}
|
|
@@ -551,25 +551,44 @@ class AnsiParser(SqlParser):
|
|
|
551
551
|
# measurement artifact (96.1%/4,544 of 4,727 on the DWH corpus).
|
|
552
552
|
can_have_lineage = self._can_have_column_lineage(stmt)
|
|
553
553
|
|
|
554
|
+
# Phantom source-node gate (#161): a non-table/non-view CREATE
|
|
555
|
+
# (SEQUENCE / STAGE / FILE FORMAT / SCHEMA / INDEX / PROCEDURE / ...) has
|
|
556
|
+
# target=None and no data-flow source. Its only Table node is its own
|
|
557
|
+
# object name, which _fallback_table_scan below would otherwise scoop into
|
|
558
|
+
# `sources`, leaking a phantom SqlTable SOURCE node + SELECTS_FROM edge
|
|
559
|
+
# into the graph. #159 fixed the kind LABEL (-> OTHER); this closes the
|
|
560
|
+
# source-node half. Keying off stmt.kind (the sqlglot AST value, e.g.
|
|
561
|
+
# 'SEQUENCE') keeps the gate independent of the _classify/QueryKind path.
|
|
562
|
+
# CREATE TABLE/VIEW ... AS SELECT keep kind in (TABLE, VIEW) and so retain
|
|
563
|
+
# their real sources. Real procedure lineage comes from the spliced inner
|
|
564
|
+
# DML (a separate node the gate never touches), so gating PROCEDURE is
|
|
565
|
+
# edge-neutral. This single gate feeds all three
|
|
566
|
+
# `referenced_tables.extend(query_node.sources)` sites
|
|
567
|
+
# (ansi_parser.py:246, snowflake_parser.py:784 / :944).
|
|
568
|
+
is_non_table_create = isinstance(stmt, exp.Create) and stmt.kind not in ("TABLE", "VIEW")
|
|
569
|
+
|
|
554
570
|
# Try to extract table references using scope analysis
|
|
555
571
|
try:
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
if root_scope is None:
|
|
559
|
-
from sqlglot.optimizer.scope import build_scope
|
|
560
|
-
|
|
561
|
-
root_scope = build_scope(stmt)
|
|
562
|
-
|
|
563
|
-
if root_scope:
|
|
564
|
-
sources = self._real_tables(root_scope)
|
|
572
|
+
if is_non_table_create:
|
|
573
|
+
sources = []
|
|
565
574
|
else:
|
|
566
|
-
#
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
575
|
+
# Use pre-built scope if provided, otherwise build it here (fallback)
|
|
576
|
+
root_scope = scope
|
|
577
|
+
if root_scope is None:
|
|
578
|
+
from sqlglot.optimizer.scope import build_scope
|
|
579
|
+
|
|
580
|
+
root_scope = build_scope(stmt)
|
|
581
|
+
|
|
582
|
+
if root_scope:
|
|
583
|
+
sources = self._real_tables(root_scope)
|
|
584
|
+
else:
|
|
585
|
+
# Fallback to basic table extraction
|
|
586
|
+
sources = [
|
|
587
|
+
r
|
|
588
|
+
for s in self._fallback_table_scan(stmt)
|
|
589
|
+
if (r := self._apply_table_alias(s)) is not None
|
|
590
|
+
]
|
|
591
|
+
parse_failed = can_have_lineage
|
|
573
592
|
except Exception as exc:
|
|
574
593
|
logger.debug("Failed to build scope for statement %d in %s: %s", stmt_index, path, exc)
|
|
575
594
|
sources = [
|
|
@@ -10,11 +10,14 @@ Scope (RESCOPED, kind-only — plan §Scope):
|
|
|
10
10
|
* AC3 — the ``analyze impact`` query (analyze.py:317 shape) renders the
|
|
11
11
|
sequence's producing statement as ``kind=OTHER`` not ``CREATE_TABLE``.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
name
|
|
15
|
-
``referenced_tables`` → ``indexer.py`` source loop.
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
Originally OUT OF SCOPE for #159 (plan Follow-up §, blast-radius row #1b): the
|
|
14
|
+
sequence name persisted as a ``SqlTable`` source node via the kind-independent
|
|
15
|
+
``referenced_tables`` → ``indexer.py`` source loop. **That phantom node has since
|
|
16
|
+
been removed by the PR-B source-gate (#161)**
|
|
17
|
+
([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md)). The two tests
|
|
18
|
+
below that previously asserted the phantom SELECTS_FROM edge / ``ba.s`` node
|
|
19
|
+
*exists* have been flipped to assert its *absence* — the corrected post-#161
|
|
20
|
+
graph shape. The kind-only assertions (AC1/AC2) are unchanged.
|
|
18
21
|
"""
|
|
19
22
|
|
|
20
23
|
import pytest
|
|
@@ -87,13 +90,14 @@ def test_ctas_still_create_table(indexed, db):
|
|
|
87
90
|
)
|
|
88
91
|
|
|
89
92
|
|
|
90
|
-
def
|
|
91
|
-
"""
|
|
93
|
+
def test_sequence_produces_no_phantom_selects_from_edge(indexed, db):
|
|
94
|
+
"""Post-#161: the sequence statement carries NO phantom SELECTS_FROM edge.
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
Before PR-B (#161) the sequence's own name ``ba.s`` was scooped into
|
|
97
|
+
``sources`` and emitted as a ``SELECTS_FROM`` edge from the producing
|
|
98
|
+
statement to a phantom ``ba.s`` SqlTable node. The source-gate suppresses
|
|
99
|
+
this, so no SELECTS_FROM edge points at ``ba.s`` any longer. (Flipped from the
|
|
100
|
+
pre-#161 assertion that the edge existed — see module docstring.)
|
|
97
101
|
"""
|
|
98
102
|
rows = db.run_read(
|
|
99
103
|
'SELECT q.id AS id, q.kind AS kind FROM "SqlQuery" q '
|
|
@@ -101,21 +105,28 @@ def test_sequence_produces_selects_from_edge(indexed, db):
|
|
|
101
105
|
"WHERE sf.dst_key = ?",
|
|
102
106
|
{"dst": "ba.s"},
|
|
103
107
|
)
|
|
104
|
-
assert
|
|
105
|
-
assert rows[0]["kind"] == "OTHER", (
|
|
106
|
-
f"the sequence statement with a SELECTS_FROM edge must be kind=OTHER, "
|
|
107
|
-
f"got {rows[0]['kind']!r}"
|
|
108
|
-
)
|
|
108
|
+
assert rows == [], f"phantom SELECTS_FROM edge to ba.s should be gone, got {rows}"
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
def
|
|
112
|
-
"""
|
|
111
|
+
def test_sequence_name_is_not_a_sqltable_node(indexed, db):
|
|
112
|
+
"""Post-#161: the sequence object name is not emitted as a SqlTable node.
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
No assertion is made about the ba.s SqlTable node's existence (out of scope).
|
|
114
|
+
The phantom ``ba.s`` SqlTable node previously created by the kind-independent
|
|
115
|
+
source loop is removed by the PR-B source-gate (#161).
|
|
117
116
|
"""
|
|
118
|
-
|
|
117
|
+
rows = db.run_read('SELECT qualified FROM "SqlTable" WHERE qualified = ?', {"q": "ba.s"})
|
|
118
|
+
assert rows == [], f"phantom SqlTable node ba.s should be gone, got {rows}"
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_analyze_impact_sequence_node_absent(indexed, db, monkeypatch):
|
|
122
|
+
"""Post-#161: ``analyze impact ba.s`` finds no phantom producer.
|
|
123
|
+
|
|
124
|
+
The phantom ``ba.s`` node and its SELECTS_FROM edge are removed, so the
|
|
125
|
+
analyze.py:317 query shape returns no rows for ``ba.s`` and the CLI never
|
|
126
|
+
renders a CREATE_TABLE (or any) producer for it. (Flipped from the pre-#161
|
|
127
|
+
assertion that the producer rendered as OTHER — see module docstring.)
|
|
128
|
+
"""
|
|
129
|
+
# Direct query (analyze.py:317 shape) — no producer row for the phantom node.
|
|
119
130
|
results = db.run_read(
|
|
120
131
|
"SELECT DISTINCT q.id AS id, q.kind AS kind, q.target_table AS target"
|
|
121
132
|
' FROM "SqlTable" t'
|
|
@@ -124,12 +135,9 @@ def test_analyze_impact_renders_sequence_as_other(indexed, db, monkeypatch):
|
|
|
124
135
|
" WHERE t.qualified = ? LIMIT 100",
|
|
125
136
|
{"t": "ba.s"},
|
|
126
137
|
)
|
|
127
|
-
|
|
128
|
-
assert kinds == {"OTHER"}, (
|
|
129
|
-
f"analyze impact on ba.s must render only kind=OTHER for the sequence producer; got {kinds}"
|
|
130
|
-
)
|
|
138
|
+
assert results == [], f"no producer should resolve via the removed phantom ba.s; got {results}"
|
|
131
139
|
|
|
132
|
-
# CLI render path:
|
|
140
|
+
# CLI render path: CREATE_TABLE must not be rendered for the sequence.
|
|
133
141
|
from typer.testing import CliRunner
|
|
134
142
|
|
|
135
143
|
from sqlcg.cli.commands.analyze import app
|
|
@@ -140,9 +148,6 @@ def test_analyze_impact_renders_sequence_as_other(indexed, db, monkeypatch):
|
|
|
140
148
|
monkeypatch.setattr("sqlcg.cli.commands.analyze.run_read_routed", _route_to_db)
|
|
141
149
|
result = CliRunner().invoke(app, ["impact", "ba.s", "--raw"])
|
|
142
150
|
assert result.exit_code == 0, result.output
|
|
143
|
-
assert "OTHER" in result.output, (
|
|
144
|
-
f"analyze impact output must contain kind=OTHER for the sequence.\n{result.output}"
|
|
145
|
-
)
|
|
146
151
|
assert "CREATE_TABLE" not in result.output, (
|
|
147
152
|
f"analyze impact must NOT render CREATE_TABLE for the sequence.\n{result.output}"
|
|
148
153
|
)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Non-table CREATE objects must not become SqlTable nodes / SELECTS_FROM edges.
|
|
2
|
+
|
|
3
|
+
Guards the phantom-source-node bugfix (#161)
|
|
4
|
+
([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md), PR-B).
|
|
5
|
+
|
|
6
|
+
#159 fixed the kind label; the phantom SOURCE node persisted. For a
|
|
7
|
+
`CREATE SEQUENCE ba.s` the object's own name was scooped into
|
|
8
|
+
`QueryNode.sources` and then leaked into the graph as a `SqlTable` node with a
|
|
9
|
+
`SELECTS_FROM` edge. The source-gate in `AnsiParser._parse_statement` suppresses
|
|
10
|
+
this. This integration test indexes a mixed fixture and asserts on the resulting
|
|
11
|
+
graph structure (observable output), confirming:
|
|
12
|
+
|
|
13
|
+
- the SEQUENCE / STAGE / FILE FORMAT names are NOT SqlTable nodes and have NO
|
|
14
|
+
SELECTS_FROM edge;
|
|
15
|
+
- a real `INSERT INTO ba.t SELECT ... FROM ba.real` keeps its `ba.real -> ba.t`
|
|
16
|
+
lineage (gate edge-neutral for real tables).
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import pytest
|
|
22
|
+
|
|
23
|
+
from sqlcg.core.duckdb_backend import DuckDBBackend
|
|
24
|
+
from sqlcg.indexer.indexer import Indexer
|
|
25
|
+
|
|
26
|
+
# A non-table CREATE batch + a genuine INSERT...SELECT control, one file.
|
|
27
|
+
_FIXTURE_SQL = """\
|
|
28
|
+
CREATE SEQUENCE IF NOT EXISTS ba.wsdh_s1;
|
|
29
|
+
CREATE STAGE ba.msstg_ingest URL='s3://bucket/x';
|
|
30
|
+
CREATE FILE FORMAT ba.msfmt_parquet TYPE=PARQUET;
|
|
31
|
+
INSERT INTO ba.t SELECT a FROM ba.real;
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
_PHANTOM_NAMES = ("ba.wsdh_s1", "ba.msstg_ingest", "ba.msfmt_parquet")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.fixture
|
|
38
|
+
def db():
|
|
39
|
+
"""Fresh in-memory DuckDB backend with schema initialised."""
|
|
40
|
+
backend = DuckDBBackend(":memory:")
|
|
41
|
+
backend.init_schema()
|
|
42
|
+
yield backend
|
|
43
|
+
backend.close()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _table_nodes(db: DuckDBBackend) -> set[str]:
|
|
47
|
+
rows = db.run_read('SELECT qualified FROM "SqlTable"', {})
|
|
48
|
+
return {r["qualified"] for r in rows if r["qualified"]}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _selects_from_pairs(db: DuckDBBackend) -> set[tuple[str, str]]:
|
|
52
|
+
rows = db.run_read('SELECT src_key, dst_key FROM "SELECTS_FROM"', {})
|
|
53
|
+
return {(r["src_key"], r["dst_key"]) for r in rows}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_non_table_create_objects_absent_real_lineage_present(db, tmp_path):
|
|
57
|
+
"""SEQUENCE/STAGE/FILE FORMAT names absent; real INSERT...SELECT intact (AC-B3/B4)."""
|
|
58
|
+
(tmp_path / "fixture.sql").write_text(_FIXTURE_SQL)
|
|
59
|
+
Indexer().index_repo(tmp_path, dialect="snowflake", db=db, use_git=False)
|
|
60
|
+
|
|
61
|
+
nodes = _table_nodes(db)
|
|
62
|
+
|
|
63
|
+
# AC-B3: no SqlTable node for any non-table CREATE object.
|
|
64
|
+
for name in _PHANTOM_NAMES:
|
|
65
|
+
assert name not in nodes, f"phantom SqlTable node leaked for {name}: {sorted(nodes)}"
|
|
66
|
+
|
|
67
|
+
# AC-B3: no SELECTS_FROM edge touches a phantom name (as src or dst).
|
|
68
|
+
pairs = _selects_from_pairs(db)
|
|
69
|
+
for name in _PHANTOM_NAMES:
|
|
70
|
+
assert not any(name in pair for pair in pairs), (
|
|
71
|
+
f"phantom SELECTS_FROM edge touches {name}: {sorted(pairs)}"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# AC-B4 control: the real source/target survive. SELECTS_FROM is
|
|
75
|
+
# file -> source_table, so the real source must appear as a SELECTS_FROM dst.
|
|
76
|
+
assert "ba.real" in nodes, f"real source ba.real missing from nodes: {sorted(nodes)}"
|
|
77
|
+
assert "ba.t" in nodes, f"real target ba.t missing from nodes: {sorted(nodes)}"
|
|
78
|
+
assert any(dst == "ba.real" for _src, dst in pairs), (
|
|
79
|
+
f"real SELECTS_FROM edge into ba.real missing: {sorted(pairs)}"
|
|
80
|
+
)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""Non-table CREATE DDL must not emit its own object name as a source node.
|
|
2
|
+
|
|
3
|
+
Guards the phantom-source-node bugfix (#161)
|
|
4
|
+
([plan doc](plan/sprints/sprint_snowflake_lineage_patterns.md), PR-B).
|
|
5
|
+
|
|
6
|
+
#159 fixed the *kind label* (non-table CREATE -> OTHER). The phantom SOURCE node
|
|
7
|
+
persisted: for a `CREATE SEQUENCE ba.s` / `CREATE STAGE` / `CREATE FILE FORMAT`,
|
|
8
|
+
`build_scope` returns None so source extraction fell to `_fallback_table_scan`,
|
|
9
|
+
which scooped the object's OWN name (`ba.s`) into `QueryNode.sources` -> it then
|
|
10
|
+
leaked into `ParsedFile.referenced_tables` (the unconditional
|
|
11
|
+
`referenced_tables.extend(query_node.sources)` at ansi_parser.py:246 /
|
|
12
|
+
snowflake_parser.py:784 / :944), creating a bogus SqlTable node + SELECTS_FROM
|
|
13
|
+
edge in the graph.
|
|
14
|
+
|
|
15
|
+
The fix is a single source-gate inside `AnsiParser._parse_statement`: when the
|
|
16
|
+
statement is an `exp.Create` whose `kind` is not TABLE/VIEW, `sources = []`. The
|
|
17
|
+
gate is keyed off the sqlglot AST (`stmt.kind`), so it is independent of the
|
|
18
|
+
`_classify` path. CREATE TABLE/VIEW ... AS SELECT keep their kind and therefore
|
|
19
|
+
keep their real sources (control tests below).
|
|
20
|
+
|
|
21
|
+
Each assertion checks observable output (the `sources` list / `referenced_tables`
|
|
22
|
+
list contents), not "no exception raised".
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
import sqlglot
|
|
28
|
+
|
|
29
|
+
from sqlcg.lineage.schema_resolver import SchemaResolver
|
|
30
|
+
from sqlcg.parsers.ansi_parser import AnsiParser
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _parse(sql: str) -> "tuple":
|
|
34
|
+
"""Parse ``sql`` (snowflake dialect) and return (ParsedFile, first QueryNode)."""
|
|
35
|
+
parser = AnsiParser(SchemaResolver(dialect="snowflake"))
|
|
36
|
+
parsed = parser.parse_file(Path("t.sql"), sql)
|
|
37
|
+
first = parsed.statements[0] if parsed.statements else None
|
|
38
|
+
return parsed, first
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _source_ids(node) -> list[str]:
|
|
42
|
+
return [s.full_id for s in node.sources]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _ref_ids(parsed) -> list[str]:
|
|
46
|
+
return [r.full_id for r in parsed.referenced_tables]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TestNonTableCreateEmitsNoPhantomSource:
|
|
50
|
+
"""SEQUENCE / STAGE / FILE FORMAT names never appear as sources."""
|
|
51
|
+
|
|
52
|
+
def test_create_sequence_has_no_source(self):
|
|
53
|
+
"""CREATE SEQUENCE: object name not scooped into sources (AC-B1)."""
|
|
54
|
+
parsed, node = _parse("CREATE SEQUENCE IF NOT EXISTS ba.wsdh_s1")
|
|
55
|
+
assert node is not None
|
|
56
|
+
assert node.sources == []
|
|
57
|
+
assert "ba.wsdh_s1" not in _ref_ids(parsed)
|
|
58
|
+
assert parsed.referenced_tables == []
|
|
59
|
+
|
|
60
|
+
def test_create_stage_has_no_source(self):
|
|
61
|
+
"""CREATE STAGE: object name not scooped into sources (AC-B2)."""
|
|
62
|
+
parsed, node = _parse("CREATE STAGE ma.msstg_ingest URL='s3://x'")
|
|
63
|
+
assert node is not None
|
|
64
|
+
assert _source_ids(node) == []
|
|
65
|
+
assert "ma.msstg_ingest" not in _ref_ids(parsed)
|
|
66
|
+
|
|
67
|
+
def test_create_file_format_has_no_source(self):
|
|
68
|
+
"""CREATE FILE FORMAT: object name not scooped into sources (AC-B2)."""
|
|
69
|
+
parsed, node = _parse("CREATE FILE FORMAT ma.msfmt_parquet TYPE=PARQUET")
|
|
70
|
+
assert node is not None
|
|
71
|
+
assert _source_ids(node) == []
|
|
72
|
+
assert "ma.msfmt_parquet" not in _ref_ids(parsed)
|
|
73
|
+
|
|
74
|
+
def test_create_schema_has_no_source(self):
|
|
75
|
+
"""CREATE SCHEMA: object name not scooped into sources."""
|
|
76
|
+
parsed, node = _parse("CREATE SCHEMA da")
|
|
77
|
+
assert node is not None
|
|
78
|
+
assert _source_ids(node) == []
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TestProcedurePhantomSuppressedButInnerDmlIntact:
|
|
82
|
+
"""CREATE PROCEDURE top-level name is gated; spliced inner DML keeps lineage."""
|
|
83
|
+
|
|
84
|
+
def test_create_procedure_name_not_a_source(self):
|
|
85
|
+
"""The procedure's own name is not emitted as a phantom source."""
|
|
86
|
+
sql = "CREATE PROCEDURE da.load_p() RETURNS STRING LANGUAGE SQL AS $$ SELECT 1 $$"
|
|
87
|
+
parsed, node = _parse(sql)
|
|
88
|
+
assert node is not None
|
|
89
|
+
assert "da.load_p" not in _source_ids(node)
|
|
90
|
+
assert "da.load_p" not in _ref_ids(parsed)
|
|
91
|
+
|
|
92
|
+
def test_spliced_inner_dml_lineage_intact(self):
|
|
93
|
+
"""Inner DML recovered/spliced from EXECUTE IMMEDIATE still has real sources.
|
|
94
|
+
|
|
95
|
+
Real procedure lineage comes from the spliced inner statement (a separate
|
|
96
|
+
statement node), which the source-gate never touches. The gate only
|
|
97
|
+
suppresses the wrapper CREATE's own name. A recoverable inner CTAS keeps
|
|
98
|
+
its source (`da.real_src`) — proving gate edge-neutrality for the
|
|
99
|
+
inner-DML path.
|
|
100
|
+
"""
|
|
101
|
+
from sqlcg.parsers.snowflake_parser import SnowflakeParser
|
|
102
|
+
|
|
103
|
+
sql = "EXECUTE IMMEDIATE 'CREATE TABLE da.sink AS SELECT a FROM da.real_src';"
|
|
104
|
+
parser = SnowflakeParser(SchemaResolver(dialect="snowflake"))
|
|
105
|
+
parsed = parser.parse_file(Path("p.sql"), sql)
|
|
106
|
+
refs = _ref_ids(parsed)
|
|
107
|
+
# The spliced inner CTAS's real source survives the gate.
|
|
108
|
+
assert "da.real_src" in refs
|
|
109
|
+
assert "da.sink" in [d.full_id for d in parsed.defined_tables]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class TestTableAndViewCreateSourcesPreserved:
|
|
113
|
+
"""Control: legitimate TABLE/VIEW CREATE keep their real sources."""
|
|
114
|
+
|
|
115
|
+
def test_ctas_keeps_real_source(self):
|
|
116
|
+
"""CREATE TABLE t AS SELECT ... FROM real_src keeps the source (AC-B4)."""
|
|
117
|
+
parsed, node = _parse("CREATE TABLE da.t AS SELECT a FROM da.real_src")
|
|
118
|
+
assert node is not None
|
|
119
|
+
assert "da.real_src" in _source_ids(node)
|
|
120
|
+
assert "da.real_src" in _ref_ids(parsed)
|
|
121
|
+
# Target is not scooped as a source.
|
|
122
|
+
assert "da.t" not in _source_ids(node)
|
|
123
|
+
|
|
124
|
+
def test_create_view_keeps_real_source(self):
|
|
125
|
+
"""CREATE VIEW v AS SELECT ... FROM real_src keeps the source (AC-B4)."""
|
|
126
|
+
parsed, node = _parse("CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.real_src")
|
|
127
|
+
assert node is not None
|
|
128
|
+
assert "da.real_src" in _source_ids(node)
|
|
129
|
+
assert "da.real_src" in _ref_ids(parsed)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class TestGateKeyedOnAst:
|
|
133
|
+
"""The gate keys off the sqlglot AST kind, independent of _classify."""
|
|
134
|
+
|
|
135
|
+
def test_create_kinds_observed(self):
|
|
136
|
+
"""Confirm the AST kinds the gate relies on (documentation guard)."""
|
|
137
|
+
kinds = {
|
|
138
|
+
sql: sqlglot.parse_one(sql, dialect="snowflake").kind
|
|
139
|
+
for sql in (
|
|
140
|
+
"CREATE SEQUENCE ba.s",
|
|
141
|
+
"CREATE STAGE ma.stg",
|
|
142
|
+
"CREATE FILE FORMAT ff TYPE=CSV",
|
|
143
|
+
"CREATE TABLE da.t AS SELECT a FROM da.s",
|
|
144
|
+
"CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.s",
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
assert kinds["CREATE SEQUENCE ba.s"] == "SEQUENCE"
|
|
148
|
+
assert kinds["CREATE TABLE da.t AS SELECT a FROM da.s"] == "TABLE"
|
|
149
|
+
assert kinds["CREATE OR REPLACE VIEW da.v AS SELECT a FROM da.s"] == "VIEW"
|
|
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.0 → sql_code_graph-1.35.1}/plan/measurements/pr2_catalog_load_eval.json
RENAMED
|
File without changes
|
{sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/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.0 → sql_code_graph-1.35.1}/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.0 → sql_code_graph-1.35.1}/plan/metrics/lineage5_dwh_before_master.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_with_schema.json
RENAMED
|
File without changes
|
{sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/schema_comparison_without_schema.json
RENAMED
|
File without changes
|
{sql_code_graph-1.35.0 → sql_code_graph-1.35.1}/plan/metrics/sprint_08_changelogs_fullindex.json
RENAMED
|
File without changes
|