@quereus/quereus 4.10.0 → 4.12.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/dist/src/common/type-inference.d.ts +12 -6
- package/dist/src/common/type-inference.d.ts.map +1 -1
- package/dist/src/common/type-inference.js +12 -24
- package/dist/src/common/type-inference.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +7 -5
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +4 -3
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +4 -3
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.d.ts +1 -3
- package/dist/src/core/database-materialized-views-analysis.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.js +1 -11
- package/dist/src/core/database-materialized-views-analysis.js.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.js +12 -10
- package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +13 -2
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/derived-row-validator.d.ts.map +1 -1
- package/dist/src/core/derived-row-validator.js +14 -2
- package/dist/src/core/derived-row-validator.js.map +1 -1
- package/dist/src/core/param.d.ts +9 -0
- package/dist/src/core/param.d.ts.map +1 -1
- package/dist/src/core/param.js +21 -1
- package/dist/src/core/param.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +38 -15
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +7 -2
- 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 +27 -11
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +8 -3
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +9 -29
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +14 -7
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/return-types.d.ts +29 -0
- package/dist/src/func/builtins/return-types.d.ts.map +1 -1
- package/dist/src/func/builtins/return-types.js +4 -1
- package/dist/src/func/builtins/return-types.js.map +1 -1
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +22 -67
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +26 -16
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +5 -3
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts +16 -0
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +16 -0
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/assertion-plan.d.ts +33 -0
- package/dist/src/planner/analysis/assertion-plan.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-plan.js +39 -0
- package/dist/src/planner/analysis/assertion-plan.js.map +1 -0
- package/dist/src/planner/analysis/binary-operator-class.d.ts +55 -0
- package/dist/src/planner/analysis/binary-operator-class.d.ts.map +1 -0
- package/dist/src/planner/analysis/binary-operator-class.js +57 -0
- package/dist/src/planner/analysis/binary-operator-class.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts +9 -3
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/binding-extractor.js +11 -16
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +19 -6
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/check-extraction.d.ts +1 -7
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
- package/dist/src/planner/analysis/check-extraction.js.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.d.ts +17 -0
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.js +17 -5
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +18 -18
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +11 -7
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.js +11 -7
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
- package/dist/src/planner/analysis/equi-correlation.d.ts +1 -1
- package/dist/src/planner/analysis/equi-correlation.js +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.js +0 -2
- package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
- package/dist/src/planner/analysis/key-filter.d.ts.map +1 -1
- package/dist/src/planner/analysis/key-filter.js +2 -3
- package/dist/src/planner/analysis/key-filter.js.map +1 -1
- package/dist/src/planner/analysis/relation-key.d.ts +104 -0
- package/dist/src/planner/analysis/relation-key.d.ts.map +1 -0
- package/dist/src/planner/analysis/relation-key.js +121 -0
- package/dist/src/planner/analysis/relation-key.js.map +1 -0
- package/dist/src/planner/analysis/scalar-param-usage.d.ts.map +1 -1
- package/dist/src/planner/analysis/scalar-param-usage.js +12 -4
- package/dist/src/planner/analysis/scalar-param-usage.js.map +1 -1
- package/dist/src/planner/analysis/set-op-type-merge.d.ts +9 -3
- package/dist/src/planner/analysis/set-op-type-merge.d.ts.map +1 -1
- package/dist/src/planner/analysis/set-op-type-merge.js +22 -8
- package/dist/src/planner/analysis/set-op-type-merge.js.map +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +31 -23
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/analyze.d.ts.map +1 -1
- package/dist/src/planner/building/analyze.js +21 -0
- package/dist/src/planner/building/analyze.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +222 -82
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +3 -2
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +20 -27
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +8 -25
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +11 -3
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +19 -8
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +56 -37
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/generated-column-scope.d.ts +58 -0
- package/dist/src/planner/building/generated-column-scope.d.ts.map +1 -0
- package/dist/src/planner/building/generated-column-scope.js +117 -0
- package/dist/src/planner/building/generated-column-scope.js.map +1 -0
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +36 -60
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/mutation-context.d.ts +63 -0
- package/dist/src/planner/building/mutation-context.d.ts.map +1 -0
- package/dist/src/planner/building/mutation-context.js +126 -0
- package/dist/src/planner/building/mutation-context.js.map +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts +73 -132
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +405 -81
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +37 -8
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +8 -9
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-ordinal.d.ts +6 -0
- package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
- package/dist/src/planner/building/select-ordinal.js +1 -1
- package/dist/src/planner/building/select-ordinal.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts +2 -2
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +82 -101
- 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 +78 -33
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +21 -32
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -1
- package/dist/src/planner/building/view-mutation-builder.js +329 -14
- package/dist/src/planner/building/view-mutation-builder.js.map +1 -1
- package/dist/src/planner/building/with.d.ts +6 -0
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +52 -3
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -1
- package/dist/src/planner/cache/correlation-detector.js +44 -17
- package/dist/src/planner/cache/correlation-detector.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +6 -0
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +6 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/mutation/lens-enforcement.d.ts +123 -0
- package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -1
- package/dist/src/planner/mutation/lens-enforcement.js +362 -5
- package/dist/src/planner/mutation/lens-enforcement.js.map +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -1
- package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +15 -11
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.js +5 -0
- package/dist/src/planner/nodes/alter-table-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 +7 -0
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +16 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +5 -2
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +9 -1
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +117 -91
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/sequence-node.d.ts +50 -0
- package/dist/src/planner/nodes/sequence-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/sequence-node.js +96 -0
- package/dist/src/planner/nodes/sequence-node.js.map +1 -0
- package/dist/src/planner/nodes/values-node.d.ts +8 -0
- package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/values-node.js +29 -6
- package/dist/src/planner/nodes/values-node.js.map +1 -1
- package/dist/src/planner/nodes/view-mutation-node.d.ts +43 -1
- package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/view-mutation-node.js +27 -6
- package/dist/src/planner/nodes/view-mutation-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +33 -4
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +80 -36
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +38 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.js +8 -3
- package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +18 -12
- package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +4 -3
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.js +6 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
- package/dist/src/planner/scopes/param.d.ts.map +1 -1
- package/dist/src/planner/scopes/param.js +10 -5
- package/dist/src/planner/scopes/param.js.map +1 -1
- package/dist/src/planner/util/ind-utils.d.ts +25 -8
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
- package/dist/src/planner/util/ind-utils.js +53 -10
- package/dist/src/planner/util/ind-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +7 -7
- package/dist/src/planner/util/key-utils.js +9 -9
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts.map +1 -1
- package/dist/src/runtime/delta-executor.js +7 -2
- 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 +50 -15
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/alter-schema-event.d.ts +2 -43
- package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-schema-event.js +2 -53
- package/dist/src/runtime/emit/alter-schema-event.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +70 -26
- 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 +7 -0
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/assertion-rename-helpers.js +2 -3
- package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts +5 -0
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +22 -22
- 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 +9 -3
- package/dist/src/runtime/emit/block.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +22 -13
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +71 -70
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/create-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-index.js +8 -3
- package/dist/src/runtime/emit/create-index.js.map +1 -1
- package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-table.js +20 -10
- 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 +51 -44
- package/dist/src/runtime/emit/create-view.js.map +1 -1
- package/dist/src/runtime/emit/ddl-event-scope.d.ts +71 -0
- package/dist/src/runtime/emit/ddl-event-scope.d.ts.map +1 -0
- package/dist/src/runtime/emit/ddl-event-scope.js +80 -0
- package/dist/src/runtime/emit/ddl-event-scope.js.map +1 -0
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +28 -24
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +23 -17
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-index.js +7 -2
- package/dist/src/runtime/emit/drop-index.js.map +1 -1
- package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-table.js +16 -10
- 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 +50 -43
- package/dist/src/runtime/emit/drop-view.js.map +1 -1
- package/dist/src/runtime/emit/insert.d.ts.map +1 -1
- package/dist/src/runtime/emit/insert.js +2 -1
- package/dist/src/runtime/emit/insert.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +87 -67
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +128 -25
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/sequence.d.ts +17 -0
- package/dist/src/runtime/emit/sequence.d.ts.map +1 -0
- package/dist/src/runtime/emit/sequence.js +40 -0
- package/dist/src/runtime/emit/sequence.js.map +1 -0
- package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.js +40 -32
- package/dist/src/runtime/emit/set-object-tags.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +3 -2
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/update.js +3 -3
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -1
- package/dist/src/runtime/emit/view-mutation.js +45 -3
- package/dist/src/runtime/emit/view-mutation.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +9 -10
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +3 -2
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/row-constraints.d.ts +14 -8
- package/dist/src/runtime/row-constraints.d.ts.map +1 -1
- package/dist/src/runtime/row-constraints.js +41 -15
- package/dist/src/runtime/row-constraints.js.map +1 -1
- package/dist/src/runtime/strict-representation.d.ts +11 -6
- package/dist/src/runtime/strict-representation.d.ts.map +1 -1
- package/dist/src/runtime/strict-representation.js +1 -44
- package/dist/src/runtime/strict-representation.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +25 -2
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/assertion.js.map +1 -1
- package/dist/src/schema/catalog-rendering.d.ts +38 -0
- package/dist/src/schema/catalog-rendering.d.ts.map +1 -0
- package/dist/src/schema/catalog-rendering.js +171 -0
- package/dist/src/schema/catalog-rendering.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +94 -5
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +159 -21
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/column-source-resolver.d.ts +9 -5
- package/dist/src/schema/column-source-resolver.d.ts.map +1 -1
- package/dist/src/schema/column-source-resolver.js +9 -5
- package/dist/src/schema/column-source-resolver.js.map +1 -1
- package/dist/src/schema/constraint-builder.d.ts +23 -7
- package/dist/src/schema/constraint-builder.d.ts.map +1 -1
- package/dist/src/schema/constraint-builder.js +60 -16
- package/dist/src/schema/constraint-builder.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +50 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
- package/dist/src/schema/declared-schema-manager.js +52 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -1
- package/dist/src/schema/expr-scope/frame.d.ts +65 -0
- package/dist/src/schema/expr-scope/frame.d.ts.map +1 -0
- package/dist/src/schema/expr-scope/frame.js +104 -0
- package/dist/src/schema/expr-scope/frame.js.map +1 -0
- package/dist/src/schema/expr-scope/walk.d.ts +40 -0
- package/dist/src/schema/expr-scope/walk.d.ts.map +1 -0
- package/dist/src/schema/expr-scope/walk.js +260 -0
- package/dist/src/schema/expr-scope/walk.js.map +1 -0
- package/dist/src/schema/generated-column-refs.d.ts +41 -0
- package/dist/src/schema/generated-column-refs.d.ts.map +1 -0
- package/dist/src/schema/generated-column-refs.js +124 -0
- package/dist/src/schema/generated-column-refs.js.map +1 -0
- package/dist/src/schema/lens-ack.d.ts.map +1 -1
- package/dist/src/schema/lens-ack.js +5 -2
- package/dist/src/schema/lens-ack.js.map +1 -1
- package/dist/src/schema/lens-compiler.d.ts.map +1 -1
- package/dist/src/schema/lens-compiler.js +9 -1
- package/dist/src/schema/lens-compiler.js.map +1 -1
- package/dist/src/schema/lens-prover.d.ts +7 -2
- package/dist/src/schema/lens-prover.d.ts.map +1 -1
- package/dist/src/schema/lens-prover.js +105 -11
- package/dist/src/schema/lens-prover.js.map +1 -1
- package/dist/src/schema/lens.d.ts +12 -0
- package/dist/src/schema/lens.d.ts.map +1 -1
- package/dist/src/schema/lens.js +10 -0
- package/dist/src/schema/lens.js.map +1 -1
- package/dist/src/schema/manager.d.ts +48 -1
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +168 -36
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename/self-qualifier-strip.d.ts +16 -10
- package/dist/src/schema/rename/self-qualifier-strip.d.ts.map +1 -1
- package/dist/src/schema/rename/self-qualifier-strip.js +30 -213
- package/dist/src/schema/rename/self-qualifier-strip.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts +4 -3
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +4 -3
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +54 -6
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +108 -42
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema-hasher.d.ts +12 -0
- package/dist/src/schema/schema-hasher.d.ts.map +1 -1
- package/dist/src/schema/schema-hasher.js +28 -10
- package/dist/src/schema/schema-hasher.js.map +1 -1
- package/dist/src/schema/table.d.ts +117 -19
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +213 -71
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/comparison-coercion.d.ts +5 -1
- package/dist/src/types/comparison-coercion.d.ts.map +1 -1
- package/dist/src/types/comparison-coercion.js +21 -5
- package/dist/src/types/comparison-coercion.js.map +1 -1
- package/dist/src/types/representation.d.ts +65 -0
- package/dist/src/types/representation.d.ts.map +1 -0
- package/dist/src/types/representation.js +63 -0
- package/dist/src/types/representation.js.map +1 -0
- package/dist/src/types/validation.d.ts +76 -22
- package/dist/src/types/validation.d.ts.map +1 -1
- package/dist/src/types/validation.js +110 -31
- package/dist/src/types/validation.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +10 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +16 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/capabilities.d.ts +72 -4
- package/dist/src/vtab/capabilities.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +17 -13
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/module.d.ts +13 -7
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/src/planner/nodes/array-index-node.d.ts +0 -22
- package/dist/src/planner/nodes/array-index-node.d.ts.map +0 -1
- package/dist/src/planner/nodes/array-index-node.js +0 -41
- package/dist/src/planner/nodes/array-index-node.js.map +0 -1
- package/dist/src/runtime/emit/array-index.d.ts +0 -5
- package/dist/src/runtime/emit/array-index.d.ts.map +0 -1
- package/dist/src/runtime/emit/array-index.js +0 -22
- package/dist/src/runtime/emit/array-index.js.map +0 -1
|
@@ -2,11 +2,13 @@ import { Schema } from './schema.js';
|
|
|
2
2
|
import { normalizeCollationName } from '../util/comparison.js';
|
|
3
3
|
import { quereusError, QuereusError, RelationNotFoundError } from '../common/errors.js';
|
|
4
4
|
import { StatusCode } from '../common/types.js';
|
|
5
|
-
import {
|
|
5
|
+
import { foldDefaultToType } from '../types/validation.js';
|
|
6
|
+
import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema, extractGeneratedColumnDependencies, topoSortGeneratedColumns, requireVtabModule, resolveNamedConstraintClass, appendIndexToTableSchema, collectDeclaredConstraintNames, disambiguateAutoConstraintName } from './table.js';
|
|
6
7
|
import { buildUniqueConstraintSchema, buildForeignKeyConstraintSchema, validateForeignKeyCollations } from './constraint-builder.js';
|
|
8
|
+
import { buildColumnSourceResolver } from './column-source-resolver.js';
|
|
7
9
|
import { normalizeBackingModule } from './view.js';
|
|
8
10
|
import { isMaintainedTable } from './derivation.js';
|
|
9
|
-
import { isHiddenImplicitIndex, isImplicitCoveringIndex, findExposedImplicitConstraintIndex, assertNoDuplicateUniqueConstraints } from './catalog.js';
|
|
11
|
+
import { isHiddenImplicitIndex, isImplicitCoveringIndex, findExposedImplicitConstraintIndex, assertNoDuplicateUniqueConstraints, assertNoDuplicateUniqueConstraintBackingNames, assertNoDuplicateConstraintNames } from './catalog.js';
|
|
10
12
|
import { assertCatalogObjectPersistable } from './catalog-persistability.js';
|
|
11
13
|
import { buildLensBasisFkGate } from './lens-fk-discovery.js';
|
|
12
14
|
import { createLogger } from '../common/logger.js';
|
|
@@ -63,6 +65,18 @@ function maintainedImportFromTableStmt(stmt) {
|
|
|
63
65
|
tags: stmt.tags,
|
|
64
66
|
};
|
|
65
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Shared rejection for a non-deterministic call found in a schema-level expression
|
|
70
|
+
* at declaration time — one wording across the CHECK and GENERATED gates, so the
|
|
71
|
+
* two surfaces cannot drift apart in how they explain the same rule.
|
|
72
|
+
*
|
|
73
|
+
* @param site Where the call was found, e.g. `CHECK constraint 'c' on table 't'`.
|
|
74
|
+
*/
|
|
75
|
+
function nonDeterministicDeclarationError(site, offendingExpr) {
|
|
76
|
+
return new QuereusError(`Non-deterministic expression not allowed in ${site}. ` +
|
|
77
|
+
`Function '${offendingExpr.name}' is not deterministic. ` +
|
|
78
|
+
`Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
|
|
79
|
+
}
|
|
66
80
|
/**
|
|
67
81
|
* Manages all schemas associated with a database connection (main, temp, attached).
|
|
68
82
|
* Handles lookup resolution according to SQLite's rules.
|
|
@@ -1470,14 +1484,20 @@ export class SchemaManager {
|
|
|
1470
1484
|
}
|
|
1471
1485
|
/**
|
|
1472
1486
|
* Extracts CHECK constraints from AST column and table constraint definitions.
|
|
1487
|
+
*
|
|
1488
|
+
* An unnamed column-level CHECK is minted `_check_<col>`; two on one column are
|
|
1489
|
+
* legal, so the mint disambiguates through the statement-wide `takenNames` set
|
|
1490
|
+
* (`_check_b`, then `_check_b_2`) — see `disambiguateAutoConstraintName`. An
|
|
1491
|
+
* unnamed table-level CHECK keeps no name at all (unchanged), so it cannot
|
|
1492
|
+
* collide.
|
|
1473
1493
|
*/
|
|
1474
|
-
extractCheckConstraints(astColumns, astConstraints) {
|
|
1494
|
+
extractCheckConstraints(astColumns, astConstraints, takenNames) {
|
|
1475
1495
|
const result = [];
|
|
1476
1496
|
for (const colDef of astColumns) {
|
|
1477
1497
|
for (const con of colDef.constraints ?? []) {
|
|
1478
1498
|
if (con.type === 'check' && con.expr) {
|
|
1479
1499
|
result.push({
|
|
1480
|
-
name: con.name ?? `_check_${colDef.name}`,
|
|
1500
|
+
name: con.name ?? disambiguateAutoConstraintName(`_check_${colDef.name}`, takenNames),
|
|
1481
1501
|
expr: con.expr,
|
|
1482
1502
|
operations: opsToMask(con.operations),
|
|
1483
1503
|
defaultConflict: con.onConflict,
|
|
@@ -1504,7 +1524,7 @@ export class SchemaManager {
|
|
|
1504
1524
|
* Resolves column indices in the child table. Parent table resolution is deferred
|
|
1505
1525
|
* to enforcement time (the parent table may not exist yet during declarative schema setup).
|
|
1506
1526
|
*/
|
|
1507
|
-
extractForeignKeys(astColumns, astConstraints, columnIndexMap, tableName, schemaName) {
|
|
1527
|
+
extractForeignKeys(astColumns, astConstraints, columnIndexMap, tableName, schemaName, takenNames) {
|
|
1508
1528
|
const result = [];
|
|
1509
1529
|
// Column-level foreign keys
|
|
1510
1530
|
for (const colDef of astColumns) {
|
|
@@ -1521,11 +1541,13 @@ export class SchemaManager {
|
|
|
1521
1541
|
throw new QuereusError(`FK constraint '${con.name ?? `_fk_${tableName}_${colDef.name}`}' on table '${tableName}': child column count (1) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
|
|
1522
1542
|
}
|
|
1523
1543
|
result.push({
|
|
1524
|
-
|
|
1544
|
+
// Two FKs on one child column (different parents) are legal SQL,
|
|
1545
|
+
// so a colliding mint disambiguates (`_fk_C_x`, then `_fk_C_x_2`)
|
|
1546
|
+
// rather than rejecting — see `disambiguateAutoConstraintName`.
|
|
1547
|
+
name: con.name ?? disambiguateAutoConstraintName(`_fk_${tableName}_${colDef.name}`, takenNames),
|
|
1525
1548
|
columns: Object.freeze([childColIndex]),
|
|
1526
1549
|
referencedTable: fk.table,
|
|
1527
1550
|
referencedSchema: fk.schema ?? schemaName,
|
|
1528
|
-
referencedColumns: Object.freeze([]), // resolved at enforcement time
|
|
1529
1551
|
referencedColumnNames: fk.columns, // deferred resolution via resolveReferencedColumns
|
|
1530
1552
|
onDelete: fk.onDelete ?? 'restrict',
|
|
1531
1553
|
onUpdate: fk.onUpdate ?? 'restrict',
|
|
@@ -1539,7 +1561,7 @@ export class SchemaManager {
|
|
|
1539
1561
|
// `ADD CONSTRAINT` path and CREATE TABLE produce byte-identical schemas.
|
|
1540
1562
|
for (const con of astConstraints ?? []) {
|
|
1541
1563
|
if (con.type === 'foreignKey' && con.foreignKey && con.columns) {
|
|
1542
|
-
result.push(buildForeignKeyConstraintSchema(con, columnIndexMap, tableName, schemaName));
|
|
1564
|
+
result.push(buildForeignKeyConstraintSchema(con, columnIndexMap, tableName, schemaName, takenNames));
|
|
1543
1565
|
}
|
|
1544
1566
|
}
|
|
1545
1567
|
return result;
|
|
@@ -1597,17 +1619,25 @@ export class SchemaManager {
|
|
|
1597
1619
|
const defaultNotNull = defaultNullability === 'not_null';
|
|
1598
1620
|
const astColumns = stmt.columns || [];
|
|
1599
1621
|
const { columns, pkDefinition, pkDefaultConflict } = this.buildColumnSchemas(astColumns, stmt.constraints, defaultNotNull, defaultCollation);
|
|
1600
|
-
|
|
1622
|
+
// Statement-wide taken-set the CHECK / FK mint sites disambiguate against:
|
|
1623
|
+
// seeded with every user-written constraint name up front, then accumulating
|
|
1624
|
+
// each mint, so a colliding auto-name gets a `_<N>` suffix instead of
|
|
1625
|
+
// producing two constraints one name addresses. Shared across the extractors
|
|
1626
|
+
// — one name space, not three.
|
|
1627
|
+
const takenConstraintNames = collectDeclaredConstraintNames(astColumns, stmt.constraints);
|
|
1628
|
+
const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints, takenConstraintNames);
|
|
1601
1629
|
const columnIndexMap = buildColumnIndexMap(columns);
|
|
1602
|
-
const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, targetSchemaName);
|
|
1630
|
+
const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, targetSchemaName, takenConstraintNames);
|
|
1603
1631
|
const uniqueConstraints = this.extractUniqueConstraints(astColumns, stmt.constraints, columnIndexMap);
|
|
1604
1632
|
const mutationContextSchemas = stmt.contextDefinitions
|
|
1605
1633
|
? stmt.contextDefinitions.map(varDef => mutationContextVarToSchema(varDef, defaultNotNull))
|
|
1606
1634
|
: undefined;
|
|
1607
1635
|
// Extract generated-column dependencies and validate that they form a DAG.
|
|
1608
1636
|
// Cycle detection runs before module.create so an invalid schema never
|
|
1609
|
-
// reaches storage.
|
|
1610
|
-
|
|
1637
|
+
// reaches storage. The catalog resolver serves the scope-aware analysis's
|
|
1638
|
+
// inner-FROM questions; the table being created is answered from the
|
|
1639
|
+
// in-flight `columns` (it is not in the catalog yet).
|
|
1640
|
+
const rawGenDeps = extractGeneratedColumnDependencies(columns, tableName, targetSchemaName, buildColumnSourceResolver(this.db));
|
|
1611
1641
|
const genTopoOrder = rawGenDeps.size > 0
|
|
1612
1642
|
? topoSortGeneratedColumns(columns, rawGenDeps)
|
|
1613
1643
|
: undefined;
|
|
@@ -1646,6 +1676,13 @@ export class SchemaManager {
|
|
|
1646
1676
|
* registered or executed; its compiled effective body is registered as a
|
|
1647
1677
|
* `ViewSchema`. Module association / indexes / storage are rejected upstream
|
|
1648
1678
|
* by the lens compiler before this is called.
|
|
1679
|
+
*
|
|
1680
|
+
* NOTE: `assertNoDuplicateConstraintNames` is deliberately NOT run here — it
|
|
1681
|
+
* guards `createTable` only. A logical table is never a `DROP CONSTRAINT` /
|
|
1682
|
+
* `RENAME CONSTRAINT` target, so a colliding user-written name in a lens
|
|
1683
|
+
* declaration costs nothing today; running the guard would instead risk
|
|
1684
|
+
* refusing a lens declaration that deployed before the guard existed. Revisit
|
|
1685
|
+
* if named-constraint lifecycle verbs ever address a logical table.
|
|
1649
1686
|
*/
|
|
1650
1687
|
buildLogicalTableSchema(stmt, schemaName) {
|
|
1651
1688
|
const tableName = stmt.table.name;
|
|
@@ -1655,9 +1692,12 @@ export class SchemaManager {
|
|
|
1655
1692
|
const defaultCollation = normalizeCollationName(this.db.options.getStringOption('default_collation'));
|
|
1656
1693
|
const astColumns = stmt.columns || [];
|
|
1657
1694
|
const { columns, pkDefinition, pkDefaultConflict } = this.buildColumnSchemas(astColumns, stmt.constraints, defaultNotNull, defaultCollation);
|
|
1658
|
-
|
|
1695
|
+
// Same statement-wide mint disambiguation as buildTableSchemaFromAST, so a
|
|
1696
|
+
// logical spec and the physical table it describes mint identical names.
|
|
1697
|
+
const takenConstraintNames = collectDeclaredConstraintNames(astColumns, stmt.constraints);
|
|
1698
|
+
const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints, takenConstraintNames);
|
|
1659
1699
|
const columnIndexMap = buildColumnIndexMap(columns);
|
|
1660
|
-
const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, schemaName);
|
|
1700
|
+
const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, schemaName, takenConstraintNames);
|
|
1661
1701
|
const uniqueConstraints = this.extractUniqueConstraints(astColumns, stmt.constraints, columnIndexMap);
|
|
1662
1702
|
return {
|
|
1663
1703
|
name: tableName,
|
|
@@ -1791,6 +1831,7 @@ export class SchemaManager {
|
|
|
1791
1831
|
schemaDependencies: new BuildTimeDependencyTracker(),
|
|
1792
1832
|
schemaCache: new Map(),
|
|
1793
1833
|
cteReferenceCache: new Map(),
|
|
1834
|
+
cteDescriptors: new Map(),
|
|
1794
1835
|
outputScopes: new Map()
|
|
1795
1836
|
};
|
|
1796
1837
|
}
|
|
@@ -1908,30 +1949,76 @@ export class SchemaManager {
|
|
|
1908
1949
|
});
|
|
1909
1950
|
if (allowNonDeterministic)
|
|
1910
1951
|
continue;
|
|
1911
|
-
|
|
1912
|
-
traverseAst(cc.expr, {
|
|
1913
|
-
enterNode: (node) => {
|
|
1914
|
-
if (offendingExpr)
|
|
1915
|
-
return false;
|
|
1916
|
-
if (node.type !== 'function')
|
|
1917
|
-
return;
|
|
1918
|
-
const fnNode = node;
|
|
1919
|
-
const argCount = fnNode.args?.length ?? 0;
|
|
1920
|
-
const funcSchema = this.findFunction(fnNode.name, argCount)
|
|
1921
|
-
?? this.findFunction(fnNode.name, -1);
|
|
1922
|
-
if (funcSchema && (funcSchema.flags & FunctionFlags.DETERMINISTIC) === 0) {
|
|
1923
|
-
offendingExpr = fnNode;
|
|
1924
|
-
return false;
|
|
1925
|
-
}
|
|
1926
|
-
},
|
|
1927
|
-
});
|
|
1952
|
+
const offendingExpr = this.findNonDeterministicCall(cc.expr);
|
|
1928
1953
|
if (offendingExpr) {
|
|
1929
|
-
throw
|
|
1930
|
-
`Function '${offendingExpr.name}' is not deterministic. ` +
|
|
1931
|
-
`Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
|
|
1954
|
+
throw nonDeterministicDeclarationError(`CHECK constraint '${constraintName}' on table '${tableName}'`, offendingExpr);
|
|
1932
1955
|
}
|
|
1933
1956
|
}
|
|
1934
1957
|
}
|
|
1958
|
+
/**
|
|
1959
|
+
* Validates that `GENERATED ALWAYS AS` expressions don't call non-deterministic
|
|
1960
|
+
* functions, so a declaration no write could ever satisfy is refused where it is
|
|
1961
|
+
* written rather than at every later INSERT/UPDATE.
|
|
1962
|
+
*
|
|
1963
|
+
* Called from {@link createTable} beside the CHECK / DEFAULT gates rather than from
|
|
1964
|
+
* the shared {@link buildTableSchemaFromAST}, and for the same reason those two are:
|
|
1965
|
+
* the import/rehydrate path shares that builder, and `nondeterministic_schema` is a
|
|
1966
|
+
* *session* option — a table legitimately declared while the pragma was on must still
|
|
1967
|
+
* reload into a session that has it off, instead of failing the whole catalog open.
|
|
1968
|
+
* `ALTER TABLE ADD COLUMN` runs its own equivalent gate (see
|
|
1969
|
+
* `planner/building/alter-table.ts`), so both authoring surfaces agree.
|
|
1970
|
+
*
|
|
1971
|
+
* NOTE: the sibling generated-column gate — `unboundQualifierError` in `./table.ts`,
|
|
1972
|
+
* reached from the builder — deliberately DOES fire on reload, and the two are not
|
|
1973
|
+
* meant to converge. A body naming something nothing binds is unwritable in every
|
|
1974
|
+
* session, so no reload of it can be legitimate; a non-deterministic body is
|
|
1975
|
+
* legitimately writable whenever the pragma is on, so rejecting it on reload would
|
|
1976
|
+
* close a database this same build opened. Revisit both together if reload ever
|
|
1977
|
+
* gains a general "refuse schemas no write can satisfy" pass.
|
|
1978
|
+
*/
|
|
1979
|
+
validateGeneratedColumnDeterminism(columns, tableName, allowNonDeterministic = false) {
|
|
1980
|
+
if (allowNonDeterministic)
|
|
1981
|
+
return;
|
|
1982
|
+
for (const col of columns) {
|
|
1983
|
+
if (!col.generated || !col.generatedExpr)
|
|
1984
|
+
continue;
|
|
1985
|
+
const offendingExpr = this.findNonDeterministicCall(col.generatedExpr);
|
|
1986
|
+
if (offendingExpr) {
|
|
1987
|
+
throw nonDeterministicDeclarationError(`GENERATED ALWAYS AS for column '${col.name}' in table '${tableName}'`, offendingExpr);
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
/**
|
|
1992
|
+
* The first function call under `expr` whose registry entry lacks
|
|
1993
|
+
* `FunctionFlags.DETERMINISTIC`, or undefined if every call is deterministic.
|
|
1994
|
+
* A name the registry cannot resolve is skipped — an unknown function still
|
|
1995
|
+
* surfaces at write time, not here.
|
|
1996
|
+
*
|
|
1997
|
+
* Shared by the CHECK and GENERATED declaration-time gates. Both walk the raw
|
|
1998
|
+
* AST rather than building the expression the way {@link validateDefaultDeterminism}
|
|
1999
|
+
* does: their bodies name the table's own columns, whose scope does not exist
|
|
2000
|
+
* yet at declaration time.
|
|
2001
|
+
*/
|
|
2002
|
+
findNonDeterministicCall(expr) {
|
|
2003
|
+
let offendingExpr;
|
|
2004
|
+
traverseAst(expr, {
|
|
2005
|
+
enterNode: (node) => {
|
|
2006
|
+
if (offendingExpr)
|
|
2007
|
+
return false;
|
|
2008
|
+
if (node.type !== 'function')
|
|
2009
|
+
return;
|
|
2010
|
+
const fnNode = node;
|
|
2011
|
+
const argCount = fnNode.args?.length ?? 0;
|
|
2012
|
+
const funcSchema = this.findFunction(fnNode.name, argCount)
|
|
2013
|
+
?? this.findFunction(fnNode.name, -1);
|
|
2014
|
+
if (funcSchema && (funcSchema.flags & FunctionFlags.DETERMINISTIC) === 0) {
|
|
2015
|
+
offendingExpr = fnNode;
|
|
2016
|
+
return false;
|
|
2017
|
+
}
|
|
2018
|
+
},
|
|
2019
|
+
});
|
|
2020
|
+
return offendingExpr;
|
|
2021
|
+
}
|
|
1935
2022
|
/**
|
|
1936
2023
|
* Registers a table schema after module.create() returns, correcting
|
|
1937
2024
|
* name/schema if the module returned different values.
|
|
@@ -1995,7 +2082,7 @@ export class SchemaManager {
|
|
|
1995
2082
|
}
|
|
1996
2083
|
throw new QuereusError(`Index ${indexName} already exists on table ${tableName}`, StatusCode.CONSTRAINT, undefined, stmt.index.loc?.start.line, stmt.index.loc?.start.column);
|
|
1997
2084
|
}
|
|
1998
|
-
// Index names are unique per schema, not per table (docs/sql-
|
|
2085
|
+
// Index names are unique per schema, not per table (docs/sql-vtab.md §6.3).
|
|
1999
2086
|
// Every by-name index resolver — `dropIndex`, `updateIndexTags`, sync's
|
|
2000
2087
|
// `findIndexOwner` — locates the owning table by first-match scan over the
|
|
2001
2088
|
// schema's tables, and "first" is registration order, which is not stable
|
|
@@ -2084,7 +2171,7 @@ export class SchemaManager {
|
|
|
2084
2171
|
* schema-wide name-uniqueness check ({@link findIndexNameOwnerElsewhere}) and
|
|
2085
2172
|
* `@quereus/sync`'s replicated index DDL all funnel here.
|
|
2086
2173
|
*
|
|
2087
|
-
* Index names are unique per schema, not per table (docs/sql-
|
|
2174
|
+
* Index names are unique per schema, not per table (docs/sql-vtab.md §6.3), and
|
|
2088
2175
|
* {@link createIndex} rejects a name already taken elsewhere in the schema, so
|
|
2089
2176
|
* first-match is unambiguous by construction. That invariant is what makes
|
|
2090
2177
|
* replication safe: a replicated `drop index "main"."idx"` carries no table name
|
|
@@ -2347,6 +2434,25 @@ export class SchemaManager {
|
|
|
2347
2434
|
const allowNonDet = this.db.options.getBooleanOption('nondeterministic_schema');
|
|
2348
2435
|
this.validateDefaultDeterminism(baseTableSchema.columns, tableName, hasMutationContext, allowNonDet);
|
|
2349
2436
|
this.validateCheckConstraintDeterminism(baseTableSchema.checkConstraints, tableName, allowNonDet);
|
|
2437
|
+
this.validateGeneratedColumnDeterminism(baseTableSchema.columns, tableName, allowNonDet);
|
|
2438
|
+
// A literal DEFAULT must be convertible to its own column's declared type — the same
|
|
2439
|
+
// check ADD COLUMN and SET NOT NULL backfill already run — so an unconvertible one is
|
|
2440
|
+
// refused here rather than surfacing later as an INSERT failure blaming the insert
|
|
2441
|
+
// instead of the declaration. Engine-side and pre-`module.create`, same rationale as
|
|
2442
|
+
// the guards below: one gate covers every backend, and a refusal leaves no storage
|
|
2443
|
+
// behind. Non-literal defaults (a function call, `new.<col>`, a bare column reference)
|
|
2444
|
+
// fold to `undefined` and stay deferred to write time, unchanged.
|
|
2445
|
+
for (const col of baseTableSchema.columns) {
|
|
2446
|
+
foldDefaultToType(col.defaultValue, col.logicalType, col.name);
|
|
2447
|
+
}
|
|
2448
|
+
// Refuse a CREATE TABLE carrying two user-written constraint names that collide —
|
|
2449
|
+
// one case-folded name space across CHECK / UNIQUE / FK, so the same-class shape
|
|
2450
|
+
// (DROP removes both) and the cross-class shape (permanently un-droppable as
|
|
2451
|
+
// ambiguous) are both refused at birth. Same rule every ALTER path enforces via
|
|
2452
|
+
// `assertConstraintNameFree`; reads the raw declaration, so engine-minted names
|
|
2453
|
+
// (two unnamed CHECKs on one column — legal) are not compared. Placement shares
|
|
2454
|
+
// the duplicate-UNIQUE guard's rationale below.
|
|
2455
|
+
assertNoDuplicateConstraintNames(stmt.columns ?? [], stmt.constraints, `create table '${tableName}'`);
|
|
2350
2456
|
// Refuse a CREATE TABLE that declares the same plain UNIQUE twice — the same rule
|
|
2351
2457
|
// `ALTER TABLE ADD CONSTRAINT` / `ADD COLUMN … unique` apply, so a duplicate is
|
|
2352
2458
|
// refused identically wherever it is written. Before `module.create`, so the
|
|
@@ -2355,6 +2461,32 @@ export class SchemaManager {
|
|
|
2355
2461
|
// still open a catalog written before this guard existed (same placement rationale
|
|
2356
2462
|
// as the FK-collation check below).
|
|
2357
2463
|
assertNoDuplicateUniqueConstraints(baseTableSchema.uniqueConstraints ?? [], baseTableSchema.columns, `create table '${tableName}'`);
|
|
2464
|
+
// Two DIFFERENT UNIQUE constraints (different column sets, so the duplicate guard
|
|
2465
|
+
// above passes) may still derive ONE backing structure name — via a constraint name
|
|
2466
|
+
// written with the engine's reserved `_uc_` prefix, or via the `_`-joined auto-name
|
|
2467
|
+
// colliding on ordinary column names (`unique (a_b)` beside `unique (a, b)`). The
|
|
2468
|
+
// second constraint then adopts the first's structure and is enforced by one keyed on
|
|
2469
|
+
// the OTHER constraint's columns, so it silently stops rejecting duplicates. Every
|
|
2470
|
+
// ALTER path refuses this; refused here too, so one declaration gets one answer
|
|
2471
|
+
// wherever it is written. After the duplicate guard (a genuine duplicate must keep its
|
|
2472
|
+
// constraint-worded message) and before `module.create` (a refusal leaves no storage).
|
|
2473
|
+
assertNoDuplicateUniqueConstraintBackingNames(baseTableSchema.uniqueConstraints ?? [], baseTableSchema.columns, `create table '${tableName}'`);
|
|
2474
|
+
// Ask every registered module whether it could durably persist this table's
|
|
2475
|
+
// definition — the same veto CREATE VIEW / CREATE MATERIALIZED VIEW / the RENAME
|
|
2476
|
+
// dependent scan already run (see assertCatalogObjectPersistable). Without it, a
|
|
2477
|
+
// definition the storage backend cannot encode (e.g. an unpaired surrogate in a
|
|
2478
|
+
// column name or a DEFAULT/CHECK string literal) creates successfully and then is
|
|
2479
|
+
// silently dropped by the swallowing SchemaChangeNotifier / persist-queue layers —
|
|
2480
|
+
// worse, if the table is never touched again, nothing ever surfaces the loss.
|
|
2481
|
+
// Before `module.create`, same as the duplicate-UNIQUE guard above, so a refusal
|
|
2482
|
+
// leaves no storage behind. `baseTableSchema` (pre-`module.create`) rather than the
|
|
2483
|
+
// post-create `completeTableSchema` is safe here: the veto reads only the rendered
|
|
2484
|
+
// DDL text, and the one thing `finalizeCreatedTableSchema` still changes —
|
|
2485
|
+
// collation reconciliation — can only substitute an engine-known collation name,
|
|
2486
|
+
// never introduce an unencodable character. Not run on the import/rehydrate path
|
|
2487
|
+
// (`buildTableSchemaFromAST` itself, `importTable`/`importDDL`) — a catalog written
|
|
2488
|
+
// before this guard existed must still open.
|
|
2489
|
+
assertCatalogObjectPersistable(this.db, 'table', baseTableSchema);
|
|
2358
2490
|
let tableInstance;
|
|
2359
2491
|
try {
|
|
2360
2492
|
// `preferBacking` (set only by the maintained-table create path) routes
|