data-flow-control 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/Cargo.lock +73 -74
  2. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/Cargo.toml +1 -1
  3. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/PKG-INFO +1 -1
  4. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/catalog.rs +84 -0
  5. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/compiled.rs +2 -0
  6. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/dimensions.rs +21 -11
  7. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/actions.rs +11 -0
  8. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/resolution.rs +88 -1
  9. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/select.rs +2 -0
  10. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/columns.rs +65 -2
  11. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/mod.rs +1 -1
  12. data_flow_control-0.1.4/passant-core/tests/execution/kill.rs +116 -0
  13. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/dimensions.rs +37 -0
  14. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/insert_shapes.rs +74 -0
  15. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/scan.rs +28 -0
  16. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/pyproject.toml +1 -1
  17. data_flow_control-0.1.2/passant-core/tests/execution/kill.rs +0 -48
  18. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/LICENSE +0 -0
  19. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/Cargo.toml +0 -0
  20. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/benches/rewrite_perf.rs +0 -0
  21. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/aggregate_registry.rs +0 -0
  22. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/diagnostics.rs +0 -0
  23. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/explain.rs +0 -0
  24. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/full_push.rs +0 -0
  25. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/identifiers.rs +0 -0
  26. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/intern.rs +0 -0
  27. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/ir.rs +0 -0
  28. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/lib.rs +0 -0
  29. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/optimizer.rs +0 -0
  30. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/parser.rs +0 -0
  31. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/partial_push.rs +0 -0
  32. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/planner.rs +0 -0
  33. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy.rs +0 -0
  34. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_compile.rs +0 -0
  35. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_index.rs +0 -0
  36. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_parser.rs +0 -0
  37. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_pgn.pest +0 -0
  38. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/branch.rs +0 -0
  39. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/delete.rs +0 -0
  40. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/indexes.rs +0 -0
  41. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/memory.rs +0 -0
  42. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/policy_store/mod.rs +0 -0
  43. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/query_analysis.rs +0 -0
  44. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewrite_stats.rs +0 -0
  45. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewrite_strategy.rs +0 -0
  46. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/aggregates.rs +0 -0
  47. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/columns.rs +0 -0
  48. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/constraint_preprocess.rs +0 -0
  49. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/derived_policy.rs +0 -0
  50. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/exists.rs +0 -0
  51. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/expr.rs +0 -0
  52. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/helpers.rs +0 -0
  53. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/limit.rs +0 -0
  54. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/mod.rs +0 -0
  55. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/applicability.rs +0 -0
  56. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/dominance.rs +0 -0
  57. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/mod.rs +0 -0
  58. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/scope_plan.rs +0 -0
  59. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/plan/write_plan.rs +0 -0
  60. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/policy_expr.rs +0 -0
  61. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/projection.rs +0 -0
  62. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/scope.rs +0 -0
  63. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/types.rs +0 -0
  64. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/rewriter/write_path.rs +0 -0
  65. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/semiring.rs +0 -0
  66. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_set_index.rs +0 -0
  67. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/analysis.rs +0 -0
  68. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/annotations.rs +0 -0
  69. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/branch.rs +0 -0
  70. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/mod.rs +0 -0
  71. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/rewrites.rs +0 -0
  72. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/source_sets/split.rs +0 -0
  73. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/ast_stats.rs +0 -0
  74. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/builders.rs +0 -0
  75. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/dialect.rs +0 -0
  76. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/expr.rs +0 -0
  77. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/expr_key.rs +0 -0
  78. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/parse.rs +0 -0
  79. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/sql/render.rs +0 -0
  80. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/statement_tables.rs +0 -0
  81. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/src/threshold.rs +0 -0
  82. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/common/duckdb.rs +0 -0
  83. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/common/mod.rs +0 -0
  84. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/conformance.rs +0 -0
  85. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/main.rs +0 -0
  86. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/partial_push.rs +0 -0
  87. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/pgn.rs +0 -0
  88. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/pgn_unique.rs +0 -0
  89. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/policy_storage.rs +0 -0
  90. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/rewrite_api_parity.rs +0 -0
  91. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/semiring.rs +0 -0
  92. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/source_sets.rs +0 -0
  93. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/symmetric_self_join.rs +0 -0
  94. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/threshold.rs +0 -0
  95. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/completion/unique_not_unique.rs +0 -0
  96. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/dialect.rs +0 -0
  97. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/execution/insert.rs +0 -0
  98. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/execution/main.rs +0 -0
  99. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/execution/oracle.rs +0 -0
  100. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/execution/remove.rs +0 -0
  101. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/execution/update.rs +0 -0
  102. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/expected/duckdb/remove_scan.sql +0 -0
  103. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/expected/postgres/remove_scan.sql +0 -0
  104. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/expected/sqlite/remove_scan.sql +0 -0
  105. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/explain_strategy.rs +0 -0
  106. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/column_propagation.rs +0 -0
  107. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/exists_join.rs +0 -0
  108. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/having_where.rs +0 -0
  109. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/identifiers.rs +0 -0
  110. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/main.rs +0 -0
  111. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/multi_source.rs +0 -0
  112. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/operators.rs +0 -0
  113. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/query_shapes.rs +0 -0
  114. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/gaps/scalar_subquery.rs +0 -0
  115. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/indexed_candidate_differential.rs +0 -0
  116. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/insert_values_body.rs +0 -0
  117. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/paper_examples.rs +0 -0
  118. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/parser.rs +0 -0
  119. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/planner.rs +0 -0
  120. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/policy.rs +0 -0
  121. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/policy_dialect.rs +0 -0
  122. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/policy_store_memory.rs +0 -0
  123. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/derived_policy.rs +0 -0
  124. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/in_semijoin.rs +0 -0
  125. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/insert.rs +0 -0
  126. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/joins.rs +0 -0
  127. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/main.rs +0 -0
  128. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/output.rs +0 -0
  129. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/recursive.rs +0 -0
  130. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite/update.rs +0 -0
  131. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite_candidate_regression.rs +0 -0
  132. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite_fast_paths.rs +0 -0
  133. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite_large_registry.rs +0 -0
  134. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/rewrite_stats_timings.rs +0 -0
  135. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/scan_ready_expr.rs +0 -0
  136. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/source_set_split_no_parse.rs +0 -0
  137. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/sql_builders.rs +0 -0
  138. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/sql_columns.rs +0 -0
  139. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-core/tests/ui_resolution.rs +0 -0
  140. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/Cargo.toml +0 -0
  141. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/catalog.rs +0 -0
  142. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/errors.rs +0 -0
  143. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/mod.rs +0 -0
  144. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/planner.rs +0 -0
  145. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/policy.rs +0 -0
  146. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/bindings/stats.rs +0 -0
  147. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/passant-py/src/lib.rs +0 -0
  148. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/__init__.py +0 -0
  149. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/_rust.py +0 -0
  150. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/__init__.py +0 -0
  151. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/base.py +0 -0
  152. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/clickhouse.py +0 -0
  153. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/datafusion.py +0 -0
  154. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/duckdb.py +0 -0
  155. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/kill.py +0 -0
  156. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/pg_catalog.py +0 -0
  157. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/postgres.py +0 -0
  158. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/registry.py +0 -0
  159. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/sqlite.py +0 -0
  160. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/adapters/umbra.py +0 -0
  161. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/aggregate_introspection.py +0 -0
  162. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/catalog.py +0 -0
  163. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/connection.py +0 -0
  164. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/dialect.py +0 -0
  165. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/__init__.py +0 -0
  166. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/agent.py +0 -0
  167. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/call_tool_with_dataflow.py +0 -0
  168. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/database.py +0 -0
  169. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/middleware.py +0 -0
  170. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/schema.py +0 -0
  171. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/sql_validation.py +0 -0
  172. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/tool_spec.py +0 -0
  173. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/langchain/wrapper.py +0 -0
  174. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/options.py +0 -0
  175. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/planner.py +0 -0
  176. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/policy.py +0 -0
  177. {data_flow_control-0.1.2 → data_flow_control-0.1.4}/python/data_flow_control/ui.py +0 -0
