sql-code-graph 1.0.2__tar.gz → 1.1.0__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.0.2 → sql_code_graph-1.1.0}/ARCHITECTURE_REVIEW.md +121 -0
- sql_code_graph-1.1.0/CHANGELOG.md +102 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/CLAUDE.md +4 -2
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/PKG-INFO +13 -2
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/README.md +12 -1
- sql_code_graph-1.1.0/plan/feature_34_unused_presentation_segregation.md +433 -0
- sql_code_graph-1.1.0/plan/feature_35_external_downstream_injection.md +617 -0
- sql_code_graph-1.1.0/plan/feature_F2_bundle_claude_skill.md +286 -0
- sql_code_graph-1.1.0/plan/hygiene_config_path_and_survivors.md +601 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_08_changelogs_fullindex.json +14 -14
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_08_fullcorpus_index.json +15 -15
- sql_code_graph-1.1.0/plan/sprint_12_v1.1.0.md +1526 -0
- sql_code_graph-1.1.0/plan/sprint_13_v1.1.0_cluster_b.md +1001 -0
- sql_code_graph-1.1.0/plan/v1.1.0_cluster_b_provenance_trust.md +344 -0
- sql_code_graph-1.1.0/plan/v1.1.0_live_graph_freshness.md +400 -0
- sql_code_graph-1.1.0/plan/v1.1.1_batch_upsert_perf.md +596 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/pyproject.toml +1 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/__init__.py +1 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/analyze.py +115 -17
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/db.py +17 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/find.py +7 -0
- sql_code_graph-1.1.0/src/sqlcg/cli/commands/git.py +154 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/index.py +30 -2
- sql_code_graph-1.1.0/src/sqlcg/cli/commands/mcp.py +176 -0
- sql_code_graph-1.1.0/src/sqlcg/cli/commands/reindex.py +283 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/config.py +80 -0
- sql_code_graph-1.1.0/src/sqlcg/core/freshness.py +134 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/graph_db.py +2 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/queries.cypher +24 -6
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/queries.py +4 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/schema.cypher +13 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/schema.py +5 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/indexer.py +376 -160
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/walker.py +3 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/ansi_parser.py +56 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/base.py +6 -3
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/snowflake_parser.py +46 -6
- sql_code_graph-1.1.0/src/sqlcg/server/control.py +144 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/models.py +68 -0
- sql_code_graph-1.1.0/src/sqlcg/server/server.py +382 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/skill.py +20 -4
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/tools.py +203 -13
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_cli_index.py +74 -0
- sql_code_graph-1.1.0/tests/e2e/test_git_hook_install.py +294 -0
- sql_code_graph-1.1.0/tests/e2e/test_mcp_lifecycle.py +214 -0
- sql_code_graph-1.1.0/tests/integration/test_T34_presentation_segregation.py +347 -0
- sql_code_graph-1.1.0/tests/integration/test_T35_external_consumers.py +631 -0
- sql_code_graph-1.1.0/tests/integration/test_freshness_mcp.py +211 -0
- sql_code_graph-1.1.0/tests/integration/test_hygiene_config_root_reconciliation.py +224 -0
- sql_code_graph-1.1.0/tests/integration/test_indexer_batching.py +311 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_indexer_commits.py +14 -7
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_parse_diagnostics.py +3 -3
- sql_code_graph-1.1.0/tests/integration/test_pr1_confidence_reason.py +284 -0
- sql_code_graph-1.1.0/tests/integration/test_pr2_source_location.py +531 -0
- sql_code_graph-1.1.0/tests/integration/test_pr3_kind_tagging.py +422 -0
- sql_code_graph-1.1.0/tests/integration/test_reindex_via_server.py +833 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_star_resolution.py +12 -13
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_skill_render.py +45 -0
- sql_code_graph-1.1.0/tests/unit/test_T35_config_external_consumers.py +219 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_firstuser_findings.py +4 -3
- sql_code_graph-1.1.0/tests/unit/test_freshness_helper.py +328 -0
- sql_code_graph-1.1.0/tests/unit/test_git_hooks.py +548 -0
- sql_code_graph-1.1.0/tests/unit/test_hygiene_config_warning.py +246 -0
- sql_code_graph-1.1.0/tests/unit/test_include_working_tree.py +308 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_cmd.py +2 -2
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_flags.py +2 -2
- sql_code_graph-1.1.0/tests/unit/test_mcp_control.py +295 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_pr07_observability.py +1 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_queries_loader.py +1 -1
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_star_schema_unit.py +5 -5
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_tools_hints.py +2 -1
- sql_code_graph-1.1.0/tests/unit/test_upsert_batch_invariant.py +127 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/uv.lock +1 -1
- sql_code_graph-1.0.2/CHANGELOG.md +0 -49
- sql_code_graph-1.0.2/plan/sprint_031.md +0 -1040
- sql_code_graph-1.0.2/plan/sprint_31_postmortem.md +0 -1040
- sql_code_graph-1.0.2/src/sqlcg/cli/commands/git.py +0 -104
- sql_code_graph-1.0.2/src/sqlcg/cli/commands/mcp.py +0 -73
- sql_code_graph-1.0.2/src/sqlcg/cli/commands/reindex.py +0 -173
- sql_code_graph-1.0.2/src/sqlcg/server/server.py +0 -100
- sql_code_graph-1.0.2/tests/e2e/test_git_hook_install.py +0 -116
- sql_code_graph-1.0.2/tests/integration/test_indexer_batching.py +0 -164
- sql_code_graph-1.0.2/tests/unit/test_git_hooks.py +0 -279
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/api-documenter.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/architect-planner.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/architect-reviewer.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/code-reviewer.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/developer.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/plan-reviewer.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.claude/agents/sprint-planner.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/benchmark.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/e2e-tests.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/release.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.github/workflows/test.yml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.gitignore +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.pre-commit-config.yaml +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/.sqlcgignore +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/docs/AIRBNB_PARSE_REPORT.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/docs/cli.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/e2e_firstuser_report.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/e2e_run_20260528_101413.output +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/main.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/WORKFLOW.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/blueprint.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/bundle_claude_skill.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_dynamic_table_parsing.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_expand_qualify_perf.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_firstuser_findings.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/fix_schema_case_mismatch.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/investigation_e5_e4.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/living_codebase_resync.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/schema_comparison_with_schema.json +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/schema_comparison_without_schema.json +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/measurements/sprint_pool_300s_plan.json +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/parse_diagnostics.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/parsing_errors_experiment.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/snowflake_en_test_suite.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_01.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_01_deployment_pypi.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_02.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_02_v0.3.0_core.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_03.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_03_v0.3.1_postmortem.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_04_column_lineage.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_04_column_lineage_fix.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_05_star_resolution.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_06_lineage_coverage.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_07_open_ecodes.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_07_perf_and_live_test.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_08_perf_upsert.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_09_lineage_coverage.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_10_anchor_tools.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_11_v1.0.2_bugfix.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sprint_3.1_postmortem.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/sqlcg.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/plan/trust_layer.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/profile.html +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/pyrightconfig.json +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/scripts/collect_parse_errors.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/scripts/generate_cli_docs.sh +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/__main__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/gain.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/install.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/report.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/uninstall.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/commands/watch.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/cli/main.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/jobs.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/kuzu_backend.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/core/neo4j_backend.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/dbt_adapter.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/error_classify.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/git_delta.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/pool.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/indexer/watcher.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/aggregator.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/lineage/schema_resolver.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/metrics/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/metrics/store.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/bigquery_parser.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/postgres_parser.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/registry.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/parsers/tsql_parser.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/exceptions.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/server/noise_filter.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/hashing.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/ignore.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/src/sqlcg/utils/logging.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/adversarial/200_join.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/adversarial/500_union.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/bench_indexer.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/conftest.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q01.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q02.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q03.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q04.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/benchmarks/tpch/q05.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/conftest.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_airbnb_e2e.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_golden_lineage.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_mcp_tools.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_star_resolution_e2e.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/e2e/test_watch.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_listings.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_hosts.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_listings.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/airbnb/src_reviews.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/bigquery/.gitkeep +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/customers.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/orders.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/base_tables.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/reports.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/snowflake/views.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/star_corpus/etl_star.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/base_tables.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/reports.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/fixtures/synthetic/views.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/snowflake/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/snowflake/test_insert_select.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_anchor_tools.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_bulk_upsert.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_column_lineage_e2e.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_cross_file_lineage.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_dialect_matrix.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_indexer_to_graph.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_live_anchors.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_resync.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/integration/test_temp_table_lineage.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/perf/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/perf/test_perf.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E10/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E11/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/e12_json_path.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E12/test_e12.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E13/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E14/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E15/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/e16_merge.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E16/test_e16.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E17/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_decode.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/e18_nvl2.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E18/test_e18.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E19/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_function_alias.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E2/test_e2.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E20/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E21/test_e21.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E22/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E23/test_e23.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E24/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/e25_cross_db.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/e25_two_part.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/test_e25.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E25/test_e25_full_id.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E26/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/e27_udf.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E27/test_e27.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E28/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E29/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_alter_table.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E3/test_e3.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E30/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E31/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E32/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E33/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E34/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E35/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/e36_temp_table.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/test_e36.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E36/test_e36_xfile.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E37/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E38/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/e4_unpivot.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E4/test_e4.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/test_e5.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/e8_uuid.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E8/test_e8.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E9/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/README.md +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_etl.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/fixture_source.sql +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/conftest.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/snowflake/test_plan_review_gates.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/snowflake/__init__.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/snowflake/test_scripting_noise.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_install_skill.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_F2_uninstall_skill.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_01_qualify_once.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_02_ddl_skip.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_T09_06_log_verbosity.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_aggregator.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_aggregator_skip.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_base_parser.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_branch_monitor.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_bulk_upsert_invariant.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_cli.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_cli_help.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_closure_depth.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_column_lineage_wiring.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_config.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_data_models.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_db_info.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_dominant_cause.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_find_cmd.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_gain_ratio.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_git_delta.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_graph_backend.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_hard_kill_pool.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_index_progress.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_indexer_progress.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_indexer_quality.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_install.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_install_message.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_jobs.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_judgement.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_kuzu_backend.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_kuzu_lock.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_lineage_conversion.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_literal_column_skip.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_mcp_best_practices.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_mcp_stdio_smoke.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_metrics.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_noise_filter.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parse_file_dependency_filter.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parse_quality.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_parser.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_perf_scaling_guard.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_schema_resolver.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_server.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_sprint_06_t04_t05.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_star_resolution_unit.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_submit_feedback.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_subprocess_isolate.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_t02_expression_name_extraction.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_t03_ddl_skip.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_timeout_cancel.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_tools_warnings.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_uninstall.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_unqualified_fallback.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_walker.py +0 -0
- {sql_code_graph-1.0.2 → sql_code_graph-1.1.0}/tests/unit/test_watcher.py +0 -0
|
@@ -2827,3 +2827,124 @@ removes the skill, mirroring the F1 sentinel teardown.
|
|
|
2827
2827
|
persists the prerequisite `indexed_sha`.
|
|
2828
2828
|
- `max_closure_depth=3` is a reasoned default, not yet calibrated against real
|
|
2829
2829
|
DWH chain depth — revisit if a deep chain is observed under-resolving.
|
|
2830
|
+
|
|
2831
|
+
---
|
|
2832
|
+
|
|
2833
|
+
## 17. v1.1.0 — Live Graph Freshness & Daemon Reindex (Cluster A)
|
|
2834
|
+
|
|
2835
|
+
Review date: 2026-05-31 · Reviewer: architect-reviewer · Branch:
|
|
2836
|
+
`fix/v1.0.2-bugfix` · Verdict: **APPROVED-WITH-FOLLOWUPS**
|
|
2837
|
+
|
|
2838
|
+
Resolves the §16.3 deferred staleness FACT and closes the silent-stale-graph
|
|
2839
|
+
class of failure. Plan: [`v1.1.0_live_graph_freshness.md`](plan/v1.1.0_live_graph_freshness.md);
|
|
2840
|
+
sprint breakdown: [`sprint_12_v1.1.0.md`](plan/sprint_12_v1.1.0.md). GitHub
|
|
2841
|
+
issues [#28], [#29], [#30]. Four PRs (21ecd2e, abcf41c, e3bead4/add000d/f02b279,
|
|
2842
|
+
b54153f), all merged on the branch.
|
|
2843
|
+
|
|
2844
|
+
### 17.1 Freshness model (#30)
|
|
2845
|
+
|
|
2846
|
+
A new backend-free helper [`core/freshness.py`](src/sqlcg/core/freshness.py)
|
|
2847
|
+
computes a `Freshness(indexed_sha, head_sha, stale_by_commits, dirty, branch)`
|
|
2848
|
+
from a repo root + the stored SHA. All git calls funnel through one private
|
|
2849
|
+
`_git(root, *args)` that returns `None` on any failure — **never raises**
|
|
2850
|
+
(matches the defensive pattern in `git_delta.py`/`watcher.py`). `stale_by_commits`
|
|
2851
|
+
is `git rev-list --count <indexed>..<head>`; an indexed SHA unknown to git
|
|
2852
|
+
(rebased/shallow, or the `+dirty` sentinel) yields `None` ("distance unknown"),
|
|
2853
|
+
never a false `0`. The helper does not import the backend — the caller passes
|
|
2854
|
+
`indexed_sha` in — so it unit-tests against a real temp git repo with no Kuzu.
|
|
2855
|
+
|
|
2856
|
+
Surfaced in three places, all reusing the single helper:
|
|
2857
|
+
- `sqlcg db info` prints `render_freshness_line` (silent on empty/non-git DB).
|
|
2858
|
+
- MCP `db_info` tool extends `DbInfoResult` with the four optional fields;
|
|
2859
|
+
Neo4j's `NotImplementedError` on `get_indexed_sha()` is guarded → reports
|
|
2860
|
+
`indexed_sha: null` without crashing.
|
|
2861
|
+
- `mcp status` JSON (see 17.3).
|
|
2862
|
+
|
|
2863
|
+
`index --include-working-tree` (#30, PR-B) folds uncommitted changes and
|
|
2864
|
+
overwrites the stored SHA with a `"<head>+dirty"` sentinel via a fresh backend
|
|
2865
|
+
context. The sentinel is intentionally **not** a valid SHA, so freshness reports
|
|
2866
|
+
"commit distance unknown, working tree dirty" — accurate rather than guessed.
|
|
2867
|
+
Default committed-only behaviour is unchanged.
|
|
2868
|
+
|
|
2869
|
+
### 17.2 Daemon control-channel architecture (#29)
|
|
2870
|
+
|
|
2871
|
+
The MCP server is a single process running one `anyio` event loop holding the
|
|
2872
|
+
KuzuDB write lock for its whole lifetime (no lock lease — verified no safe Kuzu
|
|
2873
|
+
API exists; a reader/writer split was explicitly rejected). v1.1 adds a
|
|
2874
|
+
**Unix-domain-socket control channel** on that same event loop, not a second
|
|
2875
|
+
process. Control-file paths derive from `get_db_path()` (`KuzuConfig`-owned),
|
|
2876
|
+
never hardcoded `~/.sqlcg`, so two servers on two DBs do not collide:
|
|
2877
|
+
`graph.db` → `graph.db.sock` + `graph.db.pid` (both `0o600`). See
|
|
2878
|
+
[`server/control.py`](src/sqlcg/server/control.py) (paths + pid record +
|
|
2879
|
+
`is_pid_alive` + cleanup) and `_control_socket_task` in
|
|
2880
|
+
[`server/server.py`](src/sqlcg/server/server.py).
|
|
2881
|
+
|
|
2882
|
+
Protocol (newline-delimited JSON, one request → one response):
|
|
2883
|
+
- `status` → `{running, pid, db_path, indexed_sha, head_sha, stale_by_commits,
|
|
2884
|
+
connected_clients, uptime}`. `connected_clients` is best-effort `1` (stdio
|
|
2885
|
+
transport = one client by design; documented approximation, not a gate).
|
|
2886
|
+
- `stop` → replies `{"ok": true}`, sets `stop_event` (see 17.5).
|
|
2887
|
+
- `reindex {root, from, to, dialect}` → see 17.4.
|
|
2888
|
+
|
|
2889
|
+
CLI side (`mcp status`/`stop`/`restart` in
|
|
2890
|
+
[`cli/commands/mcp.py`](src/sqlcg/cli/commands/mcp.py)) connect-and-probe the
|
|
2891
|
+
socket. R3 stale-socket handling: on `ConnectionRefusedError`/`FileNotFoundError`,
|
|
2892
|
+
fall through to the PID-file probe (`is_pid_alive`) — `running:true,
|
|
2893
|
+
degraded:"socket unavailable"` if the PID lives, `{"running": false}` otherwise.
|
|
2894
|
+
The socket task is guarded behind `sys.platform != "win32"`; Windows keeps the
|
|
2895
|
+
direct-write + staleness-cue path (IPC deferred to v1.2).
|
|
2896
|
+
|
|
2897
|
+
### 17.3 Daemon-writer reindex (#28 — the real fix)
|
|
2898
|
+
|
|
2899
|
+
The silent-stale-graph failure (a second process opening the locked DB,
|
|
2900
|
+
swallowed by the hook's `|| true`) is fixed by routing the delta **through the
|
|
2901
|
+
process that already holds the lock**. The `reindex` socket op calls
|
|
2902
|
+
`Indexer.resync_changed(root, from, to, db, dialect)` **unchanged** (positional
|
|
2903
|
+
match verified against [`indexer.py`](src/sqlcg/indexer/indexer.py) line 428),
|
|
2904
|
+
run via `anyio.to_thread.run_sync` (R1: off the event-loop thread so tool calls
|
|
2905
|
+
are not blocked) behind a single `anyio.Lock` (`reindex_lock`, R2: the Kuzu
|
|
2906
|
+
connection is not thread-safe — see finding 3.3; concurrent notifies serialise).
|
|
2907
|
+
`reindex --notify` ([`reindex.py`](src/sqlcg/cli/commands/reindex.py)) probes the
|
|
2908
|
+
socket and on any connect failure falls through to the existing direct-write path
|
|
2909
|
+
unchanged (R3). The git hooks ([`git.py`](src/sqlcg/cli/commands/git.py)) now pass
|
|
2910
|
+
`--notify` and emit a one-line **stderr cue** on failure while staying non-fatal
|
|
2911
|
+
to the checkout — killing the "silent" mode. Idempotency sentinels unchanged (R9).
|
|
2912
|
+
|
|
2913
|
+
**Perf invariants intact (verified):** neither `parsers/base.py` nor
|
|
2914
|
+
`indexer.py` changed anywhere in Cluster A (`git diff --stat 21ecd2e~1 dcba863`
|
|
2915
|
+
on both paths is empty). The reindex op reuses `resync_changed`, so the
|
|
2916
|
+
bulk-upsert and once-per-statement-scope invariants are inherited; an integration
|
|
2917
|
+
test (`test_reindex_via_server.py` Scenario A) pins that `resync_changed` is
|
|
2918
|
+
called exactly once. DWH regression gate **PASSED**: 175s (≤240s budget),
|
|
2919
|
+
45,652 edges (≥44,939 baseline — no coverage regression).
|
|
2920
|
+
|
|
2921
|
+
### 17.4 Deviation: `os._exit(0)` on stop (accepted for v1.1)
|
|
2922
|
+
|
|
2923
|
+
The MCP `stdio_server` runs stdin `readline` in a thread via
|
|
2924
|
+
`anyio.to_thread.run_sync` with `abandon_on_cancel=False`. When stdin is a
|
|
2925
|
+
parent-held pipe, that blocking read **cannot be interrupted** from inside the
|
|
2926
|
+
subprocess (the parent holds the write end open), so a clean cancel-scope
|
|
2927
|
+
unwind cannot drain the thread. The `stop` path therefore does explicit cleanup
|
|
2928
|
+
**first** — `shutdown_backend()` then `cleanup_control_files()` in `_stop_watcher`
|
|
2929
|
+
([`server.py`](src/sqlcg/server/server.py) ~L218-255) — and then calls
|
|
2930
|
+
`os._exit(0)`. R8 (backend shutdown + socket removal before exit) holds because
|
|
2931
|
+
the teardown runs ahead of the hard exit, not in `main()`'s `finally` (which
|
|
2932
|
+
`os._exit` skips). This is **documented honestly, not faked, and contains no
|
|
2933
|
+
TODO in a happy path** (commit f02b279). Acceptable for v1.1.
|
|
2934
|
+
|
|
2935
|
+
`restart` is `stop` + client-respawn guidance, **not** a true re-parent: the
|
|
2936
|
+
editor owns the stdio process lifecycle and v1.1 has no launcher to re-spawn it
|
|
2937
|
+
(R5). Also documented, not faked.
|
|
2938
|
+
|
|
2939
|
+
### 17.5 Tracked for v1.2
|
|
2940
|
+
|
|
2941
|
+
- **True graceful stop / true `restart`** — needs a launcher model that owns the
|
|
2942
|
+
stdio process so the blocking-pipe-read can be unblocked and `os._exit(0)`
|
|
2943
|
+
retired in favour of clean unwind (R5 + 17.4).
|
|
2944
|
+
- **Windows IPC** (named pipes) for lifecycle + notify-reindex (R7).
|
|
2945
|
+
- **Per-file / SQL-only dirty tracking** — v1.1 reports whole-tree dirty only.
|
|
2946
|
+
- **Socket auth token** for multi-user machines (R6: socket is `0o600`,
|
|
2947
|
+
owner-only, but any same-uid local process can send `stop`/`reindex`).
|
|
2948
|
+
- **Freshness on every tool result by default** — v1.1 ships it gated/off to
|
|
2949
|
+
protect hot-path latency; default-on pending an overhead measurement.
|
|
2950
|
+
- **`connected_clients` fidelity** — best-effort `1` today; no real counter.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
## v1.1.0 (2026-06-01)
|
|
2
|
+
|
|
3
|
+
> **⚠️ Upgrade note — re-index required.** The graph schema advanced from
|
|
4
|
+
> `SCHEMA_VERSION` 4 to 6 (added `start_line` on `SqlQuery`, repurposed
|
|
5
|
+
> `SqlTable.kind`, added the `ExternalConsumer` node + `CONSUMED_BY` edge). There
|
|
6
|
+
> is no in-place migration — re-run `sqlcg index <path>` to rebuild the graph. If
|
|
7
|
+
> you run the MCP server, restart it (`sqlcg mcp restart`) after re-indexing.
|
|
8
|
+
|
|
9
|
+
### Feat
|
|
10
|
+
|
|
11
|
+
- **#28/#29/#30**: live-graph freshness & daemon reindex — Unix-socket control channel,
|
|
12
|
+
`mcp status/stop/restart`, reindex through the running server, post-merge hook routing
|
|
13
|
+
via `ORIG_HEAD`, `index --include-working-tree` + dirty sentinel, and a freshness signal
|
|
14
|
+
(indexed SHA vs HEAD) surfaced in `db info` / the `db_info` MCP tool
|
|
15
|
+
- **#31**: source location — `file`/`line`/`expression` on lineage edges (`start_line` on `SqlQuery`)
|
|
16
|
+
- **#32**: meaningful confidence — `1.0` for plainly-parsed facts, with a `reason` on inferred edges
|
|
17
|
+
- **#33**: CLI/MCP output parity + node-kind tagging (`table` / `cte` / `derived` / `external`)
|
|
18
|
+
- **#34**: `analyze_unused` segregates presentation/terminal tables from dead code
|
|
19
|
+
- **#35**: external downstream lineage injection — `ExternalConsumer` node + `CONSUMED_BY` edge
|
|
20
|
+
- **hygiene**: config-path footgun warning, find/analyze noise-filter parity, cause discoverability,
|
|
21
|
+
and MCP config-root reconciliation
|
|
22
|
+
- **skill**: bundled Claude skill teaches the new provenance + node-kind fields (F2)
|
|
23
|
+
- **indexer**: batch-scoped upsert — bulk writes once per batch instead of per file
|
|
24
|
+
(~13,400 → ~270 backend round-trips on the 1,340-file DWH corpus; upsert 169s → 52s)
|
|
25
|
+
|
|
26
|
+
### Fix
|
|
27
|
+
|
|
28
|
+
- **#31**: preserve newline count in Snowflake preprocessing (multi-line `start_line` bug)
|
|
29
|
+
- **#28**: socket timeout fix, symbolic-ref `--to` resolution, hook binary path
|
|
30
|
+
- **index**: resolve walker root once so relative paths yield absolute paths (sibling of #24)
|
|
31
|
+
- **analyze_unused**: external-consumer warning clarifies the edge is created anyway;
|
|
32
|
+
debug log on the no-Repo File-node fallback
|
|
33
|
+
|
|
34
|
+
### Perf
|
|
35
|
+
|
|
36
|
+
- **indexer**: raise default per-file parse timeout 5s→10s
|
|
37
|
+
|
|
38
|
+
## v1.0.2 (2026-05-30)
|
|
39
|
+
|
|
40
|
+
### Fix
|
|
41
|
+
|
|
42
|
+
- **parser**: restore COALESCE/func lineage + CTE-chain hops broken by eb19f29 (#25)
|
|
43
|
+
- **observability**: make pool-path timeouts visible + route warnings to log file (#13/#27d PR-07)
|
|
44
|
+
- **analyze**: query-time bare-name fallback for unqualified INSERT targets (#26 PR-06)
|
|
45
|
+
- **analyze**: wire NoiseFilter into CLI + add *_bck_* glob (#27a/b PR-08)
|
|
46
|
+
- **install**: restore uvx cold-cache message dropped in #23 rewrite
|
|
47
|
+
- **parser**: preserve skip markers for INSERT-column-list expressions (#25 regression)
|
|
48
|
+
- **parser**: INSERT positional mapping overrides SELECT alias attribution (#25)
|
|
49
|
+
- **install**: write via claude mcp add + ~/.claude.json fallback, remove settings.json (#23)
|
|
50
|
+
- **server**: capture fd 1 before _configure_mcp_logging to fix stdio transport (#22)
|
|
51
|
+
- **find**: lowercase name/ref before graph query to match C2 normalization (#12)
|
|
52
|
+
- **reindex**: resolve root to absolute before ignore matching (#24)
|
|
53
|
+
|
|
54
|
+
## v1.0.1 (2026-05-30)
|
|
55
|
+
|
|
56
|
+
### Fix
|
|
57
|
+
|
|
58
|
+
- **indexer**: abort immediately on Ctrl-C instead of flushing a partial graph
|
|
59
|
+
|
|
60
|
+
### Perf
|
|
61
|
+
|
|
62
|
+
- **parser**: recover 3 once-per-statement lineage regressions from 4234e5d
|
|
63
|
+
|
|
64
|
+
## v1.0.0 (2026-05-30)
|
|
65
|
+
|
|
66
|
+
### Feat
|
|
67
|
+
|
|
68
|
+
- **trust-layer**: `Judgement` discriminator (fact vs. heuristic) on risk/dead-code
|
|
69
|
+
outputs; `analyze_unused` + `get_hub_ranking` tools; golden-harness answer-anchors
|
|
70
|
+
- **F1 living-codebase resync**: incremental branch-change resync via
|
|
71
|
+
`Indexer.resync_changed` + cross-file pass-2 affected closure; standalone
|
|
72
|
+
`sqlcg reindex`; `indexed_sha` metadata (schema v4); `post-merge` hook
|
|
73
|
+
- **F2 bundled skill**: `sqlcg install` provisions a `SKILL.md` encoding the
|
|
74
|
+
fact/heuristic boundary; `sqlcg mcp best-practices` CLI command
|
|
75
|
+
- **index**: `--profile` flag emitting per-stage and per-file timing
|
|
76
|
+
- **analyze**: `failures` subcommand surfacing per-file parse-failure cause
|
|
77
|
+
|
|
78
|
+
### Refactor
|
|
79
|
+
|
|
80
|
+
- remove the INFORMATION_SCHEMA-CSV / `load-schema` path (zero measured edge delta)
|
|
81
|
+
- compact the generated `SKILL.md` (~40% smaller, fact/heuristic-sorted tool table)
|
|
82
|
+
|
|
83
|
+
## v0.2.1 (2026-05-05)
|
|
84
|
+
|
|
85
|
+
### Fix
|
|
86
|
+
|
|
87
|
+
- **benchmarks**: add bench_*.py to pytest python_files so bench_indexer.py is collected
|
|
88
|
+
- **tests**: use tracked variable in fake_run and regenerate cli docs
|
|
89
|
+
- **tests**: strip ANSI codes in test_cli_help assertion
|
|
90
|
+
|
|
91
|
+
## v0.2.0 (2026-05-05)
|
|
92
|
+
|
|
93
|
+
### Feat
|
|
94
|
+
|
|
95
|
+
- **walker**: default to git ls-files to avoid indexing untracked files
|
|
96
|
+
- **phase-9+10**: git-aware graph freshness + PyPI publishing
|
|
97
|
+
- **phase-8**: metrics and feedback layer
|
|
98
|
+
|
|
99
|
+
### Fix
|
|
100
|
+
|
|
101
|
+
- **tools**: move inline Cypher queries to queries.py and fix decorator order (C1, C2)
|
|
102
|
+
- **walker**: address code-review findings C2/W1/W2/W4/S1
|
|
@@ -108,9 +108,11 @@ Any refactor that touches [`base.py`](src/sqlcg/parsers/base.py) or [`indexer.py
|
|
|
108
108
|
| **`body_scope` is built once per statement BEFORE the column loop** (with a schema-free qualify retry on failure), never lazily inside it | `_extract_column_lineage` | Building it inside the loop re-ran expand+qualify+build_scope for *every* column whenever qualify failed (the failure path). Regressed in `4234e5d` |
|
|
109
109
|
| In the INSERT column-list aliasing path, **`body.copy()` + strip-WITH happen once** before the loop; only the single projection is swapped per column | `_extract_column_lineage` INSERT block | A full-body deepcopy per column is O(cols × body_size). Regressed in `4234e5d` |
|
|
110
110
|
| **`_upsert_parsed_file` uses `upsert_nodes_bulk`/`upsert_edges_bulk`** (Phase A→B→C), never `upsert_node`/`upsert_edge` per row | `indexer.py` `_upsert_parsed_file` | Measured: bulk=181s vs per-node=1020s+ on 1,340-file DWH (~10 execute() calls per file vs ~14,500 total). Commit `4234e5d` accidentally regressed this by rewriting the method during C2 normalization. |
|
|
111
|
+
| **`_flush_row_batch` accumulates rows across all files in a batch and calls each `upsert_*_bulk` once per batch** (not once per file) | `indexer.py` `_flush_batch`/`_upsert_file_batch` → `_flush_row_batch` | Measured: per-file flush = ~13,400 `execute()` on 1,340-file DWH (10/file); per-batch flush = ~270 (10/batch). v1.1.1. Guard: [`test_upsert_batch_invariant.py`](tests/unit/test_upsert_batch_invariant.py) |
|
|
111
112
|
|
|
112
|
-
Tests covering these invariants live in [`test_T09_01_qualify_once.py`](tests/unit/test_T09_01_qualify_once.py)
|
|
113
|
-
|
|
113
|
+
Tests covering these invariants live in [`test_T09_01_qualify_once.py`](tests/unit/test_T09_01_qualify_once.py),
|
|
114
|
+
[`test_bulk_upsert_invariant.py`](tests/unit/test_bulk_upsert_invariant.py), and
|
|
115
|
+
[`test_upsert_batch_invariant.py`](tests/unit/test_upsert_batch_invariant.py) (each pins
|
|
114
116
|
one *named* regression). If any fail after a refactor, the invariant was broken — do not mark
|
|
115
117
|
the test as pre-existing and move on.
|
|
116
118
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sql-code-graph
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.1.0
|
|
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
|
|
@@ -219,7 +219,7 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
|
|
|
219
219
|
| **Search & meta** | |
|
|
220
220
|
| `search_sql_pattern(query)` | Full-text search across indexed SQL |
|
|
221
221
|
| `list_dialects_and_repos()` | List indexed repos and dialects (catalogue) |
|
|
222
|
-
| `db_info()` | Graph health, node counts, parse quality breakdown, warnings |
|
|
222
|
+
| `db_info()` | Graph health, node counts, parse quality breakdown, warnings, freshness (indexed SHA vs HEAD) |
|
|
223
223
|
| `execute_cypher(query)` | Raw Cypher query against the graph |
|
|
224
224
|
| `submit_feedback(...)` | Report a false positive/negative to improve metrics |
|
|
225
225
|
|
|
@@ -228,6 +228,12 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
|
|
|
228
228
|
> `table.column`. Each returned node carries both `name` (the bare column) and
|
|
229
229
|
> `table` (the owning `schema.table`), so results are navigable without a second lookup.
|
|
230
230
|
|
|
231
|
+
> **Provenance fields**: lineage edges now carry `file`, `line`, and `expression`
|
|
232
|
+
> (where the lineage was derived from), a `confidence` of `1.0` for plainly-parsed
|
|
233
|
+
> facts (lower for inferred edges, with a `reason`), and a `table_kind`
|
|
234
|
+
> (`table` / `cte` / `derived` / `external`) so CTE and derived aliases are
|
|
235
|
+
> distinguishable from real tables.
|
|
236
|
+
|
|
231
237
|
> **LLM agent tip**: call `db_info()` before lineage queries to check that
|
|
232
238
|
> `SqlColumn > 0` and `warnings` is empty. If `parse_quality["scripting_block"]`
|
|
233
239
|
> is high, column lineage will be limited for those files — use table-level tools
|
|
@@ -243,16 +249,21 @@ sqlcg db init # initialise graph database
|
|
|
243
249
|
sqlcg index <path> --dialect snowflake # index SQL files (snowflake is the tested dialect)
|
|
244
250
|
sqlcg index <path> --dialect auto # read dialect from .sqlcg.toml
|
|
245
251
|
sqlcg index <path> --profile # index + print per-stage timing and slowest files
|
|
252
|
+
sqlcg index <path> --include-working-tree # also index uncommitted changes (marks graph dirty)
|
|
246
253
|
sqlcg reindex <path> --from <sha> --to <sha> # incremental resync of only changed files
|
|
247
254
|
sqlcg analyze unused # tables with no query references
|
|
248
255
|
sqlcg analyze upstream/downstream # trace lineage from the CLI
|
|
249
256
|
sqlcg find table/column/pattern # search the graph
|
|
250
257
|
sqlcg watch <path> # watch for file changes
|
|
258
|
+
sqlcg db info # graph stats + freshness (indexed SHA vs HEAD)
|
|
251
259
|
sqlcg git install-hooks # install post-checkout + post-merge resync hooks
|
|
252
260
|
sqlcg gain # show usage metrics
|
|
253
261
|
sqlcg report # generate FP/error report
|
|
254
262
|
sqlcg mcp best-practices # print the fact/heuristic boundary for the MCP tools
|
|
255
263
|
sqlcg mcp start # start MCP server manually
|
|
264
|
+
sqlcg mcp status # server status JSON (via control socket)
|
|
265
|
+
sqlcg mcp stop # stop the running MCP server gracefully
|
|
266
|
+
sqlcg mcp restart # stop the server (client must respawn it)
|
|
256
267
|
sqlcg version # show installed version
|
|
257
268
|
```
|
|
258
269
|
|
|
@@ -181,7 +181,7 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
|
|
|
181
181
|
| **Search & meta** | |
|
|
182
182
|
| `search_sql_pattern(query)` | Full-text search across indexed SQL |
|
|
183
183
|
| `list_dialects_and_repos()` | List indexed repos and dialects (catalogue) |
|
|
184
|
-
| `db_info()` | Graph health, node counts, parse quality breakdown, warnings |
|
|
184
|
+
| `db_info()` | Graph health, node counts, parse quality breakdown, warnings, freshness (indexed SHA vs HEAD) |
|
|
185
185
|
| `execute_cypher(query)` | Raw Cypher query against the graph |
|
|
186
186
|
| `submit_feedback(...)` | Report a false positive/negative to improve metrics |
|
|
187
187
|
|
|
@@ -190,6 +190,12 @@ After indexing, `sqlcg db info` shows non-zero `STAR_EXPANSION lineage edges`, a
|
|
|
190
190
|
> `table.column`. Each returned node carries both `name` (the bare column) and
|
|
191
191
|
> `table` (the owning `schema.table`), so results are navigable without a second lookup.
|
|
192
192
|
|
|
193
|
+
> **Provenance fields**: lineage edges now carry `file`, `line`, and `expression`
|
|
194
|
+
> (where the lineage was derived from), a `confidence` of `1.0` for plainly-parsed
|
|
195
|
+
> facts (lower for inferred edges, with a `reason`), and a `table_kind`
|
|
196
|
+
> (`table` / `cte` / `derived` / `external`) so CTE and derived aliases are
|
|
197
|
+
> distinguishable from real tables.
|
|
198
|
+
|
|
193
199
|
> **LLM agent tip**: call `db_info()` before lineage queries to check that
|
|
194
200
|
> `SqlColumn > 0` and `warnings` is empty. If `parse_quality["scripting_block"]`
|
|
195
201
|
> is high, column lineage will be limited for those files — use table-level tools
|
|
@@ -205,16 +211,21 @@ sqlcg db init # initialise graph database
|
|
|
205
211
|
sqlcg index <path> --dialect snowflake # index SQL files (snowflake is the tested dialect)
|
|
206
212
|
sqlcg index <path> --dialect auto # read dialect from .sqlcg.toml
|
|
207
213
|
sqlcg index <path> --profile # index + print per-stage timing and slowest files
|
|
214
|
+
sqlcg index <path> --include-working-tree # also index uncommitted changes (marks graph dirty)
|
|
208
215
|
sqlcg reindex <path> --from <sha> --to <sha> # incremental resync of only changed files
|
|
209
216
|
sqlcg analyze unused # tables with no query references
|
|
210
217
|
sqlcg analyze upstream/downstream # trace lineage from the CLI
|
|
211
218
|
sqlcg find table/column/pattern # search the graph
|
|
212
219
|
sqlcg watch <path> # watch for file changes
|
|
220
|
+
sqlcg db info # graph stats + freshness (indexed SHA vs HEAD)
|
|
213
221
|
sqlcg git install-hooks # install post-checkout + post-merge resync hooks
|
|
214
222
|
sqlcg gain # show usage metrics
|
|
215
223
|
sqlcg report # generate FP/error report
|
|
216
224
|
sqlcg mcp best-practices # print the fact/heuristic boundary for the MCP tools
|
|
217
225
|
sqlcg mcp start # start MCP server manually
|
|
226
|
+
sqlcg mcp status # server status JSON (via control socket)
|
|
227
|
+
sqlcg mcp stop # stop the running MCP server gracefully
|
|
228
|
+
sqlcg mcp restart # stop the server (client must respawn it)
|
|
218
229
|
sqlcg version # show installed version
|
|
219
230
|
```
|
|
220
231
|
|