data-flow-control 0.1.2__tar.gz → 0.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/Cargo.lock +3 -3
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/Cargo.toml +1 -1
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/PKG-INFO +1 -1
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/catalog.rs +84 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/compiled.rs +2 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/dimensions.rs +21 -11
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/columns.rs +65 -2
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/mod.rs +1 -1
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/dimensions.rs +37 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/pyproject.toml +1 -1
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/LICENSE +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/Cargo.toml +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/benches/rewrite_perf.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/aggregate_registry.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/diagnostics.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/explain.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/full_push.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/identifiers.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/intern.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/ir.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/lib.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/optimizer.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/parser.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/partial_push.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/planner.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_compile.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_index.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_parser.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_pgn.pest +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/branch.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/delete.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/indexes.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/memory.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/query_analysis.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewrite_stats.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewrite_strategy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/aggregates.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/columns.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/constraint_preprocess.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/derived_policy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/exists.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/expr.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/helpers.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/limit.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/actions.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/applicability.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/dominance.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/scope_plan.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/write_plan.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/policy_expr.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/projection.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/resolution.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/scope.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/select.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/types.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/write_path.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/semiring.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_set_index.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/analysis.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/annotations.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/branch.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/rewrites.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/split.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/ast_stats.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/builders.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/dialect.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/expr.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/expr_key.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/parse.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/sql/render.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/statement_tables.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/threshold.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/common/duckdb.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/common/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/conformance.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/main.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/partial_push.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/pgn.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/pgn_unique.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/policy_storage.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/rewrite_api_parity.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/semiring.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/source_sets.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/symmetric_self_join.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/threshold.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/unique_not_unique.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/dialect.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/insert.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/kill.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/main.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/oracle.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/remove.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/execution/update.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/expected/duckdb/remove_scan.sql +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/expected/postgres/remove_scan.sql +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/expected/sqlite/remove_scan.sql +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/explain_strategy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/column_propagation.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/exists_join.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/having_where.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/identifiers.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/insert_shapes.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/main.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/multi_source.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/operators.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/query_shapes.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/scalar_subquery.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/indexed_candidate_differential.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/insert_values_body.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/paper_examples.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/parser.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/planner.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/policy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/policy_dialect.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/policy_store_memory.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/derived_policy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/in_semijoin.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/insert.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/joins.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/main.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/output.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/recursive.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/scan.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/update.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_candidate_regression.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_fast_paths.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_large_registry.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_stats_timings.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/scan_ready_expr.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/source_set_split_no_parse.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/sql_builders.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/sql_columns.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/ui_resolution.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/Cargo.toml +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/catalog.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/errors.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/mod.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/planner.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/policy.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/bindings/stats.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-py/src/lib.rs +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/__init__.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/_rust.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/__init__.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/base.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/clickhouse.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/datafusion.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/duckdb.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/kill.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/pg_catalog.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/postgres.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/registry.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/sqlite.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/umbra.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/aggregate_introspection.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/catalog.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/connection.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/dialect.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/__init__.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/agent.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/call_tool_with_dataflow.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/database.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/middleware.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/schema.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/sql_validation.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/tool_spec.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/wrapper.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/options.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/planner.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/policy.py +0 -0
- {data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/ui.py +0 -0
|
@@ -1594,7 +1594,7 @@ dependencies = [
|
|
|
1594
1594
|
|
|
1595
1595
|
[[package]]
|
|
1596
1596
|
name = "passant-cli"
|
|
1597
|
-
version = "0.1.
|
|
1597
|
+
version = "0.1.3"
|
|
1598
1598
|
dependencies = [
|
|
1599
1599
|
"anyhow",
|
|
1600
1600
|
"assert_cmd",
|
|
@@ -1606,7 +1606,7 @@ dependencies = [
|
|
|
1606
1606
|
|
|
1607
1607
|
[[package]]
|
|
1608
1608
|
name = "passant-core"
|
|
1609
|
-
version = "0.1.
|
|
1609
|
+
version = "0.1.3"
|
|
1610
1610
|
dependencies = [
|
|
1611
1611
|
"anyhow",
|
|
1612
1612
|
"criterion",
|
|
@@ -1624,7 +1624,7 @@ dependencies = [
|
|
|
1624
1624
|
|
|
1625
1625
|
[[package]]
|
|
1626
1626
|
name = "passant-py"
|
|
1627
|
-
version = "0.1.
|
|
1627
|
+
version = "0.1.3"
|
|
1628
1628
|
dependencies = [
|
|
1629
1629
|
"passant-core",
|
|
1630
1630
|
"pyo3",
|
|
@@ -16,6 +16,7 @@ use crate::policy::{PolicyIr, Resolution};
|
|
|
16
16
|
use crate::policy_compile::{
|
|
17
17
|
ParsedPolicyConstraint, parse_policy_constraint, parse_policy_constraint_with_registry,
|
|
18
18
|
};
|
|
19
|
+
use crate::sql::collect_query_projection_column_names;
|
|
19
20
|
|
|
20
21
|
/// Catalog facts supplied at policy registration time (from any adapter snapshot).
|
|
21
22
|
#[derive(Debug, Default, Clone)]
|
|
@@ -389,6 +390,24 @@ fn validate_pgn_policy_parsed(
|
|
|
389
390
|
dimension_columns.insert(TableKey::new(alias), columns.clone());
|
|
390
391
|
dimension_columns.insert(TableKey::new(base), columns);
|
|
391
392
|
}
|
|
393
|
+
for (alias, query_sql) in dimension_queries {
|
|
394
|
+
let columns = collect_query_projection_column_names(query_sql)
|
|
395
|
+
.map_err(|err| {
|
|
396
|
+
RewriteError::catalog_with_context(
|
|
397
|
+
ErrorKind::UnknownColumn,
|
|
398
|
+
format!(
|
|
399
|
+
"Dimension subquery '{alias}' has invalid projection for catalog validation: {err}"
|
|
400
|
+
),
|
|
401
|
+
Some(alias.clone()),
|
|
402
|
+
None,
|
|
403
|
+
Some(constraint.to_string()),
|
|
404
|
+
Some("catalog_validation"),
|
|
405
|
+
)
|
|
406
|
+
})?
|
|
407
|
+
.into_iter()
|
|
408
|
+
.collect::<HashSet<_>>();
|
|
409
|
+
dimension_columns.insert(TableKey::new(alias), columns);
|
|
410
|
+
}
|
|
392
411
|
|
|
393
412
|
let source_names = sources
|
|
394
413
|
.iter()
|
|
@@ -495,6 +514,7 @@ fn validate_pgn_policy_parsed(
|
|
|
495
514
|
&table_key,
|
|
496
515
|
dimension_tables,
|
|
497
516
|
dimension_aliases,
|
|
517
|
+
dimension_queries,
|
|
498
518
|
&dimension_columns,
|
|
499
519
|
) {
|
|
500
520
|
if !columns.contains(&column_key) {
|
|
@@ -544,6 +564,7 @@ fn resolve_dimension_columns<'a>(
|
|
|
544
564
|
table_key: &TableKey,
|
|
545
565
|
dimension_tables: &[String],
|
|
546
566
|
dimension_aliases: &HashMap<String, String>,
|
|
567
|
+
dimension_queries: &HashMap<String, String>,
|
|
547
568
|
dimension_columns: &'a HashMap<TableKey, HashSet<String>>,
|
|
548
569
|
) -> Option<&'a HashSet<String>> {
|
|
549
570
|
if dimension_tables
|
|
@@ -552,7 +573,13 @@ fn resolve_dimension_columns<'a>(
|
|
|
552
573
|
{
|
|
553
574
|
return dimension_columns.get(table_key);
|
|
554
575
|
}
|
|
576
|
+
if dimension_queries.contains_key(table_key.as_str()) {
|
|
577
|
+
return dimension_columns.get(table_key);
|
|
578
|
+
}
|
|
555
579
|
if let Some(base) = dimension_aliases.get(table_key.as_str()) {
|
|
580
|
+
if dimension_queries.contains_key(base) {
|
|
581
|
+
return dimension_columns.get(table_key);
|
|
582
|
+
}
|
|
556
583
|
return dimension_columns.get(&TableKey::new(base));
|
|
557
584
|
}
|
|
558
585
|
dimension_columns.get(table_key)
|
|
@@ -1054,6 +1081,63 @@ mod tests {
|
|
|
1054
1081
|
.expect("dimension alias column should validate");
|
|
1055
1082
|
}
|
|
1056
1083
|
|
|
1084
|
+
#[test]
|
|
1085
|
+
fn validates_constraint_columns_through_dimension_subquery_alias() {
|
|
1086
|
+
let catalog = sample_catalog();
|
|
1087
|
+
let mut dimension_aliases = HashMap::new();
|
|
1088
|
+
dimension_aliases.insert("u".to_string(), "u".to_string());
|
|
1089
|
+
let mut dimension_queries = HashMap::new();
|
|
1090
|
+
dimension_queries.insert(
|
|
1091
|
+
"u".to_string(),
|
|
1092
|
+
"(SELECT user_id FROM session_user)".to_string(),
|
|
1093
|
+
);
|
|
1094
|
+
let policy = PolicyIr::Pgn {
|
|
1095
|
+
sources: vec!["foo".into()],
|
|
1096
|
+
required_sources: Vec::new(),
|
|
1097
|
+
dimension_tables: Vec::new(),
|
|
1098
|
+
dimension_aliases,
|
|
1099
|
+
dimension_queries,
|
|
1100
|
+
sink: None,
|
|
1101
|
+
sink_alias: None,
|
|
1102
|
+
source_aliases: HashMap::new(),
|
|
1103
|
+
constraint: "max(foo.id) > 1 AND u.user_id = 1".into(),
|
|
1104
|
+
on_fail: Resolution::Remove,
|
|
1105
|
+
description: None,
|
|
1106
|
+
};
|
|
1107
|
+
catalog
|
|
1108
|
+
.validate_policy(&policy, &sample_registry())
|
|
1109
|
+
.expect("dimension subquery alias column should validate");
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
#[test]
|
|
1113
|
+
fn rejects_unknown_dimension_subquery_column() {
|
|
1114
|
+
let catalog = sample_catalog();
|
|
1115
|
+
let mut dimension_aliases = HashMap::new();
|
|
1116
|
+
dimension_aliases.insert("u".to_string(), "u".to_string());
|
|
1117
|
+
let mut dimension_queries = HashMap::new();
|
|
1118
|
+
dimension_queries.insert(
|
|
1119
|
+
"u".to_string(),
|
|
1120
|
+
"(SELECT user_id FROM session_user)".to_string(),
|
|
1121
|
+
);
|
|
1122
|
+
let policy = PolicyIr::Pgn {
|
|
1123
|
+
sources: vec!["foo".into()],
|
|
1124
|
+
required_sources: Vec::new(),
|
|
1125
|
+
dimension_tables: Vec::new(),
|
|
1126
|
+
dimension_aliases,
|
|
1127
|
+
dimension_queries,
|
|
1128
|
+
sink: None,
|
|
1129
|
+
sink_alias: None,
|
|
1130
|
+
source_aliases: HashMap::new(),
|
|
1131
|
+
constraint: "max(foo.id) > 1 AND u.missing = 1".into(),
|
|
1132
|
+
on_fail: Resolution::Remove,
|
|
1133
|
+
description: None,
|
|
1134
|
+
};
|
|
1135
|
+
let err = catalog
|
|
1136
|
+
.validate_policy(&policy, &sample_registry())
|
|
1137
|
+
.unwrap_err();
|
|
1138
|
+
assert_eq!(err.kind(), ErrorKind::UnknownColumn);
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1057
1141
|
#[test]
|
|
1058
1142
|
fn rejects_unknown_dimension_column() {
|
|
1059
1143
|
let mut catalog = sample_catalog();
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/compiled.rs
RENAMED
|
@@ -140,6 +140,7 @@ impl PolicyStore {
|
|
|
140
140
|
&compiled.ast,
|
|
141
141
|
policy.dimension_tables(),
|
|
142
142
|
policy.dimension_aliases(),
|
|
143
|
+
policy.dimension_queries(),
|
|
143
144
|
&source_key_set,
|
|
144
145
|
)
|
|
145
146
|
});
|
|
@@ -226,6 +227,7 @@ pub(crate) fn compile_branch_policy(
|
|
|
226
227
|
&constraint_ast,
|
|
227
228
|
policy.dimension_tables(),
|
|
228
229
|
policy.dimension_aliases(),
|
|
230
|
+
policy.dimension_queries(),
|
|
229
231
|
&source_key_set,
|
|
230
232
|
)
|
|
231
233
|
};
|
|
@@ -56,6 +56,7 @@ pub(crate) fn inject_policy_dimensions(
|
|
|
56
56
|
constraint,
|
|
57
57
|
dimension_tables,
|
|
58
58
|
dimension_aliases,
|
|
59
|
+
dimension_queries,
|
|
59
60
|
&source_keys,
|
|
60
61
|
)?
|
|
61
62
|
};
|
|
@@ -175,11 +176,9 @@ pub(crate) fn inject_policy_dimensions(
|
|
|
175
176
|
append_dimension_join(select, factor, join.on)?;
|
|
176
177
|
joined_keys.insert(table_key);
|
|
177
178
|
} else {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
another dimension in the policy constraint and catalog row count is not 1"
|
|
182
|
-
));
|
|
179
|
+
warnings.push(expansion_warning(alias));
|
|
180
|
+
append_dimension_join(select, factor, None)?;
|
|
181
|
+
joined_keys.insert(table_key);
|
|
183
182
|
}
|
|
184
183
|
}
|
|
185
184
|
|
|
@@ -405,9 +404,10 @@ pub(crate) fn compile_dimension_join_plan(
|
|
|
405
404
|
constraint_ast: &Expr,
|
|
406
405
|
dimension_tables: &[String],
|
|
407
406
|
dimension_aliases: &HashMap<String, String>,
|
|
407
|
+
dimension_queries: &HashMap<String, String>,
|
|
408
408
|
source_keys: &HashSet<TableKey>,
|
|
409
409
|
) -> Option<DimensionJoinPlan> {
|
|
410
|
-
if dimension_tables.is_empty() {
|
|
410
|
+
if dimension_tables.is_empty() && dimension_queries.is_empty() {
|
|
411
411
|
return None;
|
|
412
412
|
}
|
|
413
413
|
let mut dimension_keys = HashSet::new();
|
|
@@ -419,6 +419,9 @@ pub(crate) fn compile_dimension_join_plan(
|
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
421
|
}
|
|
422
|
+
for alias in dimension_queries.keys() {
|
|
423
|
+
dimension_keys.insert(TableKey::new(alias));
|
|
424
|
+
}
|
|
422
425
|
let mut source_conditions = HashMap::new();
|
|
423
426
|
let mut dimension_edges = Vec::new();
|
|
424
427
|
collect_dimension_join_graph(
|
|
@@ -454,17 +457,24 @@ fn dimension_join_graph(
|
|
|
454
457
|
constraint: &str,
|
|
455
458
|
dimension_tables: &[String],
|
|
456
459
|
dimension_aliases: &HashMap<String, String>,
|
|
460
|
+
dimension_queries: &HashMap<String, String>,
|
|
457
461
|
source_keys: &HashSet<TableKey>,
|
|
458
462
|
) -> Result<(HashMap<TableKey, Expr>, Vec<DimensionJoinEdge>), RewriteError> {
|
|
459
463
|
let constraint = preprocess_policy_constraint(constraint);
|
|
460
464
|
let expr = parse_projection_expr(&constraint).map_err(|err| {
|
|
461
465
|
RewriteError::unsupported_statement(format!("dimension join analysis: {err}"))
|
|
462
466
|
})?;
|
|
463
|
-
let plan = compile_dimension_join_plan(
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
467
|
+
let plan = compile_dimension_join_plan(
|
|
468
|
+
&expr,
|
|
469
|
+
dimension_tables,
|
|
470
|
+
dimension_aliases,
|
|
471
|
+
dimension_queries,
|
|
472
|
+
source_keys,
|
|
473
|
+
)
|
|
474
|
+
.unwrap_or(DimensionJoinPlan {
|
|
475
|
+
source_conditions: HashMap::new(),
|
|
476
|
+
dimension_edges: Vec::new(),
|
|
477
|
+
});
|
|
468
478
|
Ok((plan.source_conditions, plan.dimension_edges))
|
|
469
479
|
}
|
|
470
480
|
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
//! Qualified-column extraction from constraint ASTs.
|
|
2
2
|
|
|
3
3
|
use sqlparser::ast::{
|
|
4
|
-
Array, Expr, Function, FunctionArg, FunctionArgExpr, FunctionArguments, Map,
|
|
4
|
+
Array, Expr, Function, FunctionArg, FunctionArgExpr, FunctionArguments, Map, SelectItem,
|
|
5
|
+
SetExpr, Statement, Subscript,
|
|
5
6
|
};
|
|
6
7
|
|
|
7
|
-
use crate::
|
|
8
|
+
use crate::diagnostics::RewriteError;
|
|
9
|
+
use crate::identifiers::{ColumnName, QualifiedColumn};
|
|
10
|
+
use crate::parser::parse_query;
|
|
8
11
|
|
|
9
12
|
pub fn collect_qualified_columns_from_expr(expr: &Expr) -> Vec<QualifiedColumn> {
|
|
10
13
|
let mut found = Vec::new();
|
|
@@ -12,6 +15,66 @@ pub fn collect_qualified_columns_from_expr(expr: &Expr) -> Vec<QualifiedColumn>
|
|
|
12
15
|
found
|
|
13
16
|
}
|
|
14
17
|
|
|
18
|
+
/// Output column names from a dimension subquery SELECT list.
|
|
19
|
+
pub fn collect_query_projection_column_names(query_sql: &str) -> Result<Vec<String>, RewriteError> {
|
|
20
|
+
let select = dimension_subquery_select(query_sql)?;
|
|
21
|
+
let mut names = Vec::new();
|
|
22
|
+
for item in &select.projection {
|
|
23
|
+
match item {
|
|
24
|
+
SelectItem::UnnamedExpr(expr) => {
|
|
25
|
+
let Some(name) = projection_column_name(expr) else {
|
|
26
|
+
return Err(RewriteError::unsupported_statement(format!(
|
|
27
|
+
"dimension subquery projection must name columns explicitly: {item}"
|
|
28
|
+
)));
|
|
29
|
+
};
|
|
30
|
+
names.push(ColumnName::new(name).key());
|
|
31
|
+
}
|
|
32
|
+
SelectItem::ExprWithAlias { alias, .. } => {
|
|
33
|
+
names.push(ColumnName::new(alias.value.as_str()).key());
|
|
34
|
+
}
|
|
35
|
+
SelectItem::Wildcard(_) | SelectItem::QualifiedWildcard(_, _) => {
|
|
36
|
+
return Err(RewriteError::unsupported_statement(
|
|
37
|
+
"dimension subquery projections with * are not supported for catalog validation",
|
|
38
|
+
));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if names.is_empty() {
|
|
43
|
+
return Err(RewriteError::unsupported_statement(
|
|
44
|
+
"dimension subquery must project at least one column",
|
|
45
|
+
));
|
|
46
|
+
}
|
|
47
|
+
Ok(names)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fn dimension_subquery_select(query_sql: &str) -> Result<sqlparser::ast::Select, RewriteError> {
|
|
51
|
+
let statement = parse_query(query_sql)?;
|
|
52
|
+
let Statement::Query(query) = statement else {
|
|
53
|
+
return Err(RewriteError::unsupported_statement(
|
|
54
|
+
"dimension subquery must be a query",
|
|
55
|
+
));
|
|
56
|
+
};
|
|
57
|
+
select_from_set_expr(*query.body)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
fn select_from_set_expr(body: SetExpr) -> Result<sqlparser::ast::Select, RewriteError> {
|
|
61
|
+
match body {
|
|
62
|
+
SetExpr::Select(select) => Ok(*select),
|
|
63
|
+
SetExpr::Query(query) => select_from_set_expr(*query.body),
|
|
64
|
+
other => Err(RewriteError::unsupported_statement(format!(
|
|
65
|
+
"dimension subquery must be a SELECT, got {other}"
|
|
66
|
+
))),
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
fn projection_column_name(expr: &Expr) -> Option<String> {
|
|
71
|
+
match expr {
|
|
72
|
+
Expr::Identifier(ident) => Some(ident.value.clone()),
|
|
73
|
+
Expr::CompoundIdentifier(parts) => parts.last().map(|ident| ident.value.clone()),
|
|
74
|
+
_ => None,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
15
78
|
fn visit_expr(expr: &Expr, found: &mut Vec<QualifiedColumn>) {
|
|
16
79
|
if let Some(column) = QualifiedColumn::from_expr(expr) {
|
|
17
80
|
found.push(column);
|
|
@@ -25,5 +25,5 @@ pub use builders::{
|
|
|
25
25
|
query_from_select, sanitize_projection_alias, scalar_subquery, statement_from_query,
|
|
26
26
|
string_concat, string_literal, table_alias, table_factor, with_ctes, wrap_table_with_filter,
|
|
27
27
|
};
|
|
28
|
-
pub use columns::collect_qualified_columns_from_expr;
|
|
28
|
+
pub use columns::{collect_qualified_columns_from_expr, collect_query_projection_column_names};
|
|
29
29
|
pub use expr::{rename_table_refs, replace_expr_subtrees, unqualify_table_refs};
|
|
@@ -132,6 +132,43 @@ fn dimension_alias_qualifiers_rewrite_after_injection() {
|
|
|
132
132
|
);
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
#[test]
|
|
136
|
+
fn dimension_subquery_alias_in_constraint_rewrites() {
|
|
137
|
+
let mut catalog = TableCatalog::new();
|
|
138
|
+
catalog.register_table("foo", vec!["id".to_string()]);
|
|
139
|
+
catalog.register_table("session_user", vec!["user_id".to_string()]);
|
|
140
|
+
catalog.register_table_row_count("session_user", 1);
|
|
141
|
+
let mut dimension_aliases = HashMap::new();
|
|
142
|
+
dimension_aliases.insert("u".to_string(), "u".to_string());
|
|
143
|
+
let mut dimension_queries = HashMap::new();
|
|
144
|
+
dimension_queries.insert(
|
|
145
|
+
"u".to_string(),
|
|
146
|
+
"(SELECT user_id FROM session_user)".to_string(),
|
|
147
|
+
);
|
|
148
|
+
let policy = PolicyIr::Pgn {
|
|
149
|
+
sources: vec!["foo".to_string()],
|
|
150
|
+
required_sources: Vec::new(),
|
|
151
|
+
dimension_tables: Vec::new(),
|
|
152
|
+
dimension_aliases,
|
|
153
|
+
dimension_queries,
|
|
154
|
+
sink: None,
|
|
155
|
+
sink_alias: None,
|
|
156
|
+
source_aliases: HashMap::new(),
|
|
157
|
+
constraint: "max(foo.id) > 0 AND u.user_id = 1".to_string(),
|
|
158
|
+
on_fail: Resolution::Remove,
|
|
159
|
+
description: None,
|
|
160
|
+
};
|
|
161
|
+
let sql = rewrite_with_catalog("SELECT foo.id FROM foo", &[policy], catalog);
|
|
162
|
+
assert!(
|
|
163
|
+
sql.contains("u.user_id = 1"),
|
|
164
|
+
"expected dimension subquery alias in rewritten SQL: {sql}"
|
|
165
|
+
);
|
|
166
|
+
assert!(
|
|
167
|
+
sql.contains("SELECT user_id FROM session_user") || sql.contains("session_user"),
|
|
168
|
+
"expected dimension subquery injected: {sql}"
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
135
172
|
#[test]
|
|
136
173
|
fn catalog_rejects_unknown_dimension_table() {
|
|
137
174
|
let mut catalog = TableCatalog::new();
|
|
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
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/policy_store/indexes.rs
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
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/derived_policy.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/actions.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/applicability.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/dominance.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/scope_plan.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/plan/write_plan.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/rewriter/policy_expr.rs
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
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/analysis.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/annotations.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/src/source_sets/rewrites.rs
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/conformance.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/partial_push.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/pgn_unique.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/policy_storage.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/semiring.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/source_sets.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/completion/threshold.rs
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/column_propagation.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/insert_shapes.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/gaps/scalar_subquery.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/insert_values_body.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/policy_store_memory.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/derived_policy.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite/in_semijoin.rs
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
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_fast_paths.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_large_registry.rs
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/rewrite_stats_timings.rs
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/passant-core/tests/source_set_split_no_parse.rs
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/__init__.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/base.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/clickhouse.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/datafusion.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/duckdb.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/kill.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/pg_catalog.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/postgres.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/registry.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/sqlite.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/adapters/umbra.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/__init__.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/agent.py
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/database.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/middleware.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/schema.py
RENAMED
|
File without changes
|
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/tool_spec.py
RENAMED
|
File without changes
|
{data_flow_control-0.1.2 → data_flow_control-0.1.3}/python/data_flow_control/langchain/wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|