@quereus/quereus 3.3.0 → 4.1.0
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.
- package/README.md +7 -0
- package/dist/src/common/datatype.d.ts +12 -0
- package/dist/src/common/datatype.d.ts.map +1 -1
- package/dist/src/common/datatype.js.map +1 -1
- package/dist/src/common/types.d.ts +24 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +37 -9
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +62 -110
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +163 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +235 -21
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-external-changes.d.ts +28 -0
- package/dist/src/core/database-external-changes.d.ts.map +1 -0
- package/dist/src/core/database-external-changes.js +242 -0
- package/dist/src/core/database-external-changes.js.map +1 -0
- package/dist/src/core/database-internal.d.ts +50 -1
- package/dist/src/core/database-internal.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.d.ts +1253 -0
- package/dist/src/core/database-materialized-views.d.ts.map +1 -0
- package/dist/src/core/database-materialized-views.js +3064 -0
- package/dist/src/core/database-materialized-views.js.map +1 -0
- package/dist/src/core/database-options.d.ts +4 -0
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js +10 -0
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +19 -3
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +30 -3
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +19 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -1
- package/dist/src/core/database-watchers.js +63 -3
- package/dist/src/core/database-watchers.js.map +1 -1
- package/dist/src/core/database.d.ts +204 -11
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +493 -29
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/derived-row-validator.d.ts +137 -0
- package/dist/src/core/derived-row-validator.d.ts.map +1 -0
- package/dist/src/core/derived-row-validator.js +314 -0
- package/dist/src/core/derived-row-validator.js.map +1 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +30 -9
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +135 -1
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +793 -118
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +11 -10
- package/dist/src/func/builtins/aggregate.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js +32 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +3 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +229 -0
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +10 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/mutation.d.ts +2 -0
- package/dist/src/func/builtins/mutation.d.ts.map +1 -0
- package/dist/src/func/builtins/mutation.js +53 -0
- package/dist/src/func/builtins/mutation.js.map +1 -0
- package/dist/src/func/builtins/schema.d.ts +2 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +716 -27
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.js +1 -1
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/registration.d.ts +13 -0
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +5 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +25 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +27 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +353 -21
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/index.d.ts +14 -1
- package/dist/src/parser/index.d.ts.map +1 -1
- package/dist/src/parser/index.js +19 -0
- package/dist/src/parser/index.js.map +1 -1
- package/dist/src/parser/lexer.d.ts +9 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +9 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +276 -7
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +1387 -469
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +12 -8
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.js +4 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
- package/dist/src/planner/analysis/assertion-hoist-cache.js +8 -4
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
- package/dist/src/planner/analysis/authored-inverse.d.ts +22 -0
- package/dist/src/planner/analysis/authored-inverse.d.ts.map +1 -0
- package/dist/src/planner/analysis/authored-inverse.js +267 -0
- package/dist/src/planner/analysis/authored-inverse.js.map +1 -0
- package/dist/src/planner/analysis/change-scope.d.ts +34 -4
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +108 -7
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js +174 -46
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
- package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
- package/dist/src/planner/analysis/coarsened-key.js +228 -0
- package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
- package/dist/src/planner/analysis/comparison-collation.js +341 -0
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +3 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +192 -9
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
- package/dist/src/planner/analysis/coverage-prover.js +1038 -0
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
- package/dist/src/planner/analysis/key-filter.d.ts +22 -0
- package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
- package/dist/src/planner/analysis/key-filter.js +105 -0
- package/dist/src/planner/analysis/key-filter.js.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.js +51 -13
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
- package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
- package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
- package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
- package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
- package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
- package/dist/src/planner/analysis/update-lineage.js +322 -0
- package/dist/src/planner/analysis/update-lineage.js.map +1 -0
- package/dist/src/planner/analysis/view-complement.d.ts +42 -0
- package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
- package/dist/src/planner/analysis/view-complement.js +54 -0
- package/dist/src/planner/analysis/view-complement.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +211 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +18 -1
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +33 -5
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +63 -28
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-view.d.ts +9 -0
- package/dist/src/planner/building/create-view.d.ts.map +1 -1
- package/dist/src/planner/building/create-view.js +41 -12
- package/dist/src/planner/building/create-view.js.map +1 -1
- package/dist/src/planner/building/ddl.d.ts.map +1 -1
- package/dist/src/planner/building/ddl.js +94 -0
- package/dist/src/planner/building/ddl.js.map +1 -1
- package/dist/src/planner/building/declare-schema.d.ts +1 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
- package/dist/src/planner/building/declare-schema.js +4 -1
- package/dist/src/planner/building/declare-schema.js.map +1 -1
- package/dist/src/planner/building/default-scope.d.ts +26 -0
- package/dist/src/planner/building/default-scope.d.ts.map +1 -0
- package/dist/src/planner/building/default-scope.js +41 -0
- package/dist/src/planner/building/default-scope.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts +19 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +109 -30
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/dml-target.d.ts +118 -0
- package/dist/src/planner/building/dml-target.d.ts.map +1 -0
- package/dist/src/planner/building/dml-target.js +282 -0
- package/dist/src/planner/building/dml-target.js.map +1 -0
- package/dist/src/planner/building/drop-index.d.ts.map +1 -1
- package/dist/src/planner/building/drop-index.js +4 -1
- package/dist/src/planner/building/drop-index.js.map +1 -1
- package/dist/src/planner/building/drop-view.d.ts.map +1 -1
- package/dist/src/planner/building/drop-view.js +4 -2
- package/dist/src/planner/building/drop-view.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +60 -21
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +160 -129
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts +45 -2
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +257 -88
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
- package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
- package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
- package/dist/src/planner/building/materialized-view.d.ts +16 -0
- package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
- package/dist/src/planner/building/materialized-view.js +57 -0
- package/dist/src/planner/building/materialized-view.js.map +1 -0
- package/dist/src/planner/building/returning-star.d.ts +32 -0
- package/dist/src/planner/building/returning-star.d.ts.map +1 -0
- package/dist/src/planner/building/returning-star.js +45 -0
- package/dist/src/planner/building/returning-star.js.map +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +47 -0
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +84 -11
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +10 -2
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js +7 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +6 -0
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +18 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
- package/dist/src/planner/building/select-ordinal.js +30 -0
- package/dist/src/planner/building/select-ordinal.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +8 -2
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +26 -4
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +8 -5
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +164 -59
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/set-object-tags.d.ts +7 -0
- package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
- package/dist/src/planner/building/set-object-tags.js +38 -0
- package/dist/src/planner/building/set-object-tags.js.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
- package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
- package/dist/src/planner/building/tag-diagnostics.js +37 -0
- package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
- package/dist/src/planner/building/update.d.ts +18 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +134 -58
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
- package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
- package/dist/src/planner/building/view-mutation-builder.js +1158 -0
- package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
- package/dist/src/planner/building/with.d.ts +11 -0
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +48 -10
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +83 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +114 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +38 -4
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +50 -6
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +2 -1
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/registry.d.ts +39 -1
- package/dist/src/planner/framework/registry.d.ts.map +1 -1
- package/dist/src/planner/framework/registry.js +18 -2
- package/dist/src/planner/framework/registry.js.map +1 -1
- package/dist/src/planner/mutation/backward-body.d.ts +131 -0
- package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
- package/dist/src/planner/mutation/backward-body.js +135 -0
- package/dist/src/planner/mutation/backward-body.js.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
- package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
- package/dist/src/planner/mutation/cte-flatten.js +364 -0
- package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
- package/dist/src/planner/mutation/decomposition.d.ts +273 -0
- package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
- package/dist/src/planner/mutation/decomposition.js +1719 -0
- package/dist/src/planner/mutation/decomposition.js.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
- package/dist/src/planner/mutation/lens-enforcement.js +745 -0
- package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
- package/dist/src/planner/mutation/multi-source.d.ts +568 -0
- package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/multi-source.js +2915 -0
- package/dist/src/planner/mutation/multi-source.js.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
- package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
- package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
- package/dist/src/planner/mutation/mutation-tags.js +31 -0
- package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
- package/dist/src/planner/mutation/propagate.d.ts +97 -0
- package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
- package/dist/src/planner/mutation/propagate.js +220 -0
- package/dist/src/planner/mutation/propagate.js.map +1 -0
- package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
- package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
- package/dist/src/planner/mutation/scope-transform.js +574 -0
- package/dist/src/planner/mutation/scope-transform.js.map +1 -0
- package/dist/src/planner/mutation/set-op.d.ts +242 -0
- package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
- package/dist/src/planner/mutation/set-op.js +1687 -0
- package/dist/src/planner/mutation/set-op.js.map +1 -0
- package/dist/src/planner/mutation/single-source.d.ts +261 -0
- package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
- package/dist/src/planner/mutation/single-source.js +1096 -0
- package/dist/src/planner/mutation/single-source.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.js +3 -3
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +5 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.js +27 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
- package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/analyze-node.js +18 -1
- package/dist/src/planner/nodes/analyze-node.js.map +1 -1
- package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
- package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
- package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
- package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.js +33 -8
- package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +2 -1
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
- package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-view-node.js +4 -1
- package/dist/src/planner/nodes/create-view-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.js +32 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +2 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +27 -3
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
- package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
- package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
- package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
- package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
- package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +63 -13
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +41 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +78 -8
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +33 -6
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +124 -9
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
- package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +4 -5
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
- package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
- package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +2 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +9 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +265 -5
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +12 -0
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +14 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +85 -11
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +62 -27
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +7 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +10 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +20 -0
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +71 -14
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
- package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
- package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
- package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +291 -18
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -0
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +7 -6
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/subquery.d.ts +2 -0
- package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js +18 -2
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +23 -3
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +6 -0
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/values-node.d.ts +1 -0
- package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/values-node.js +16 -6
- package/dist/src/planner/nodes/values-node.js.map +1 -1
- package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
- package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/view-mutation-node.js +273 -0
- package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
- package/dist/src/planner/nodes/window-function.d.ts +17 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +15 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js +2 -2
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +372 -39
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
- package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
- package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js.map +1 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +435 -37
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +9 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
- package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +38 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +19 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
- package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
- package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +9 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +12 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +4 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
- package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
- package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
- package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +9 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
- package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +1 -1
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +4 -4
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +12 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts +14 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +66 -21
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +177 -43
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +396 -101
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +27 -1
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +80 -6
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +81 -12
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
- package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
- package/dist/src/planner/util/set-op-wrapper.js +82 -0
- package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +13 -1
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +7 -1
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +30 -1
- package/dist/src/runtime/delta-executor.d.ts.map +1 -1
- package/dist/src/runtime/delta-executor.js +29 -4
- package/dist/src/runtime/delta-executor.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +38 -5
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +10 -8
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +664 -108
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
- package/dist/src/runtime/emit/analyze.js +2 -1
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +18 -5
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
- package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
- package/dist/src/runtime/emit/asserted-keys.js +13 -0
- package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +24 -19
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +5 -9
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/block.d.ts.map +1 -1
- package/dist/src/runtime/emit/block.js +11 -2
- package/dist/src/runtime/emit/block.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/bloom-join.js +8 -2
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +15 -0
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-table.js +8 -0
- package/dist/src/runtime/emit/create-table.js.map +1 -1
- package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-view.js +16 -1
- package/dist/src/runtime/emit/create-view.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +413 -193
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +10 -0
- package/dist/src/runtime/emit/drop-table.js.map +1 -1
- package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-view.js +17 -0
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
- package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/envelope-scan.js +22 -0
- package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts +10 -2
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +128 -38
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
- package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
- package/dist/src/runtime/emit/materialized-view.js +187 -0
- package/dist/src/runtime/emit/materialized-view.js.map +1 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +15 -3
- package/dist/src/runtime/emit/merge-join.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +10 -5
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +101 -5
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
- package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
- package/dist/src/runtime/emit/set-object-tags.js +57 -0
- package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +140 -24
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +110 -5
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/unary.d.ts.map +1 -1
- package/dist/src/runtime/emit/unary.js +34 -6
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
- package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
- package/dist/src/runtime/emit/view-mutation.js +299 -0
- package/dist/src/runtime/emit/view-mutation.js.map +1 -0
- package/dist/src/runtime/emit/window.js +29 -5
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +580 -172
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +4 -1
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +5 -1
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +17 -1
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/types.d.ts +10 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/basis-backfill.d.ts +63 -0
- package/dist/src/schema/basis-backfill.d.ts.map +1 -0
- package/dist/src/schema/basis-backfill.js +161 -0
- package/dist/src/schema/basis-backfill.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +115 -1
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +249 -22
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +42 -1
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/column.d.ts +16 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/constraint-builder.d.ts +182 -0
- package/dist/src/schema/constraint-builder.d.ts.map +1 -0
- package/dist/src/schema/constraint-builder.js +424 -0
- package/dist/src/schema/constraint-builder.js.map +1 -0
- package/dist/src/schema/ddl-generator.d.ts +86 -1
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +316 -20
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +51 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
- package/dist/src/schema/declared-schema-manager.js +61 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -1
- package/dist/src/schema/derivation.d.ts +106 -0
- package/dist/src/schema/derivation.d.ts.map +1 -0
- package/dist/src/schema/derivation.js +25 -0
- package/dist/src/schema/derivation.js.map +1 -0
- package/dist/src/schema/function.d.ts +20 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/lens-ack.d.ts +90 -0
- package/dist/src/schema/lens-ack.d.ts.map +1 -0
- package/dist/src/schema/lens-ack.js +361 -0
- package/dist/src/schema/lens-ack.js.map +1 -0
- package/dist/src/schema/lens-compiler.d.ts +62 -0
- package/dist/src/schema/lens-compiler.d.ts.map +1 -0
- package/dist/src/schema/lens-compiler.js +1594 -0
- package/dist/src/schema/lens-compiler.js.map +1 -0
- package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
- package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
- package/dist/src/schema/lens-fk-discovery.js +336 -0
- package/dist/src/schema/lens-fk-discovery.js.map +1 -0
- package/dist/src/schema/lens-prover.d.ts +336 -0
- package/dist/src/schema/lens-prover.d.ts.map +1 -0
- package/dist/src/schema/lens-prover.js +1988 -0
- package/dist/src/schema/lens-prover.js.map +1 -0
- package/dist/src/schema/lens.d.ts +254 -0
- package/dist/src/schema/lens.d.ts.map +1 -0
- package/dist/src/schema/lens.js +21 -0
- package/dist/src/schema/lens.js.map +1 -0
- package/dist/src/schema/manager.d.ts +676 -18
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +1573 -238
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
- package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
- package/dist/src/schema/mapping-advertisement-tags.js +216 -0
- package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
- package/dist/src/schema/rename-rewriter.d.ts +45 -4
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +412 -19
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
- package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags-policy.js +34 -0
- package/dist/src/schema/reserved-tags-policy.js.map +1 -0
- package/dist/src/schema/reserved-tags.d.ts +170 -0
- package/dist/src/schema/reserved-tags.d.ts.map +1 -0
- package/dist/src/schema/reserved-tags.js +507 -0
- package/dist/src/schema/reserved-tags.js.map +1 -0
- package/dist/src/schema/schema-differ.d.ts +158 -2
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +1460 -78
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema-hasher.d.ts +8 -3
- package/dist/src/schema/schema-hasher.d.ts.map +1 -1
- package/dist/src/schema/schema-hasher.js +22 -2
- package/dist/src/schema/schema-hasher.js.map +1 -1
- package/dist/src/schema/schema.d.ts +25 -1
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +36 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +259 -10
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +309 -26
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +78 -0
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
- package/dist/src/schema/unique-enforcement.js +93 -0
- package/dist/src/schema/unique-enforcement.js.map +1 -0
- package/dist/src/schema/view.d.ts +83 -2
- package/dist/src/schema/view.d.ts.map +1 -1
- package/dist/src/schema/view.js +67 -1
- package/dist/src/schema/view.js.map +1 -1
- package/dist/src/schema/window-function.d.ts +9 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/util/comparison.d.ts +24 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +34 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/mutation-statement.d.ts.map +1 -1
- package/dist/src/util/mutation-statement.js +4 -1
- package/dist/src/util/mutation-statement.js.map +1 -1
- package/dist/src/util/serialization.d.ts +9 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +26 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/backing-host.d.ts +286 -0
- package/dist/src/vtab/backing-host.d.ts.map +1 -0
- package/dist/src/vtab/backing-host.js +118 -0
- package/dist/src/vtab/backing-host.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +21 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/capabilities.d.ts +5 -5
- package/dist/src/vtab/capabilities.d.ts.map +1 -1
- package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
- package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
- package/dist/src/vtab/mapping-advertisement.js +2 -0
- package/dist/src/vtab/mapping-advertisement.js.map +1 -0
- package/dist/src/vtab/memory/index.d.ts +64 -4
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +119 -12
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +38 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +112 -24
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +1050 -91
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
- package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +5 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +17 -0
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +82 -3
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +15 -5
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +20 -2
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +46 -24
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
- package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js +12 -5
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +203 -4
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -0
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +17 -16
|
@@ -20,6 +20,22 @@ export interface ColumnSchema {
|
|
|
20
20
|
defaultValue: Expression | null;
|
|
21
21
|
/** Declared collation sequence name (e.g., "BINARY", "NOCASE", "RTRIM") */
|
|
22
22
|
collation: string;
|
|
23
|
+
/**
|
|
24
|
+
* Whether `collation` is user-declared (true) rather than an implicit default
|
|
25
|
+
* (undefined). Set by a CREATE-time explicit `COLLATE` clause AND by
|
|
26
|
+
* `ALTER COLUMN ... SET COLLATE` (which carries the same standing as a declared
|
|
27
|
+
* clause, incl. `SET COLLATE binary`) — so the flag reflects the current catalog
|
|
28
|
+
* column, not its creation history. Lets a module distinguish a user-declared
|
|
29
|
+
* collation from the default — e.g. the store module keys an *explicit* per-column
|
|
30
|
+
* PK collation natively but applies its own table-level default collation to an
|
|
31
|
+
* *implicit*-default text PK column; the comparison lattice ranks an explicit
|
|
32
|
+
* collation (rank 2 'declared') above a defaulted one (rank 1 'default'). Purely
|
|
33
|
+
* informational; absent ⇒ implicit. NOT persisted as a distinct bit: persisted DDL
|
|
34
|
+
* is fully explicit (an explicit `COLLATE` for any non-BINARY collation, BINARY
|
|
35
|
+
* elided), so a defaulted non-BINARY collation reloads as `collationExplicit: true`
|
|
36
|
+
* and a defaulted/explicit BINARY both reload as implicit — see docs/types.md.
|
|
37
|
+
*/
|
|
38
|
+
collationExplicit?: boolean;
|
|
23
39
|
/** Whether the column is generated (GENERATED ALWAYS AS) */
|
|
24
40
|
generated: boolean;
|
|
25
41
|
/** AST expression for generated columns */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column.d.ts","sourceRoot":"","sources":["../../../src/schema/column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,uFAAuF;IACvF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,wFAAwF;IACxF,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,OAAc,GAAG,YAAY,CAWpG"}
|
|
1
|
+
{"version":3,"file":"column.d.ts","sourceRoot":"","sources":["../../../src/schema/column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,uFAAuF;IACvF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,wFAAwF;IACxF,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,OAAc,GAAG,YAAY,CAWpG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column.js","sourceRoot":"","sources":["../../../src/schema/column.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"column.js","sourceRoot":"","sources":["../../../src/schema/column.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAsDtD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,iBAA0B,IAAI;IACrF,OAAO;QACN,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,cAAc,EAAE,uCAAuC;QAChE,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,QAAQ,EAAE,mBAAmB;QACxC,SAAS,EAAE,KAAK;KAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared AST → constraint-schema builders plus the engine-level FK existing-row
|
|
3
|
+
* validator. These are the single source of truth for turning a table-level
|
|
4
|
+
* `ALTER TABLE … ADD <constraint>` (an `AST.TableConstraint`) into the
|
|
5
|
+
* corresponding {@link UniqueConstraintSchema} / {@link ForeignKeyConstraintSchema},
|
|
6
|
+
* reproducing the canonical mapping that {@link SchemaManager}'s
|
|
7
|
+
* `extractUniqueConstraints` / `extractForeignKeys` table-level arms encode for
|
|
8
|
+
* CREATE TABLE. Both the built-in modules (memory + store, via the
|
|
9
|
+
* `@quereus/quereus` barrel) and the SchemaManager delegate here so the two
|
|
10
|
+
* paths can never drift.
|
|
11
|
+
*
|
|
12
|
+
* Column resolution is always against the CHILD table's `columnIndexMap`
|
|
13
|
+
* (`ALTER TABLE ADD CONSTRAINT` is always the table-level form). Parent-column
|
|
14
|
+
* resolution for a FK stays deferred (the parent may not exist yet) exactly as
|
|
15
|
+
* in the CREATE TABLE path.
|
|
16
|
+
*/
|
|
17
|
+
import type { Database } from '../core/database.js';
|
|
18
|
+
import type { TableSchema, UniqueConstraintSchema, ForeignKeyConstraintSchema, RowConstraintSchema } from './table.js';
|
|
19
|
+
import { QuereusError } from '../common/errors.js';
|
|
20
|
+
import { type SqlValue } from '../common/types.js';
|
|
21
|
+
import type * as AST from '../parser/ast.js';
|
|
22
|
+
/**
|
|
23
|
+
* Builds a {@link UniqueConstraintSchema} from a table-level UNIQUE
|
|
24
|
+
* `AST.TableConstraint`, resolving each declared column name to its index in the
|
|
25
|
+
* child table. Mirrors `SchemaManager.extractUniqueConstraints` (table-level arm).
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildUniqueConstraintSchema(con: AST.TableConstraint, columnIndexMap: ReadonlyMap<string, number>): UniqueConstraintSchema;
|
|
28
|
+
/**
|
|
29
|
+
* Builds a {@link ForeignKeyConstraintSchema} from a table-level FOREIGN KEY
|
|
30
|
+
* `AST.TableConstraint`, resolving child column names to indices and deferring
|
|
31
|
+
* parent-column resolution (the parent table may not exist yet). Mirrors
|
|
32
|
+
* `SchemaManager.extractForeignKeys` (table-level arm), including the
|
|
33
|
+
* child/parent column-count mismatch error.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildForeignKeyConstraintSchema(con: AST.TableConstraint, columnIndexMap: ReadonlyMap<string, number>, childTableName: string, childSchemaName: string): ForeignKeyConstraintSchema;
|
|
36
|
+
/**
|
|
37
|
+
* Builds a {@link RowConstraintSchema} from a table-level CHECK
|
|
38
|
+
* `AST.TableConstraint` (the `ALTER TABLE … ADD CONSTRAINT … CHECK` form). The
|
|
39
|
+
* single source of truth for that mapping, called by the built-in modules
|
|
40
|
+
* (memory + store) so a CHECK added via ALTER lands in the *module-cached*
|
|
41
|
+
* schema, in lock-step with the catalog — the same place inline-CREATE CHECKs
|
|
42
|
+
* live and where `DROP/RENAME CONSTRAINT` later resolve the constraint class. An
|
|
43
|
+
* unnamed CHECK is auto-named `check_<existingCount>`, preserving the engine's
|
|
44
|
+
* prior in-emitter naming (`existingCount` = the number of CHECKs already on the
|
|
45
|
+
* table). Determinism is intentionally NOT validated here — a CHECK may reference
|
|
46
|
+
* `new.*`/`old.*`, which is checked at INSERT/UPDATE plan time.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildCheckConstraintSchema(con: AST.TableConstraint, existingCount: number): RowConstraintSchema;
|
|
49
|
+
/**
|
|
50
|
+
* Extracts the column-level CHECK constraints declared on a single `ALTER TABLE
|
|
51
|
+
* ADD COLUMN` ColumnDef into {@link RowConstraintSchema}s. Used by both the
|
|
52
|
+
* engine's emit layer (to merge into the live in-memory schema) and the store
|
|
53
|
+
* module (to persist into the catalog DDL), so the live and persisted constraint
|
|
54
|
+
* sets cannot drift. Auto-names an unnamed CHECK `_check_<column>`, matching the
|
|
55
|
+
* engine's enforcement naming.
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractColumnLevelCheckConstraints(columnDef: AST.ColumnDef): RowConstraintSchema[];
|
|
58
|
+
/**
|
|
59
|
+
* Extracts the column-level FOREIGN KEY constraints declared on a single `ALTER
|
|
60
|
+
* TABLE ADD COLUMN` ColumnDef into {@link ForeignKeyConstraintSchema}s. The
|
|
61
|
+
* child column index is NOT resolved here (`columns: Object.freeze([])`) — the
|
|
62
|
+
* caller resolves it once the new column's index is known (the engine via
|
|
63
|
+
* `columnIndexMap`, the store to `[newColIdx]`). Used by both the engine's emit
|
|
64
|
+
* layer and the store module so the live and persisted FK sets cannot drift.
|
|
65
|
+
* Auto-names an unnamed FK `_fk_<column>` and enforces the single-child-column
|
|
66
|
+
* count match against the parent column list.
|
|
67
|
+
*/
|
|
68
|
+
export declare function extractColumnLevelForeignKeys(columnDef: AST.ColumnDef, defaultSchemaName: string): ForeignKeyConstraintSchema[];
|
|
69
|
+
/**
|
|
70
|
+
* Extracts the column-level UNIQUE constraints declared on a single `ALTER TABLE
|
|
71
|
+
* ADD COLUMN` ColumnDef into the equivalent **table-level** {@link AST.TableConstraint}s
|
|
72
|
+
* over the new column. Unlike the CHECK / FK extractors above (which return schema
|
|
73
|
+
* objects merged into the live schema), this returns AST table-constraints so the
|
|
74
|
+
* caller can feed each straight to `module.alterTable({ type: 'addConstraint',
|
|
75
|
+
* constraint })` — the same materialize + validate + persist path that
|
|
76
|
+
* `ALTER TABLE … ADD CONSTRAINT … UNIQUE` uses. Without this, an inline UNIQUE on
|
|
77
|
+
* an ADD COLUMN reaches neither CREATE TABLE's `extractUniqueConstraints` nor the
|
|
78
|
+
* ADD CONSTRAINT path, so it would be silently dropped.
|
|
79
|
+
*
|
|
80
|
+
* The synthetic constraint preserves a named inline UNIQUE's name (so it
|
|
81
|
+
* round-trips), `ON CONFLICT`, and tags. `buildUniqueConstraintSchema` reads only
|
|
82
|
+
* those fields plus `columns[].name`, so no `operations` / `direction` is emitted.
|
|
83
|
+
* Each inline `unique` ColumnConstraint becomes its own single-column table
|
|
84
|
+
* constraint over `columnDef.name` (multiple are rare but handled like CHECK / FK).
|
|
85
|
+
*/
|
|
86
|
+
export declare function extractColumnLevelUniqueConstraints(columnDef: AST.ColumnDef): AST.TableConstraint[];
|
|
87
|
+
/** Attributed CHECK diagnostic for a row the derivation wrote into a maintained table. */
|
|
88
|
+
export declare function maintainedTableCheckViolationError(schemaName: string, tableName: string, constraintName: string, exprHint?: string): QuereusError;
|
|
89
|
+
/** Attributed child-side FK diagnostic for a row the derivation wrote into a maintained table. */
|
|
90
|
+
export declare function maintainedTableFkViolationError(schemaName: string, tableName: string, constraintName: string, parentSchemaName: string, parentTableName: string): QuereusError;
|
|
91
|
+
/** Renders one constrained-column value for a key-collision diagnostic. */
|
|
92
|
+
export declare function formatKeyValue(v: SqlValue): string;
|
|
93
|
+
/**
|
|
94
|
+
* Attributed secondary-UNIQUE diagnostic for rows the derivation wrote into a
|
|
95
|
+
* maintained table. Unlike CHECK / FK (per-row properties), a UNIQUE collision
|
|
96
|
+
* is a property of a PAIR of rows at distinct primary keys, so the diagnostic
|
|
97
|
+
* names the colliding key values. Thrown by the backing hosts' post-batch
|
|
98
|
+
* maintenance enforcement (memory `enforceSecondaryUniqueOnMaintenance`, store
|
|
99
|
+
* `enforceSecondaryUniqueForMaintenance`) — see `vtab/backing-host.ts`
|
|
100
|
+
* § Constraint validation.
|
|
101
|
+
*/
|
|
102
|
+
export declare function maintainedTableUniqueViolationError(schemaName: string, tableName: string, constraintName: string, columnNames: readonly string[], keyValues: readonly SqlValue[]): QuereusError;
|
|
103
|
+
/**
|
|
104
|
+
* Validates a table's EXISTING (effective, pending-over-committed) rows against
|
|
105
|
+
* each CHECK in `checks`, throwing on the first violating row. The table-wide
|
|
106
|
+
* sibling of the ADD-COLUMN backfill scan (`validateBackfillAgainstChecks` in
|
|
107
|
+
* `runtime/emit/alter-table.ts`): one `select 1 from <t> where not (<expr>)
|
|
108
|
+
* limit 1` scan per CHECK, so the NULL-pass rule falls out of SQL semantics
|
|
109
|
+
* (`not NULL` is NULL — the row is not a violation). A subquery-bearing CHECK
|
|
110
|
+
* is just SQL here; the scan reads final pending state.
|
|
111
|
+
*
|
|
112
|
+
* CAUTION — declared-constraint folding: the optimizer trusts a DECLARED CHECK
|
|
113
|
+
* as a proven domain invariant, so if the LIVE catalog entry for `tableSchema`
|
|
114
|
+
* still declares the CHECK being validated, `ruleFilterContradiction` folds the
|
|
115
|
+
* `where not (<expr>)` scan to EmptyRelation and the validation vacuously
|
|
116
|
+
* passes. Callers must scan against a live record that does NOT declare the
|
|
117
|
+
* constraints under validation (see the stripped-schema swap in
|
|
118
|
+
* `runtime/emit/materialized-view-helpers.ts`, mirroring the ADD COLUMN
|
|
119
|
+
* intermediate-schema discipline).
|
|
120
|
+
*/
|
|
121
|
+
export declare function validateChecksOverExistingRows(db: Database, tableSchema: TableSchema, checks: ReadonlyArray<RowConstraintSchema>, onViolation?: (check: RowConstraintSchema, exprSql: string) => QuereusError): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Validates every existing CHILD row against a newly-added FOREIGN KEY,
|
|
124
|
+
* throwing `StatusCode.CONSTRAINT` if any row references a non-existent parent.
|
|
125
|
+
*
|
|
126
|
+
* Engine-level and backend-agnostic: it reads committed/base data through
|
|
127
|
+
* `db.prepare` + scan (which does not take any module schema-change latch, so it
|
|
128
|
+
* is safe to call while a module holds its own schema-change lock). No-op when
|
|
129
|
+
* `pragma foreign_keys` is off.
|
|
130
|
+
*
|
|
131
|
+
* MATCH SIMPLE semantics: a child row with ANY NULL FK column is allowed
|
|
132
|
+
* regardless of the parent, so only fully-non-NULL orphans abort. When the
|
|
133
|
+
* parent table is absent, no fully-non-NULL child row can be satisfied, so any
|
|
134
|
+
* such row is an orphan (mirrors the child-side builder's null-guards-only
|
|
135
|
+
* fallback in `planner/building/foreign-key-builder.ts`).
|
|
136
|
+
*
|
|
137
|
+
* `onViolation` overrides the default diagnostic — the maintained-table
|
|
138
|
+
* derivation validator threads its table-attributed message through here.
|
|
139
|
+
* Note the declared-constraint folding caveat on
|
|
140
|
+
* {@link validateChecksOverExistingRows}: if the live child record already
|
|
141
|
+
* declares this FK (it does NOT on the ADD COLUMN / ADD CONSTRAINT paths, but
|
|
142
|
+
* DOES on the maintained-table path), the caller must scan against a
|
|
143
|
+
* constraint-stripped record or `ruleAntiJoinFkEmpty` folds the anti-join away.
|
|
144
|
+
*/
|
|
145
|
+
export declare function validateForeignKeyOverExistingRows(db: Database, childSchema: TableSchema, fk: ForeignKeyConstraintSchema, onViolation?: () => QuereusError): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* Rejects a FOREIGN KEY whose child column and parent key column declare
|
|
148
|
+
* conflicting explicit/declared collations — the same conflict the synthesized
|
|
149
|
+
* `parent.ref = child.fk` enforcement comparison raises at plan time, surfaced
|
|
150
|
+
* here at declaration time (CREATE TABLE / ALTER ADD CONSTRAINT / ADD COLUMN /
|
|
151
|
+
* declarative apply). Pure schema check (no row scan).
|
|
152
|
+
*
|
|
153
|
+
* Stays in lockstep with enforcement by construction: it maps each column to a
|
|
154
|
+
* `ScalarType` through {@link columnSchemaToScalarType} (the same map the FK
|
|
155
|
+
* builder's comparison uses — `collationExplicit` → provenance `'declared'`,
|
|
156
|
+
* else `'default'`) and resolves the pair through the same
|
|
157
|
+
* {@link resolveComparisonCollation} lattice. So it fires on exactly the
|
|
158
|
+
* conflicts the first DML against the child would, only sooner — never a
|
|
159
|
+
* re-derived textuality- or name-based rule.
|
|
160
|
+
*
|
|
161
|
+
* Resolution rules (consequences of staying in lockstep, intended):
|
|
162
|
+
* - matching declared collations (nocase/nocase) resolve, no conflict;
|
|
163
|
+
* - one-sided declaration (declared nocase vs defaulted BINARY) resolves to
|
|
164
|
+
* NOCASE — a defaulted BINARY is the engine floor, it contributes nothing;
|
|
165
|
+
* - a *declared* `COLLATE BINARY` (rank 2) vs a declared NOCASE conflicts;
|
|
166
|
+
* - a divergent explicit COLLATE on non-text columns still conflicts — we
|
|
167
|
+
* mirror enforcement exactly rather than gating on textuality.
|
|
168
|
+
*
|
|
169
|
+
* The parent is resolved against the live catalog; a not-yet-created
|
|
170
|
+
* (forward-declared) parent is skipped — its column types are unknown, so the
|
|
171
|
+
* conflict cannot be seen yet and remains caught at first DML (the one
|
|
172
|
+
* unavoidable residual). A self-referencing FK resolves against `childSchema`
|
|
173
|
+
* directly so it validates at CREATE, before the table is registered.
|
|
174
|
+
*
|
|
175
|
+
* Unconditional — NOT gated on `pragma foreign_keys`. A conflicting-collation
|
|
176
|
+
* declaration is a malformed declaration (same class as the child/parent
|
|
177
|
+
* column-count mismatch the builders reject unconditionally), not an
|
|
178
|
+
* enforcement concern, so a contradictory schema is rejected whether or not
|
|
179
|
+
* enforcement is currently enabled.
|
|
180
|
+
*/
|
|
181
|
+
export declare function validateForeignKeyCollations(db: Database, childSchema: TableSchema, fk: ForeignKeyConstraintSchema): void;
|
|
182
|
+
//# sourceMappingURL=constraint-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint-builder.d.ts","sourceRoot":"","sources":["../../../src/schema/constraint-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAQ7C;;;;GAIG;AACH,wBAAgB,2BAA2B,CAC1C,GAAG,EAAE,GAAG,CAAC,eAAe,EACxB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,sBAAsB,CAiBxB;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC9C,GAAG,EAAE,GAAG,CAAC,eAAe,EACxB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACrB,0BAA0B,CAkC5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACzC,GAAG,EAAE,GAAG,CAAC,eAAe,EACxB,aAAa,EAAE,MAAM,GACnB,mBAAmB,CAUrB;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,mBAAmB,EAAE,CAYlG;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,iBAAiB,EAAE,MAAM,GACvB,0BAA0B,EAAE,CA2B9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE,CAanG;AAmBD,0FAA0F;AAC1F,wBAAgB,kCAAkC,CACjD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,GACf,YAAY,CAOd;AAED,kGAAkG;AAClG,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACrB,YAAY,CAMd;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAKlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAClD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC5B,YAAY,CAMd;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,8BAA8B,CACnD,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC1C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,YAAY,GACzE,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,kCAAkC,CACvD,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,0BAA0B,EAC9B,WAAW,CAAC,EAAE,MAAM,YAAY,GAC9B,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,0BAA0B,GAC5B,IAAI,CAuCN"}
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared AST → constraint-schema builders plus the engine-level FK existing-row
|
|
3
|
+
* validator. These are the single source of truth for turning a table-level
|
|
4
|
+
* `ALTER TABLE … ADD <constraint>` (an `AST.TableConstraint`) into the
|
|
5
|
+
* corresponding {@link UniqueConstraintSchema} / {@link ForeignKeyConstraintSchema},
|
|
6
|
+
* reproducing the canonical mapping that {@link SchemaManager}'s
|
|
7
|
+
* `extractUniqueConstraints` / `extractForeignKeys` table-level arms encode for
|
|
8
|
+
* CREATE TABLE. Both the built-in modules (memory + store, via the
|
|
9
|
+
* `@quereus/quereus` barrel) and the SchemaManager delegate here so the two
|
|
10
|
+
* paths can never drift.
|
|
11
|
+
*
|
|
12
|
+
* Column resolution is always against the CHILD table's `columnIndexMap`
|
|
13
|
+
* (`ALTER TABLE ADD CONSTRAINT` is always the table-level form). Parent-column
|
|
14
|
+
* resolution for a FK stays deferred (the parent may not exist yet) exactly as
|
|
15
|
+
* in the CREATE TABLE path.
|
|
16
|
+
*/
|
|
17
|
+
import { resolveReferencedColumns, opsToMask } from './table.js';
|
|
18
|
+
import { QuereusError } from '../common/errors.js';
|
|
19
|
+
import { StatusCode } from '../common/types.js';
|
|
20
|
+
import { quoteIdentifier, expressionToString } from '../emit/ast-stringify.js';
|
|
21
|
+
import { createLogger } from '../common/logger.js';
|
|
22
|
+
import { columnSchemaToScalarType } from '../planner/type-utils.js';
|
|
23
|
+
import { resolveComparisonCollation } from '../planner/analysis/comparison-collation.js';
|
|
24
|
+
const log = createLogger('schema:constraint-builder');
|
|
25
|
+
/**
|
|
26
|
+
* Builds a {@link UniqueConstraintSchema} from a table-level UNIQUE
|
|
27
|
+
* `AST.TableConstraint`, resolving each declared column name to its index in the
|
|
28
|
+
* child table. Mirrors `SchemaManager.extractUniqueConstraints` (table-level arm).
|
|
29
|
+
*/
|
|
30
|
+
export function buildUniqueConstraintSchema(con, columnIndexMap) {
|
|
31
|
+
if (con.type !== 'unique' || !con.columns || con.columns.length === 0) {
|
|
32
|
+
throw new QuereusError('UNIQUE constraint requires at least one column', StatusCode.ERROR);
|
|
33
|
+
}
|
|
34
|
+
const colIndices = con.columns.map(col => {
|
|
35
|
+
const idx = columnIndexMap.get(col.name.toLowerCase());
|
|
36
|
+
if (idx === undefined) {
|
|
37
|
+
throw new QuereusError(`UNIQUE constraint column '${col.name}' not found`, StatusCode.ERROR);
|
|
38
|
+
}
|
|
39
|
+
return idx;
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
name: con.name,
|
|
43
|
+
columns: Object.freeze(colIndices),
|
|
44
|
+
defaultConflict: con.onConflict,
|
|
45
|
+
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Builds a {@link ForeignKeyConstraintSchema} from a table-level FOREIGN KEY
|
|
50
|
+
* `AST.TableConstraint`, resolving child column names to indices and deferring
|
|
51
|
+
* parent-column resolution (the parent table may not exist yet). Mirrors
|
|
52
|
+
* `SchemaManager.extractForeignKeys` (table-level arm), including the
|
|
53
|
+
* child/parent column-count mismatch error.
|
|
54
|
+
*/
|
|
55
|
+
export function buildForeignKeyConstraintSchema(con, columnIndexMap, childTableName, childSchemaName) {
|
|
56
|
+
if (con.type !== 'foreignKey' || !con.foreignKey || !con.columns) {
|
|
57
|
+
throw new QuereusError('FOREIGN KEY constraint requires child columns and a REFERENCES clause', StatusCode.ERROR);
|
|
58
|
+
}
|
|
59
|
+
const fk = con.foreignKey;
|
|
60
|
+
const childColIndices = con.columns.map(col => {
|
|
61
|
+
const idx = columnIndexMap.get(col.name.toLowerCase());
|
|
62
|
+
if (idx === undefined) {
|
|
63
|
+
throw new QuereusError(`FK column '${col.name}' not found in table '${childTableName}'`, StatusCode.ERROR);
|
|
64
|
+
}
|
|
65
|
+
return idx;
|
|
66
|
+
});
|
|
67
|
+
const fkName = con.name ?? `_fk_${childTableName}_${con.columns.map(c => c.name).join('_')}`;
|
|
68
|
+
if (fk.columns && fk.columns.length !== childColIndices.length) {
|
|
69
|
+
throw new QuereusError(`FK constraint '${fkName}' on table '${childTableName}': child column count (${childColIndices.length}) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
name: fkName,
|
|
73
|
+
columns: Object.freeze(childColIndices),
|
|
74
|
+
referencedTable: fk.table,
|
|
75
|
+
referencedSchema: fk.schema ?? childSchemaName,
|
|
76
|
+
referencedColumns: Object.freeze([]), // resolved at enforcement time
|
|
77
|
+
referencedColumnNames: fk.columns, // deferred resolution via resolveReferencedColumns
|
|
78
|
+
onDelete: fk.onDelete ?? 'restrict',
|
|
79
|
+
onUpdate: fk.onUpdate ?? 'restrict',
|
|
80
|
+
deferred: fk.initiallyDeferred ?? false,
|
|
81
|
+
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Builds a {@link RowConstraintSchema} from a table-level CHECK
|
|
86
|
+
* `AST.TableConstraint` (the `ALTER TABLE … ADD CONSTRAINT … CHECK` form). The
|
|
87
|
+
* single source of truth for that mapping, called by the built-in modules
|
|
88
|
+
* (memory + store) so a CHECK added via ALTER lands in the *module-cached*
|
|
89
|
+
* schema, in lock-step with the catalog — the same place inline-CREATE CHECKs
|
|
90
|
+
* live and where `DROP/RENAME CONSTRAINT` later resolve the constraint class. An
|
|
91
|
+
* unnamed CHECK is auto-named `check_<existingCount>`, preserving the engine's
|
|
92
|
+
* prior in-emitter naming (`existingCount` = the number of CHECKs already on the
|
|
93
|
+
* table). Determinism is intentionally NOT validated here — a CHECK may reference
|
|
94
|
+
* `new.*`/`old.*`, which is checked at INSERT/UPDATE plan time.
|
|
95
|
+
*/
|
|
96
|
+
export function buildCheckConstraintSchema(con, existingCount) {
|
|
97
|
+
if (con.type !== 'check' || !con.expr) {
|
|
98
|
+
throw new QuereusError('CHECK constraint requires an expression', StatusCode.ERROR);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
name: con.name || `check_${existingCount}`,
|
|
102
|
+
expr: con.expr,
|
|
103
|
+
operations: opsToMask(con.operations),
|
|
104
|
+
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extracts the column-level CHECK constraints declared on a single `ALTER TABLE
|
|
109
|
+
* ADD COLUMN` ColumnDef into {@link RowConstraintSchema}s. Used by both the
|
|
110
|
+
* engine's emit layer (to merge into the live in-memory schema) and the store
|
|
111
|
+
* module (to persist into the catalog DDL), so the live and persisted constraint
|
|
112
|
+
* sets cannot drift. Auto-names an unnamed CHECK `_check_<column>`, matching the
|
|
113
|
+
* engine's enforcement naming.
|
|
114
|
+
*/
|
|
115
|
+
export function extractColumnLevelCheckConstraints(columnDef) {
|
|
116
|
+
const result = [];
|
|
117
|
+
for (const con of columnDef.constraints ?? []) {
|
|
118
|
+
if (con.type !== 'check' || !con.expr)
|
|
119
|
+
continue;
|
|
120
|
+
result.push({
|
|
121
|
+
name: con.name ?? `_check_${columnDef.name}`,
|
|
122
|
+
expr: con.expr,
|
|
123
|
+
operations: opsToMask(con.operations),
|
|
124
|
+
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Extracts the column-level FOREIGN KEY constraints declared on a single `ALTER
|
|
131
|
+
* TABLE ADD COLUMN` ColumnDef into {@link ForeignKeyConstraintSchema}s. The
|
|
132
|
+
* child column index is NOT resolved here (`columns: Object.freeze([])`) — the
|
|
133
|
+
* caller resolves it once the new column's index is known (the engine via
|
|
134
|
+
* `columnIndexMap`, the store to `[newColIdx]`). Used by both the engine's emit
|
|
135
|
+
* layer and the store module so the live and persisted FK sets cannot drift.
|
|
136
|
+
* Auto-names an unnamed FK `_fk_<column>` and enforces the single-child-column
|
|
137
|
+
* count match against the parent column list.
|
|
138
|
+
*/
|
|
139
|
+
export function extractColumnLevelForeignKeys(columnDef, defaultSchemaName) {
|
|
140
|
+
const result = [];
|
|
141
|
+
for (const con of columnDef.constraints ?? []) {
|
|
142
|
+
if (con.type !== 'foreignKey' || !con.foreignKey)
|
|
143
|
+
continue;
|
|
144
|
+
const fk = con.foreignKey;
|
|
145
|
+
// child column index gets resolved by caller after module.alterTable returns
|
|
146
|
+
// the updated schema with the new column appended.
|
|
147
|
+
if (fk.columns && fk.columns.length !== 1) {
|
|
148
|
+
throw new QuereusError(`FK constraint '${con.name ?? `_fk_${columnDef.name}`}' on ADD COLUMN '${columnDef.name}': child column count (1) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
|
|
149
|
+
}
|
|
150
|
+
result.push({
|
|
151
|
+
name: con.name ?? `_fk_${columnDef.name}`,
|
|
152
|
+
columns: Object.freeze([]),
|
|
153
|
+
referencedTable: fk.table,
|
|
154
|
+
referencedSchema: fk.schema ?? defaultSchemaName,
|
|
155
|
+
referencedColumns: Object.freeze([]),
|
|
156
|
+
referencedColumnNames: fk.columns,
|
|
157
|
+
onDelete: fk.onDelete ?? 'restrict',
|
|
158
|
+
onUpdate: fk.onUpdate ?? 'restrict',
|
|
159
|
+
deferred: fk.initiallyDeferred ?? false,
|
|
160
|
+
tags: con.tags && Object.keys(con.tags).length > 0 ? Object.freeze({ ...con.tags }) : undefined,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Extracts the column-level UNIQUE constraints declared on a single `ALTER TABLE
|
|
167
|
+
* ADD COLUMN` ColumnDef into the equivalent **table-level** {@link AST.TableConstraint}s
|
|
168
|
+
* over the new column. Unlike the CHECK / FK extractors above (which return schema
|
|
169
|
+
* objects merged into the live schema), this returns AST table-constraints so the
|
|
170
|
+
* caller can feed each straight to `module.alterTable({ type: 'addConstraint',
|
|
171
|
+
* constraint })` — the same materialize + validate + persist path that
|
|
172
|
+
* `ALTER TABLE … ADD CONSTRAINT … UNIQUE` uses. Without this, an inline UNIQUE on
|
|
173
|
+
* an ADD COLUMN reaches neither CREATE TABLE's `extractUniqueConstraints` nor the
|
|
174
|
+
* ADD CONSTRAINT path, so it would be silently dropped.
|
|
175
|
+
*
|
|
176
|
+
* The synthetic constraint preserves a named inline UNIQUE's name (so it
|
|
177
|
+
* round-trips), `ON CONFLICT`, and tags. `buildUniqueConstraintSchema` reads only
|
|
178
|
+
* those fields plus `columns[].name`, so no `operations` / `direction` is emitted.
|
|
179
|
+
* Each inline `unique` ColumnConstraint becomes its own single-column table
|
|
180
|
+
* constraint over `columnDef.name` (multiple are rare but handled like CHECK / FK).
|
|
181
|
+
*/
|
|
182
|
+
export function extractColumnLevelUniqueConstraints(columnDef) {
|
|
183
|
+
const result = [];
|
|
184
|
+
for (const con of columnDef.constraints ?? []) {
|
|
185
|
+
if (con.type !== 'unique')
|
|
186
|
+
continue;
|
|
187
|
+
result.push({
|
|
188
|
+
type: 'unique',
|
|
189
|
+
name: con.name,
|
|
190
|
+
columns: [{ name: columnDef.name }],
|
|
191
|
+
onConflict: con.onConflict,
|
|
192
|
+
tags: con.tags,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
/** Qualify a relation reference, eliding the `main.` prefix (the default schema). */
|
|
198
|
+
function qualifyRelation(schemaName, tableName) {
|
|
199
|
+
const prefix = schemaName.toLowerCase() !== 'main' ? `${quoteIdentifier(schemaName)}.` : '';
|
|
200
|
+
return `${prefix}${quoteIdentifier(tableName)}`;
|
|
201
|
+
}
|
|
202
|
+
/* ──────────────── maintained-table derived-row attribution ────────────────
|
|
203
|
+
* A maintained table's rows are written by its derivation, so a declared
|
|
204
|
+
* CHECK / FK violation surfaces on a statement that targeted a DIFFERENT table
|
|
205
|
+
* (a source write, or the create/attach statement). These two helpers produce
|
|
206
|
+
* the table-attributed diagnostic both validation mechanisms share — the bulk
|
|
207
|
+
* SQL-scan validators (create-fill / attach reconcile) and the per-row
|
|
208
|
+
* maintenance evaluator (`core/derived-row-validator.ts`). The leading
|
|
209
|
+
* `CHECK constraint failed:` / `FOREIGN KEY constraint failed:` prefixes are
|
|
210
|
+
* load-bearing: existing assertions and downstream consumers key off them
|
|
211
|
+
* (see `runtime/emit/constraint-check.ts`). */
|
|
212
|
+
/** Attributed CHECK diagnostic for a row the derivation wrote into a maintained table. */
|
|
213
|
+
export function maintainedTableCheckViolationError(schemaName, tableName, constraintName, exprHint) {
|
|
214
|
+
const hint = exprHint && exprHint.length <= 60 ? ` (${exprHint})` : '';
|
|
215
|
+
return new QuereusError(`CHECK constraint failed: ${constraintName}${hint} — row derived into maintained table `
|
|
216
|
+
+ `'${schemaName}.${tableName}' violates its declared constraint`, StatusCode.CONSTRAINT);
|
|
217
|
+
}
|
|
218
|
+
/** Attributed child-side FK diagnostic for a row the derivation wrote into a maintained table. */
|
|
219
|
+
export function maintainedTableFkViolationError(schemaName, tableName, constraintName, parentSchemaName, parentTableName) {
|
|
220
|
+
return new QuereusError(`FOREIGN KEY constraint failed: ${constraintName} — row derived into maintained table `
|
|
221
|
+
+ `'${schemaName}.${tableName}' references a missing '${parentSchemaName}.${parentTableName}'`, StatusCode.CONSTRAINT);
|
|
222
|
+
}
|
|
223
|
+
/** Renders one constrained-column value for a key-collision diagnostic. */
|
|
224
|
+
export function formatKeyValue(v) {
|
|
225
|
+
if (v === null || v === undefined)
|
|
226
|
+
return 'null';
|
|
227
|
+
if (typeof v === 'string')
|
|
228
|
+
return `'${v}'`;
|
|
229
|
+
if (v instanceof Uint8Array)
|
|
230
|
+
return `x'…'`;
|
|
231
|
+
return String(v);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Attributed secondary-UNIQUE diagnostic for rows the derivation wrote into a
|
|
235
|
+
* maintained table. Unlike CHECK / FK (per-row properties), a UNIQUE collision
|
|
236
|
+
* is a property of a PAIR of rows at distinct primary keys, so the diagnostic
|
|
237
|
+
* names the colliding key values. Thrown by the backing hosts' post-batch
|
|
238
|
+
* maintenance enforcement (memory `enforceSecondaryUniqueOnMaintenance`, store
|
|
239
|
+
* `enforceSecondaryUniqueForMaintenance`) — see `vtab/backing-host.ts`
|
|
240
|
+
* § Constraint validation.
|
|
241
|
+
*/
|
|
242
|
+
export function maintainedTableUniqueViolationError(schemaName, tableName, constraintName, columnNames, keyValues) {
|
|
243
|
+
return new QuereusError(`UNIQUE constraint failed: ${constraintName} (${columnNames.join(', ')}) — row derived into maintained table `
|
|
244
|
+
+ `'${schemaName}.${tableName}' collides on its declared UNIQUE constraint (key: ${keyValues.map(formatKeyValue).join(', ')})`, StatusCode.CONSTRAINT);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validates a table's EXISTING (effective, pending-over-committed) rows against
|
|
248
|
+
* each CHECK in `checks`, throwing on the first violating row. The table-wide
|
|
249
|
+
* sibling of the ADD-COLUMN backfill scan (`validateBackfillAgainstChecks` in
|
|
250
|
+
* `runtime/emit/alter-table.ts`): one `select 1 from <t> where not (<expr>)
|
|
251
|
+
* limit 1` scan per CHECK, so the NULL-pass rule falls out of SQL semantics
|
|
252
|
+
* (`not NULL` is NULL — the row is not a violation). A subquery-bearing CHECK
|
|
253
|
+
* is just SQL here; the scan reads final pending state.
|
|
254
|
+
*
|
|
255
|
+
* CAUTION — declared-constraint folding: the optimizer trusts a DECLARED CHECK
|
|
256
|
+
* as a proven domain invariant, so if the LIVE catalog entry for `tableSchema`
|
|
257
|
+
* still declares the CHECK being validated, `ruleFilterContradiction` folds the
|
|
258
|
+
* `where not (<expr>)` scan to EmptyRelation and the validation vacuously
|
|
259
|
+
* passes. Callers must scan against a live record that does NOT declare the
|
|
260
|
+
* constraints under validation (see the stripped-schema swap in
|
|
261
|
+
* `runtime/emit/materialized-view-helpers.ts`, mirroring the ADD COLUMN
|
|
262
|
+
* intermediate-schema discipline).
|
|
263
|
+
*/
|
|
264
|
+
export async function validateChecksOverExistingRows(db, tableSchema, checks, onViolation) {
|
|
265
|
+
const tableRef = qualifyRelation(tableSchema.schemaName, tableSchema.name);
|
|
266
|
+
for (const check of checks) {
|
|
267
|
+
const exprSql = expressionToString(check.expr);
|
|
268
|
+
const sql = `select 1 from ${tableRef} where not (${exprSql}) limit 1`;
|
|
269
|
+
log('CHECK existing-row validation for %s.%s: %s', tableSchema.schemaName, tableSchema.name, sql);
|
|
270
|
+
const stmt = db.prepare(sql);
|
|
271
|
+
try {
|
|
272
|
+
for await (const _row of stmt._iterateRowsRaw()) {
|
|
273
|
+
throw onViolation?.(check, exprSql) ?? new QuereusError(`CHECK constraint failed: ${check.name ?? exprSql} — existing rows in '${tableSchema.name}' violate the constraint`, StatusCode.CONSTRAINT);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
await stmt.finalize();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Validates every existing CHILD row against a newly-added FOREIGN KEY,
|
|
283
|
+
* throwing `StatusCode.CONSTRAINT` if any row references a non-existent parent.
|
|
284
|
+
*
|
|
285
|
+
* Engine-level and backend-agnostic: it reads committed/base data through
|
|
286
|
+
* `db.prepare` + scan (which does not take any module schema-change latch, so it
|
|
287
|
+
* is safe to call while a module holds its own schema-change lock). No-op when
|
|
288
|
+
* `pragma foreign_keys` is off.
|
|
289
|
+
*
|
|
290
|
+
* MATCH SIMPLE semantics: a child row with ANY NULL FK column is allowed
|
|
291
|
+
* regardless of the parent, so only fully-non-NULL orphans abort. When the
|
|
292
|
+
* parent table is absent, no fully-non-NULL child row can be satisfied, so any
|
|
293
|
+
* such row is an orphan (mirrors the child-side builder's null-guards-only
|
|
294
|
+
* fallback in `planner/building/foreign-key-builder.ts`).
|
|
295
|
+
*
|
|
296
|
+
* `onViolation` overrides the default diagnostic — the maintained-table
|
|
297
|
+
* derivation validator threads its table-attributed message through here.
|
|
298
|
+
* Note the declared-constraint folding caveat on
|
|
299
|
+
* {@link validateChecksOverExistingRows}: if the live child record already
|
|
300
|
+
* declares this FK (it does NOT on the ADD COLUMN / ADD CONSTRAINT paths, but
|
|
301
|
+
* DOES on the maintained-table path), the caller must scan against a
|
|
302
|
+
* constraint-stripped record or `ruleAntiJoinFkEmpty` folds the anti-join away.
|
|
303
|
+
*/
|
|
304
|
+
export async function validateForeignKeyOverExistingRows(db, childSchema, fk, onViolation) {
|
|
305
|
+
if (!db.options.getBooleanOption('foreign_keys'))
|
|
306
|
+
return;
|
|
307
|
+
const childRef = qualifyRelation(childSchema.schemaName, childSchema.name);
|
|
308
|
+
const childAlias = '_c';
|
|
309
|
+
// MATCH SIMPLE: only rows where every FK column is non-NULL can violate.
|
|
310
|
+
const notNullChain = fk.columns
|
|
311
|
+
.map(idx => `${childAlias}.${quoteIdentifier(childSchema.columns[idx].name)} is not null`)
|
|
312
|
+
.join(' and ');
|
|
313
|
+
const parentSchemaName = fk.referencedSchema ?? childSchema.schemaName;
|
|
314
|
+
const parentTable = db.schemaManager.findTable(fk.referencedTable, parentSchemaName);
|
|
315
|
+
let sql;
|
|
316
|
+
if (!parentTable) {
|
|
317
|
+
// Parent absent: any fully-non-NULL child row references a non-existent parent.
|
|
318
|
+
sql = `select 1 from ${childRef} as ${childAlias} where ${notNullChain} limit 1`;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
const parentColIndices = resolveReferencedColumns(fk, parentTable);
|
|
322
|
+
if (parentColIndices.length !== fk.columns.length) {
|
|
323
|
+
throw new QuereusError(`FK constraint '${fk.name ?? `_fk_${childSchema.name}`}' on table '${childSchema.name}': child column count (${fk.columns.length}) does not match parent column count (${parentColIndices.length})`, StatusCode.ERROR);
|
|
324
|
+
}
|
|
325
|
+
const parentRef = qualifyRelation(parentTable.schemaName, parentTable.name);
|
|
326
|
+
const parentAlias = '_p';
|
|
327
|
+
// Aliases keep the correlation unambiguous even for a self-referencing FK
|
|
328
|
+
// (child table === parent table).
|
|
329
|
+
const matchChain = fk.columns
|
|
330
|
+
.map((childIdx, i) => `${parentAlias}.${quoteIdentifier(parentTable.columns[parentColIndices[i]].name)} = ${childAlias}.${quoteIdentifier(childSchema.columns[childIdx].name)}`)
|
|
331
|
+
.join(' and ');
|
|
332
|
+
// `not exists` correlated subquery: a fully-non-NULL child row with no matching
|
|
333
|
+
// parent is an orphan. (The decorrelator may turn this into an anti-join; that is
|
|
334
|
+
// fine — the ADD COLUMN path deliberately validates against a live schema that does
|
|
335
|
+
// NOT yet declare the new FK, so `ruleAntiJoinFkEmpty` has no FK to fold against.)
|
|
336
|
+
sql = `select 1 from ${childRef} as ${childAlias} `
|
|
337
|
+
+ `where ${notNullChain} `
|
|
338
|
+
+ `and not exists (select 1 from ${parentRef} as ${parentAlias} where ${matchChain}) limit 1`;
|
|
339
|
+
}
|
|
340
|
+
log('FK existing-row validation for %s.%s: %s', childSchema.schemaName, childSchema.name, sql);
|
|
341
|
+
const stmt = db.prepare(sql);
|
|
342
|
+
try {
|
|
343
|
+
for await (const _row of stmt._iterateRowsRaw()) {
|
|
344
|
+
if (onViolation)
|
|
345
|
+
throw onViolation();
|
|
346
|
+
const colNames = fk.columns.map(idx => childSchema.columns[idx].name).join(', ');
|
|
347
|
+
throw new QuereusError(`FOREIGN KEY constraint failed: ${childSchema.name} (${colNames}) has rows referencing a missing '${fk.referencedTable}'`, StatusCode.CONSTRAINT);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await stmt.finalize();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Rejects a FOREIGN KEY whose child column and parent key column declare
|
|
356
|
+
* conflicting explicit/declared collations — the same conflict the synthesized
|
|
357
|
+
* `parent.ref = child.fk` enforcement comparison raises at plan time, surfaced
|
|
358
|
+
* here at declaration time (CREATE TABLE / ALTER ADD CONSTRAINT / ADD COLUMN /
|
|
359
|
+
* declarative apply). Pure schema check (no row scan).
|
|
360
|
+
*
|
|
361
|
+
* Stays in lockstep with enforcement by construction: it maps each column to a
|
|
362
|
+
* `ScalarType` through {@link columnSchemaToScalarType} (the same map the FK
|
|
363
|
+
* builder's comparison uses — `collationExplicit` → provenance `'declared'`,
|
|
364
|
+
* else `'default'`) and resolves the pair through the same
|
|
365
|
+
* {@link resolveComparisonCollation} lattice. So it fires on exactly the
|
|
366
|
+
* conflicts the first DML against the child would, only sooner — never a
|
|
367
|
+
* re-derived textuality- or name-based rule.
|
|
368
|
+
*
|
|
369
|
+
* Resolution rules (consequences of staying in lockstep, intended):
|
|
370
|
+
* - matching declared collations (nocase/nocase) resolve, no conflict;
|
|
371
|
+
* - one-sided declaration (declared nocase vs defaulted BINARY) resolves to
|
|
372
|
+
* NOCASE — a defaulted BINARY is the engine floor, it contributes nothing;
|
|
373
|
+
* - a *declared* `COLLATE BINARY` (rank 2) vs a declared NOCASE conflicts;
|
|
374
|
+
* - a divergent explicit COLLATE on non-text columns still conflicts — we
|
|
375
|
+
* mirror enforcement exactly rather than gating on textuality.
|
|
376
|
+
*
|
|
377
|
+
* The parent is resolved against the live catalog; a not-yet-created
|
|
378
|
+
* (forward-declared) parent is skipped — its column types are unknown, so the
|
|
379
|
+
* conflict cannot be seen yet and remains caught at first DML (the one
|
|
380
|
+
* unavoidable residual). A self-referencing FK resolves against `childSchema`
|
|
381
|
+
* directly so it validates at CREATE, before the table is registered.
|
|
382
|
+
*
|
|
383
|
+
* Unconditional — NOT gated on `pragma foreign_keys`. A conflicting-collation
|
|
384
|
+
* declaration is a malformed declaration (same class as the child/parent
|
|
385
|
+
* column-count mismatch the builders reject unconditionally), not an
|
|
386
|
+
* enforcement concern, so a contradictory schema is rejected whether or not
|
|
387
|
+
* enforcement is currently enabled.
|
|
388
|
+
*/
|
|
389
|
+
export function validateForeignKeyCollations(db, childSchema, fk) {
|
|
390
|
+
// Resolve the parent. A self-referencing FK names `childSchema` itself; resolve
|
|
391
|
+
// it directly so the check fires at CREATE (the table is not yet registered).
|
|
392
|
+
const parentSchemaName = fk.referencedSchema ?? childSchema.schemaName;
|
|
393
|
+
const selfRef = fk.referencedTable.toLowerCase() === childSchema.name.toLowerCase()
|
|
394
|
+
&& parentSchemaName.toLowerCase() === childSchema.schemaName.toLowerCase();
|
|
395
|
+
const parent = selfRef
|
|
396
|
+
? childSchema
|
|
397
|
+
: db.schemaManager.findTable(fk.referencedTable, parentSchemaName);
|
|
398
|
+
// Forward-declared parent: column types unknown — conflict stays caught at first DML.
|
|
399
|
+
if (!parent)
|
|
400
|
+
return;
|
|
401
|
+
let parentColIndices;
|
|
402
|
+
try {
|
|
403
|
+
parentColIndices = resolveReferencedColumns(fk, parent);
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
// A missing referenced column is reported by the enforcement path; don't double-report.
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// A child/parent column-count mismatch is already raised by the builders.
|
|
410
|
+
if (parentColIndices.length !== fk.columns.length)
|
|
411
|
+
return;
|
|
412
|
+
for (let i = 0; i < fk.columns.length; i++) {
|
|
413
|
+
const childCol = childSchema.columns[fk.columns[i]];
|
|
414
|
+
const parentCol = parent.columns[parentColIndices[i]];
|
|
415
|
+
const res = resolveComparisonCollation(columnSchemaToScalarType(childCol), columnSchemaToScalarType(parentCol));
|
|
416
|
+
if (res.kind === 'conflict') {
|
|
417
|
+
throw new QuereusError(`FOREIGN KEY '${fk.name ?? `_fk_${childSchema.name}`}' on '${childSchema.name}': `
|
|
418
|
+
+ `child column '${childSchema.name}.${childCol.name}' (collation ${childCol.collation}) `
|
|
419
|
+
+ `and parent column '${parent.name}.${parentCol.name}' (collation ${parentCol.collation}) `
|
|
420
|
+
+ `declare conflicting collations; declare a matching COLLATE on both sides.`, StatusCode.ERROR);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=constraint-builder.js.map
|