@@ -323,9 +323,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
323
323
 
324
324
  [[package]]
325
325
  name = "autocfg"
326
- version = "1.5.0"
326
+ version = "1.5.1"
327
327
  source = "registry+https://github.com/rust-lang/crates.io-index"
328
- checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
328
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
329
329
 
330
330
  [[package]]
331
331
  name = "base64"
@@ -335,9 +335,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
335
335
 
336
336
  [[package]]
337
337
  name = "bitflags"
338
- version = "2.11.1"
338
+ version = "2.13.0"
339
339
  source = "registry+https://github.com/rust-lang/crates.io-index"
340
- checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
340
+ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
341
341
 
342
342
  [[package]]
343
343
  name = "bitvec"
@@ -449,9 +449,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
449
449
 
450
450
  [[package]]
451
451
  name = "cc"
452
- version = "1.2.62"
452
+ version = "1.2.64"
453
453
  source = "registry+https://github.com/rust-lang/crates.io-index"
454
- checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
454
+ checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
455
455
  dependencies = [
456
456
  "find-msvc-tools",
457
457
  "jobserver",
@@ -473,9 +473,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
473
473
 
474
474
  [[package]]
475
475
  name = "chrono"
476
- version = "0.4.44"
476
+ version = "0.4.45"
477
477
  source = "registry+https://github.com/rust-lang/crates.io-index"
478
- checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
478
+ checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
479
479
  dependencies = [
480
480
  "iana-time-zone",
481
481
  "num-traits",
@@ -511,9 +511,9 @@ dependencies = [
511
511
 
512
512
  [[package]]
513
513
  name = "clap"
514
- version = "4.6.0"
514
+ version = "4.6.1"
515
515
  source = "registry+https://github.com/rust-lang/crates.io-index"
516
- checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
516
+ checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
517
517
  dependencies = [
518
518
  "clap_builder",
519
519
  "clap_derive",
@@ -533,9 +533,9 @@ dependencies = [
533
533
 
534
534
  [[package]]
535
535
  name = "clap_derive"
536
- version = "4.6.0"
536
+ version = "4.6.1"
537
537
  source = "registry+https://github.com/rust-lang/crates.io-index"
538
- checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
538
+ checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
539
539
  dependencies = [
540
540
  "heck",
541
541
  "proc-macro2",
@@ -744,9 +744,9 @@ dependencies = [
744
744
 
745
745
  [[package]]
746
746
  name = "displaydoc"
747
- version = "0.2.5"
747
+ version = "0.2.6"
748
748
  source = "registry+https://github.com/rust-lang/crates.io-index"
749
- checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
749
+ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
750
750
  dependencies = [
751
751
  "proc-macro2",
752
752
  "quote",
@@ -1008,9 +1008,9 @@ checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
1008
1008
 
1009
1009
  [[package]]
1010
1010
  name = "http"
1011
- version = "1.4.0"
1011
+ version = "1.4.2"
1012
1012
  source = "registry+https://github.com/rust-lang/crates.io-index"
1013
- checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
1013
+ checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
1014
1014
  dependencies = [
1015
1015
  "bytes",
1016
1016
  "itoa",
@@ -1047,9 +1047,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1047
1047
 
1048
1048
  [[package]]
1049
1049
  name = "hyper"
1050
- version = "1.9.0"
1050
+ version = "1.10.1"
1051
1051
  source = "registry+https://github.com/rust-lang/crates.io-index"
1052
- checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
1052
+ checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
1053
1053
  dependencies = [
1054
1054
  "atomic-waker",
1055
1055
  "bytes",
@@ -1300,13 +1300,12 @@ dependencies = [
1300
1300
 
1301
1301
  [[package]]
1302
1302
  name = "js-sys"
1303
- version = "0.3.99"
1303
+ version = "0.3.102"
1304
1304
  source = "registry+https://github.com/rust-lang/crates.io-index"
1305
- checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
1305
+ checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
1306
1306
  dependencies = [
1307
1307
  "cfg-if",
1308
1308
  "futures-util",
1309
- "once_cell",
1310
1309
  "wasm-bindgen",
1311
1310
  ]
1312
1311
 
@@ -1369,9 +1368,9 @@ dependencies = [
1369
1368
 
1370
1369
  [[package]]
1371
1370
  name = "libc"
1372
- version = "0.2.184"
1371
+ version = "0.2.186"
1373
1372
  source = "registry+https://github.com/rust-lang/crates.io-index"
1374
- checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
1373
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
1375
1374
 
1376
1375
  [[package]]
1377
1376
  name = "libduckdb-sys"
@@ -1425,9 +1424,9 @@ dependencies = [
1425
1424
 
1426
1425
  [[package]]
1427
1426
  name = "log"
1428
- version = "0.4.29"
1427
+ version = "0.4.32"
1429
1428
  source = "registry+https://github.com/rust-lang/crates.io-index"
1430
- checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
1429
+ checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
1431
1430
 
1432
1431
  [[package]]
1433
1432
  name = "lru-slab"
@@ -1437,9 +1436,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
1437
1436
 
1438
1437
  [[package]]
1439
1438
  name = "memchr"
1440
- version = "2.8.0"
1439
+ version = "2.8.2"
1441
1440
  source = "registry+https://github.com/rust-lang/crates.io-index"
1442
- checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
1441
+ checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
1443
1442
 
1444
1443
  [[package]]
1445
1444
  name = "memoffset"
@@ -1462,9 +1461,9 @@ dependencies = [
1462
1461
 
1463
1462
  [[package]]
1464
1463
  name = "mio"
1465
- version = "1.2.0"
1464
+ version = "1.2.1"
1466
1465
  source = "registry+https://github.com/rust-lang/crates.io-index"
1467
- checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
1466
+ checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
1468
1467
  dependencies = [
1469
1468
  "libc",
1470
1469
  "wasi",
@@ -1594,7 +1593,7 @@ dependencies = [
1594
1593
 
1595
1594
  [[package]]
1596
1595
  name = "passant-cli"
1597
- version = "0.1.2"
1596
+ version = "0.1.4"
1598
1597
  dependencies = [
1599
1598
  "anyhow",
1600
1599
  "assert_cmd",
@@ -1606,7 +1605,7 @@ dependencies = [
1606
1605
 
1607
1606
  [[package]]
1608
1607
  name = "passant-core"
1609
- version = "0.1.2"
1608
+ version = "0.1.4"
1610
1609
  dependencies = [
1611
1610
  "anyhow",
1612
1611
  "criterion",
@@ -1624,7 +1623,7 @@ dependencies = [
1624
1623
 
1625
1624
  [[package]]
1626
1625
  name = "passant-py"
1627
- version = "0.1.2"
1626
+ version = "0.1.4"
1628
1627
  dependencies = [
1629
1628
  "passant-core",
1630
1629
  "pyo3",
@@ -2052,9 +2051,9 @@ dependencies = [
2052
2051
 
2053
2052
  [[package]]
2054
2053
  name = "regex"
2055
- version = "1.12.3"
2054
+ version = "1.12.4"
2056
2055
  source = "registry+https://github.com/rust-lang/crates.io-index"
2057
- checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
2056
+ checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
2058
2057
  dependencies = [
2059
2058
  "aho-corasick",
2060
2059
  "memchr",
@@ -2075,9 +2074,9 @@ dependencies = [
2075
2074
 
2076
2075
  [[package]]
2077
2076
  name = "regex-syntax"
2078
- version = "0.8.10"
2077
+ version = "0.8.11"
2079
2078
  source = "registry+https://github.com/rust-lang/crates.io-index"
2080
- checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
2079
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
2081
2080
 
2082
2081
  [[package]]
2083
2082
  name = "rend"
@@ -2183,9 +2182,9 @@ dependencies = [
2183
2182
 
2184
2183
  [[package]]
2185
2184
  name = "rust_decimal"
2186
- version = "1.42.0"
2185
+ version = "1.42.1"
2187
2186
  source = "registry+https://github.com/rust-lang/crates.io-index"
2188
- checksum = "0c5108e3d4d903e21aac27f12ba5377b6b34f9f44b325e4894c7924169d06995"
2187
+ checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a"
2189
2188
  dependencies = [
2190
2189
  "arrayvec",
2191
2190
  "borsh",
@@ -2330,9 +2329,9 @@ dependencies = [
2330
2329
 
2331
2330
  [[package]]
2332
2331
  name = "serde_json"
2333
- version = "1.0.149"
2332
+ version = "1.0.150"
2334
2333
  source = "registry+https://github.com/rust-lang/crates.io-index"
2335
- checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
2334
+ checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
2336
2335
  dependencies = [
2337
2336
  "itoa",
2338
2337
  "memchr",
@@ -2366,9 +2365,9 @@ dependencies = [
2366
2365
 
2367
2366
  [[package]]
2368
2367
  name = "shlex"
2369
- version = "1.3.0"
2368
+ version = "2.0.1"
2370
2369
  source = "registry+https://github.com/rust-lang/crates.io-index"
2371
- checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
2370
+ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
2372
2371
 
2373
2372
  [[package]]
2374
2373
  name = "simd-adler32"
@@ -2390,15 +2389,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
2390
2389
 
2391
2390
  [[package]]
2392
2391
  name = "smallvec"
2393
- version = "1.15.1"
2392
+ version = "1.15.2"
2394
2393
  source = "registry+https://github.com/rust-lang/crates.io-index"
2395
- checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
2394
+ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
2396
2395
 
2397
2396
  [[package]]
2398
2397
  name = "socket2"
2399
- version = "0.6.3"
2398
+ version = "0.6.4"
2400
2399
  source = "registry+https://github.com/rust-lang/crates.io-index"
2401
- checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
2400
+ checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
2402
2401
  dependencies = [
2403
2402
  "libc",
2404
2403
  "windows-sys 0.61.2",
@@ -2623,9 +2622,9 @@ dependencies = [
2623
2622
 
2624
2623
  [[package]]
2625
2624
  name = "toml_edit"
2626
- version = "0.25.11+spec-1.1.0"
2625
+ version = "0.25.12+spec-1.1.0"
2627
2626
  source = "registry+https://github.com/rust-lang/crates.io-index"
2628
- checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
2627
+ checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
2629
2628
  dependencies = [
2630
2629
  "indexmap",
2631
2630
  "toml_datetime",
@@ -2732,9 +2731,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
2732
2731
 
2733
2732
  [[package]]
2734
2733
  name = "unicode-segmentation"
2735
- version = "1.13.2"
2734
+ version = "1.13.3"
2736
2735
  source = "registry+https://github.com/rust-lang/crates.io-index"
2737
- checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
2736
+ checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
2738
2737
 
2739
2738
  [[package]]
2740
2739
  name = "unicode-width"
@@ -2780,9 +2779,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
2780
2779
 
2781
2780
  [[package]]
2782
2781
  name = "uuid"
2783
- version = "1.23.1"
2782
+ version = "1.23.3"
2784
2783
  source = "registry+https://github.com/rust-lang/crates.io-index"
2785
- checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
2784
+ checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
2786
2785
  dependencies = [
2787
2786
  "js-sys",
2788
2787
  "wasm-bindgen",
@@ -2836,18 +2835,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2836
2835
 
2837
2836
  [[package]]
2838
2837
  name = "wasip2"
2839
- version = "1.0.3+wasi-0.2.9"
2838
+ version = "1.0.4+wasi-0.2.12"
2840
2839
  source = "registry+https://github.com/rust-lang/crates.io-index"
2841
- checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
2840
+ checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2842
2841
  dependencies = [
2843
2842
  "wit-bindgen",
2844
2843
  ]
2845
2844
 
2846
2845
  [[package]]
2847
2846
  name = "wasm-bindgen"
2848
- version = "0.2.122"
2847
+ version = "0.2.125"
2849
2848
  source = "registry+https://github.com/rust-lang/crates.io-index"
2850
- checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
2849
+ checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
2851
2850
  dependencies = [
2852
2851
  "cfg-if",
2853
2852
  "once_cell",
@@ -2859,9 +2858,9 @@ dependencies = [
2859
2858
 
2860
2859
  [[package]]
2861
2860
  name = "wasm-bindgen-futures"
2862
- version = "0.4.72"
2861
+ version = "0.4.75"
2863
2862
  source = "registry+https://github.com/rust-lang/crates.io-index"
2864
- checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f"
2863
+ checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
2865
2864
  dependencies = [
2866
2865
  "js-sys",
2867
2866
  "wasm-bindgen",
@@ -2869,9 +2868,9 @@ dependencies = [
2869
2868
 
2870
2869
  [[package]]
2871
2870
  name = "wasm-bindgen-macro"
2872
- version = "0.2.122"
2871
+ version = "0.2.125"
2873
2872
  source = "registry+https://github.com/rust-lang/crates.io-index"
2874
- checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
2873
+ checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
2875
2874
  dependencies = [
2876
2875
  "quote",
2877
2876
  "wasm-bindgen-macro-support",
@@ -2879,9 +2878,9 @@ dependencies = [
2879
2878
 
2880
2879
  [[package]]
2881
2880
  name = "wasm-bindgen-macro-support"
2882
- version = "0.2.122"
2881
+ version = "0.2.125"
2883
2882
  source = "registry+https://github.com/rust-lang/crates.io-index"
2884
- checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
2883
+ checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
2885
2884
  dependencies = [
2886
2885
  "bumpalo",
2887
2886
  "proc-macro2",
@@ -2892,18 +2891,18 @@ dependencies = [
2892
2891
 
2893
2892
  [[package]]
2894
2893
  name = "wasm-bindgen-shared"
2895
- version = "0.2.122"
2894
+ version = "0.2.125"
2896
2895
  source = "registry+https://github.com/rust-lang/crates.io-index"
2897
- checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
2896
+ checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
2898
2897
  dependencies = [
2899
2898
  "unicode-ident",
2900
2899
  ]
2901
2900
 
2902
2901
  [[package]]
2903
2902
  name = "web-sys"
2904
- version = "0.3.99"
2903
+ version = "0.3.102"
2905
2904
  source = "registry+https://github.com/rust-lang/crates.io-index"
2906
- checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436"
2905
+ checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
2907
2906
  dependencies = [
2908
2907
  "js-sys",
2909
2908
  "wasm-bindgen",
@@ -3231,9 +3230,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
3231
3230
 
3232
3231
  [[package]]
3233
3232
  name = "yoke"
3234
- version = "0.8.2"
3233
+ version = "0.8.3"
3235
3234
  source = "registry+https://github.com/rust-lang/crates.io-index"
3236
- checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
3235
+ checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
3237
3236
  dependencies = [
3238
3237
  "stable_deref_trait",
3239
3238
  "yoke-derive",
@@ -3254,18 +3253,18 @@ dependencies = [
3254
3253
 
3255
3254
  [[package]]
3256
3255
  name = "zerocopy"
3257
- version = "0.8.48"
3256
+ version = "0.8.52"
3258
3257
  source = "registry+https://github.com/rust-lang/crates.io-index"
3259
- checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
3258
+ checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
3260
3259
  dependencies = [
3261
3260
  "zerocopy-derive",
3262
3261
  ]
3263
3262
 
3264
3263
  [[package]]
3265
3264
  name = "zerocopy-derive"
3266
- version = "0.8.48"
3265
+ version = "0.8.52"
3267
3266
  source = "registry+https://github.com/rust-lang/crates.io-index"
3268
- checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
3267
+ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
3269
3268
  dependencies = [
3270
3269
  "proc-macro2",
3271
3270
  "quote",
@@ -3295,9 +3294,9 @@ dependencies = [
3295
3294
 
3296
3295
  [[package]]
3297
3296
  name = "zeroize"
3298
- version = "1.8.2"
3297
+ version = "1.9.0"
3299
3298
  source = "registry+https://github.com/rust-lang/crates.io-index"
3300
- checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
3299
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
3301
3300
 
3302
3301
  [[package]]
3303
3302
  name = "zerotrie"
@@ -3,7 +3,7 @@ members = ["passant-core", "passant-py"]
3
3
  resolver = "2"
4
4
 
5
5
  [workspace.package]
6
- version = "0.1.2"
6
+ version = "0.1.4"
7
7
  edition = "2024"
8
8
  license = "MIT"
9
9
  authors = ["Charlie Summers"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-flow-control
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Requires-Dist: boto3>=1.26.0
5
5
  Requires-Dist: duckdb>=1.3.0
6
6
  Requires-Dist: langchain>=1.3,<2
@@ -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();
@@ -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
- skipped.push(alias.clone());
179
- warnings.push(format!(
180
- "Dimension subquery '{alias}' was not joined: no equality link to the query or \
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(&expr, dimension_tables, dimension_aliases, source_keys)
464
- .unwrap_or(DimensionJoinPlan {
465
- source_conditions: HashMap::new(),
466
- dimension_edges: Vec::new(),
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