@quereus/quereus 4.20.0 → 4.20.2
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 +2 -0
- package/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
-- query-expr-values.sqllogic — exercises the unified QueryExpr surface for
|
|
2
|
+
-- VALUES bodies at every relation site. These cases parse + execute under
|
|
3
|
+
-- the pure-VALUES portion of the orthogonality work; DML-as-relation cases
|
|
4
|
+
-- are gated until the follow-up dml-in-expression-position ticket lifts them.
|
|
5
|
+
|
|
6
|
+
-- ===================================
|
|
7
|
+
-- 1. VALUES as a CTE body (was a parser TODO; now first-class)
|
|
8
|
+
-- ===================================
|
|
9
|
+
|
|
10
|
+
with t(a, b) as (values (1, 'x'), (2, 'y'))
|
|
11
|
+
select a, b from t order by a;
|
|
12
|
+
→ [{"a":1,"b":"x"},{"a":2,"b":"y"}]
|
|
13
|
+
|
|
14
|
+
-- ===================================
|
|
15
|
+
-- 2. VALUES as a compound-set leg (UNION ALL with another VALUES)
|
|
16
|
+
-- ===================================
|
|
17
|
+
|
|
18
|
+
values (1) union all values (2);
|
|
19
|
+
→ [{"column_0":1},{"column_0":2}]
|
|
20
|
+
|
|
21
|
+
-- ===================================
|
|
22
|
+
-- 3. Mixed compound: SELECT against a subquery VALUES, then UNION ALL with VALUES
|
|
23
|
+
-- ===================================
|
|
24
|
+
-- Output column names follow the union output naming convention used by the
|
|
25
|
+
-- planner today; what we're pinning here is that the rows survive
|
|
26
|
+
-- end-to-end through the unified compound-leg parser.
|
|
27
|
+
|
|
28
|
+
select * from (values (1, 'x'), (2, 'y')) as t(a, b)
|
|
29
|
+
union all
|
|
30
|
+
values (3, 'z');
|
|
31
|
+
→ [{"column_0":1,"column_1":"x"},{"column_0":2,"column_1":"y"},{"column_0":3,"column_1":"z"}]
|
|
32
|
+
|
|
33
|
+
-- ===================================
|
|
34
|
+
-- 4. VALUES as a CREATE VIEW body — names synthesized from the body
|
|
35
|
+
-- ===================================
|
|
36
|
+
|
|
37
|
+
create view v_unnamed as values (1, 'a'), (2, 'b');
|
|
38
|
+
select * from v_unnamed order by column_0;
|
|
39
|
+
→ [{"column_0":1,"column_1":"a"},{"column_0":2,"column_1":"b"}]
|
|
40
|
+
drop view v_unnamed;
|
|
41
|
+
|
|
42
|
+
-- ===================================
|
|
43
|
+
-- 5. VALUES as a CREATE VIEW body — binding-site column names win
|
|
44
|
+
-- ===================================
|
|
45
|
+
|
|
46
|
+
create view v_named(a, b) as values (1, 'x'), (2, 'y');
|
|
47
|
+
select * from v_named order by a;
|
|
48
|
+
→ [{"a":1,"b":"x"},{"a":2,"b":"y"}]
|
|
49
|
+
drop view v_named;
|
|
50
|
+
|
|
51
|
+
-- ===================================
|
|
52
|
+
-- 6. VALUES inside IN (already worked via Project(Values…); pinned here)
|
|
53
|
+
-- ===================================
|
|
54
|
+
|
|
55
|
+
select 2 in (values (1), (2), (3)) as found;
|
|
56
|
+
→ [{"found":true}]
|
|
57
|
+
|
|
58
|
+
-- ===================================
|
|
59
|
+
-- 7. VALUES inside EXISTS
|
|
60
|
+
-- ===================================
|
|
61
|
+
|
|
62
|
+
select exists (values (1)) as ex;
|
|
63
|
+
→ [{"ex":true}]
|
|
64
|
+
|
|
65
|
+
-- ===================================
|
|
66
|
+
-- 8. Scalar / row subquery with VALUES body
|
|
67
|
+
-- ===================================
|
|
68
|
+
|
|
69
|
+
select (values (42)) as v;
|
|
70
|
+
→ [{"v":42}]
|
|
71
|
+
|
|
72
|
+
-- ===================================
|
|
73
|
+
-- 9. Three-leg compound chain of bare VALUES
|
|
74
|
+
-- ===================================
|
|
75
|
+
-- The right leg of a compound recurses through the VALUES wrapper so chains
|
|
76
|
+
-- longer than two legs work, not just `VALUES … UNION VALUES …`.
|
|
77
|
+
|
|
78
|
+
values (1) union all values (2) union all values (3);
|
|
79
|
+
→ [{"column_0":1},{"column_0":2},{"column_0":3}]
|
|
80
|
+
|
|
81
|
+
-- ===================================
|
|
82
|
+
-- 10. Bare VALUES + ORDER BY at top level (no compound)
|
|
83
|
+
-- ===================================
|
|
84
|
+
-- The wrapper synthesizes whenever ORDER BY / LIMIT / OFFSET follow VALUES,
|
|
85
|
+
-- not just on compound. Result column names come from the inner VALUES
|
|
86
|
+
-- (synthetic `column_0`).
|
|
87
|
+
|
|
88
|
+
values (3), (1), (2) order by column_0;
|
|
89
|
+
→ [{"column_0":1},{"column_0":2},{"column_0":3}]
|
|
90
|
+
|
|
91
|
+
-- ===================================
|
|
92
|
+
-- 11. Bare VALUES + LIMIT/OFFSET at top level
|
|
93
|
+
-- ===================================
|
|
94
|
+
|
|
95
|
+
values (1), (2), (3), (4) limit 2 offset 1;
|
|
96
|
+
→ [{"column_0":2},{"column_0":3}]
|
|
97
|
+
|
|
98
|
+
-- ===================================
|
|
99
|
+
-- 12. Bare VALUES + ORDER BY/LIMIT inside a parenthesized subquery source
|
|
100
|
+
-- ===================================
|
|
101
|
+
|
|
102
|
+
select * from (values (3), (1), (2) order by column_0 limit 2) as v;
|
|
103
|
+
→ [{"column_0":1},{"column_0":2}]
|
|
104
|
+
|
|
105
|
+
-- ===================================
|
|
106
|
+
-- 13. Bare VALUES + ORDER BY in a CTE body
|
|
107
|
+
-- ===================================
|
|
108
|
+
|
|
109
|
+
with c(a) as (values (3), (1), (2) order by column_0)
|
|
110
|
+
select a from c;
|
|
111
|
+
→ [{"a":1},{"a":2},{"a":3}]
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
-- 01.9.1-limit-over-dml-subquery.sqllogic - a LIMIT never truncates a writing source
|
|
2
|
+
--
|
|
3
|
+
-- `select ... from (insert/update/delete ... returning ...) limit n` caps what the
|
|
4
|
+
-- QUERY returns, not what the STATEMENT writes: the data-modifying subquery runs to
|
|
5
|
+
-- completion and the LIMIT only decides how many of its RETURNING rows come back.
|
|
6
|
+
--
|
|
7
|
+
-- The LIMIT arm of 01.9-query-expr-dml.sqllogic, which pins the same full-drain rule for
|
|
8
|
+
-- a writing inner in scalar / IN / EXISTS / CTE-body / FROM-source position. It is also
|
|
9
|
+
-- the rule 13.6 pins for a data-modifying CTE under `limit 0`, and the answer PostgreSQL
|
|
10
|
+
-- gives for a data-modifying CTE. Before bug-limit-reads-one-row-too-many this case gave
|
|
11
|
+
-- a third answer — it wrote exactly one row more than it returned, an artifact of the
|
|
12
|
+
-- LIMIT reading one row past its last emitted one.
|
|
13
|
+
--
|
|
14
|
+
-- Scope: "runs to completion" means when the statement itself is run to completion.
|
|
15
|
+
-- Abandoning the result iteration early stops the writes with it, exactly as it does for
|
|
16
|
+
-- a DML FROM-subquery with no LIMIT at all — see docs/sql-select.md § Query expressions.
|
|
17
|
+
--
|
|
18
|
+
-- Every section asserts BOTH halves: the rows the query returned, and the rows that
|
|
19
|
+
-- landed in the target table.
|
|
20
|
+
|
|
21
|
+
-- ===== INSERT ... RETURNING under LIMIT 1 =====
|
|
22
|
+
|
|
23
|
+
create table srcq (k integer primary key);
|
|
24
|
+
insert into srcq values (1), (2), (3), (4);
|
|
25
|
+
create table d1 (k integer primary key);
|
|
26
|
+
-- run
|
|
27
|
+
|
|
28
|
+
select k from (insert into d1 select k from srcq returning k) limit 1;
|
|
29
|
+
→ [{"k":1}]
|
|
30
|
+
|
|
31
|
+
-- All four rows written, not one and not two.
|
|
32
|
+
select count(*) as n from d1;
|
|
33
|
+
→ [{"n":4}]
|
|
34
|
+
|
|
35
|
+
-- ===== INSERT ... RETURNING under LIMIT 0 =====
|
|
36
|
+
-- The strongest form: the query consumes nothing at all and the write still happens.
|
|
37
|
+
|
|
38
|
+
create table d2 (k integer primary key);
|
|
39
|
+
-- run
|
|
40
|
+
|
|
41
|
+
select k from (insert into d2 select k from srcq returning k) limit 0;
|
|
42
|
+
→ []
|
|
43
|
+
|
|
44
|
+
select count(*) as n from d2;
|
|
45
|
+
→ [{"n":4}]
|
|
46
|
+
|
|
47
|
+
-- ===== INSERT ... RETURNING under LIMIT with OFFSET =====
|
|
48
|
+
|
|
49
|
+
create table d3 (k integer primary key);
|
|
50
|
+
-- run
|
|
51
|
+
|
|
52
|
+
select k from (insert into d3 select k from srcq returning k) limit 2 offset 1;
|
|
53
|
+
→ [{"k":2},{"k":3}]
|
|
54
|
+
|
|
55
|
+
select count(*) as n from d3;
|
|
56
|
+
→ [{"n":4}]
|
|
57
|
+
|
|
58
|
+
-- ===== UPDATE ... RETURNING under LIMIT 1 =====
|
|
59
|
+
-- The silent-corruption shape: a partial update looks plausible in the output.
|
|
60
|
+
|
|
61
|
+
create table uq (k integer primary key, v integer);
|
|
62
|
+
insert into uq values (1, 0), (2, 0), (3, 0), (4, 0);
|
|
63
|
+
-- run
|
|
64
|
+
|
|
65
|
+
select k from (update uq set v = v + 1 returning k, v) limit 1;
|
|
66
|
+
→ [{"k":1}]
|
|
67
|
+
|
|
68
|
+
-- Every row incremented, not just the one the LIMIT let through.
|
|
69
|
+
select k, v from uq order by k;
|
|
70
|
+
→ [{"k":1,"v":1},{"k":2,"v":1},{"k":3,"v":1},{"k":4,"v":1}]
|
|
71
|
+
|
|
72
|
+
-- ===== DELETE ... RETURNING under LIMIT 1 =====
|
|
73
|
+
|
|
74
|
+
create table xq (k integer primary key);
|
|
75
|
+
insert into xq values (1), (2), (3), (4);
|
|
76
|
+
-- run
|
|
77
|
+
|
|
78
|
+
select k from (delete from xq where k >= 2 returning k) limit 1;
|
|
79
|
+
→ [{"k":2}]
|
|
80
|
+
|
|
81
|
+
-- All three matching rows deleted, not just the returned one.
|
|
82
|
+
select k from xq order by k;
|
|
83
|
+
→ [{"k":1}]
|
|
84
|
+
|
|
85
|
+
-- ===== Control: a read-only source IS truncated by the LIMIT =====
|
|
86
|
+
-- The drain rule is scoped to writing sources. A pure subquery still stops early —
|
|
87
|
+
-- that is the whole point of a LIMIT. (Row-level "stopped early, did not over-read"
|
|
88
|
+
-- counts are pinned in test/runtime/early-stop-consumption.spec.ts.)
|
|
89
|
+
|
|
90
|
+
select k from (select k from srcq) order by k limit 1;
|
|
91
|
+
→ [{"k":1}]
|
|
92
|
+
|
|
93
|
+
select count(*) as n from srcq;
|
|
94
|
+
→ [{"n":4}]
|
|
95
|
+
|
|
96
|
+
-- ===== A LIMIT above another LIMIT still drains =====
|
|
97
|
+
-- The drain gate asks whether the WHOLE subtree writes, not whether the immediate child
|
|
98
|
+
-- does, so an outer LIMIT over an inner LIMIT over a DML drains through both. Pinned
|
|
99
|
+
-- because narrowing the gate to "my direct child is a mutation" would silently
|
|
100
|
+
-- reintroduce the truncation one level up.
|
|
101
|
+
|
|
102
|
+
create table d4 (k integer primary key);
|
|
103
|
+
-- run
|
|
104
|
+
|
|
105
|
+
select k from (select k from (insert into d4 select k from srcq returning k) limit 3) limit 1;
|
|
106
|
+
→ [{"k":1}]
|
|
107
|
+
|
|
108
|
+
select count(*) as n from d4;
|
|
109
|
+
→ [{"n":4}]
|
|
110
|
+
|
|
111
|
+
-- Cleanup
|
|
112
|
+
drop table srcq;
|
|
113
|
+
drop table d4;
|
|
114
|
+
drop table d1;
|
|
115
|
+
drop table d2;
|
|
116
|
+
drop table d3;
|
|
117
|
+
drop table uq;
|
|
118
|
+
drop table xq;
|
|
119
|
+
-- run
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
-- 02-filters.sqllogic — Behavioural regression for WHERE-clause optimizer rules.
|
|
2
|
+
-- Initial focus: rulePredicateInferenceEquivalence (EC × constant binding → inferred eq).
|
|
3
|
+
|
|
4
|
+
-- ---------------------------------------------------------------------------
|
|
5
|
+
-- Predicate inference (EC × constant binding) — semantic equivalence.
|
|
6
|
+
-- ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
create table t (k int primary key, v text);
|
|
9
|
+
create table u (k int primary key, v text);
|
|
10
|
+
|
|
11
|
+
insert into t values (1, 'a'), (5, 'e'), (10, 'j');
|
|
12
|
+
insert into u values (5, 'E'), (7, 'G'), (10, 'J');
|
|
13
|
+
|
|
14
|
+
-- Literal: inference should produce u.k = 5 on the u-side; result is the
|
|
15
|
+
-- single matched row.
|
|
16
|
+
select t.v as tv, u.v as uv from t join u on t.k = u.k where t.k = 5;
|
|
17
|
+
→ [{"tv":"e","uv":"E"}]
|
|
18
|
+
|
|
19
|
+
-- Parameter: inference threads the same parameter through to the u-side
|
|
20
|
+
-- access path. Result must match the literal form for the same value.
|
|
21
|
+
-- params: [10]
|
|
22
|
+
select t.v as tv, u.v as uv from t join u on t.k = u.k where t.k = ?;
|
|
23
|
+
→ [{"tv":"j","uv":"J"}]
|
|
24
|
+
|
|
25
|
+
-- LEFT JOIN safety: outer's t.k = 5 must NOT propagate to the right side as
|
|
26
|
+
-- an EC-derived restriction (that would prune null-padded rows). Unmatched
|
|
27
|
+
-- left rows survive with NULL on the right.
|
|
28
|
+
select t.k as tk, u.k as uk from t left join u on t.k = u.k where t.k <= 5 order by t.k;
|
|
29
|
+
→ [{"tk":1,"uk":null},{"tk":5,"uk":5}]
|
|
30
|
+
|
|
31
|
+
-- Multi-hop chain: a.x = 7 should propagate through both equi-joins so the
|
|
32
|
+
-- chain returns rows only when every joined side has x = 7.
|
|
33
|
+
create table ta (id int primary key, x int);
|
|
34
|
+
create table tb (id int primary key, x int);
|
|
35
|
+
create table tc (id int primary key, x int);
|
|
36
|
+
|
|
37
|
+
insert into ta values (1, 7), (2, 8);
|
|
38
|
+
insert into tb values (1, 7), (2, 8);
|
|
39
|
+
insert into tc values (1, 7), (2, 8);
|
|
40
|
+
|
|
41
|
+
select ta.x as ax, tb.x as bx, tc.x as cx
|
|
42
|
+
from ta join tb on ta.x = tb.x
|
|
43
|
+
join tc on tb.x = tc.x
|
|
44
|
+
where ta.x = 7;
|
|
45
|
+
→ [{"ax":7,"bx":7,"cx":7}]
|
|
46
|
+
|
|
47
|
+
drop table tc;
|
|
48
|
+
drop table tb;
|
|
49
|
+
drop table ta;
|
|
50
|
+
drop table u;
|
|
51
|
+
|
|
52
|
+
-- Prefix-NOT precedence (issue #22) is covered by the full predicate
|
|
53
|
+
-- matrix in 03.8-not-precedence.sqllogic.
|
|
54
|
+
drop table t;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
-- smoke.sqllogic - Basic sanity checks for core operations
|
|
2
|
+
|
|
3
|
+
-- Test basic operations
|
|
4
|
+
|
|
5
|
+
-- Set default VTab for subsequent CREATE TABLE
|
|
6
|
+
-- Create a table
|
|
7
|
+
CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT);
|
|
8
|
+
--SELECT name FROM schema() WHERE type = 'table' AND name = 't1';
|
|
9
|
+
--→ [{"name":"t1"}]
|
|
10
|
+
|
|
11
|
+
-- Insert some rows
|
|
12
|
+
INSERT INTO t1 VALUES (1, 'one');
|
|
13
|
+
INSERT INTO t1 (a, b) VALUES (2, 'two');
|
|
14
|
+
--SELECT count(*) FROM t1;
|
|
15
|
+
--→ [{"count(*)": 2}]
|
|
16
|
+
|
|
17
|
+
-- Select data with ordering
|
|
18
|
+
--SELECT * FROM t1 ORDER BY a;
|
|
19
|
+
--→ [{"a":1,"b":"one"},{"a":2,"b":"two"}]
|
|
20
|
+
|
|
21
|
+
-- Select specific columns
|
|
22
|
+
--SELECT b FROM t1 WHERE a = 1;
|
|
23
|
+
--→ [{"b":"one"}]
|
|
24
|
+
|
|
25
|
+
-- Update data
|
|
26
|
+
UPDATE t1 SET b = 'deux' WHERE a = 2;
|
|
27
|
+
--SELECT b FROM t1 WHERE a = 2;
|
|
28
|
+
--→ [{"b":"deux"}]
|
|
29
|
+
SELECT * FROM t1 ORDER BY a;
|
|
30
|
+
→ [{"a":1,"b":"one"},{"a":2,"b":"deux"}]
|
|
31
|
+
|
|
32
|
+
-- Delete data
|
|
33
|
+
DELETE FROM t1 WHERE a = 1;
|
|
34
|
+
SELECT count(*) FROM t1;
|
|
35
|
+
→ [{"count(*)": 1}]
|
|
36
|
+
SELECT * FROM t1;
|
|
37
|
+
→ [{"a":2,"b":"deux"}]
|
|
38
|
+
|
|
39
|
+
-- Block 1: Drop the table
|
|
40
|
+
DROP TABLE t1;
|
|
41
|
+
-- No expected output for DROP
|
|
42
|
+
|
|
43
|
+
-- Block 2: Verify table is gone
|
|
44
|
+
SELECT name FROM schema() WHERE type = 'table' AND name = 't1';
|
|
45
|
+
→ []
|
|
46
|
+
|
|
47
|
+
-- Test NULL handling (column val explicitly nullable for NULL testing)
|
|
48
|
+
CREATE TABLE t_null(id INTEGER PRIMARY KEY, val NUMERIC NULL);
|
|
49
|
+
INSERT INTO t_null VALUES (1, NULL), (2, 10), (3, 20.5);
|
|
50
|
+
SELECT * FROM t_null ORDER BY id;
|
|
51
|
+
→ [{"id":1,"val":null},{"id":2,"val":10},{"id":3,"val":20.5}]
|
|
52
|
+
DROP TABLE t_null;
|
|
53
|
+
|
|
54
|
+
-- Test updating NULL column to non-NULL value (regression test)
|
|
55
|
+
CREATE TABLE items (id TEXT PRIMARY KEY, name TEXT, description TEXT NULL);
|
|
56
|
+
INSERT INTO items (id, name, description) VALUES ('item-1', 'Coffee', null);
|
|
57
|
+
SELECT description FROM items WHERE id = 'item-1';
|
|
58
|
+
→ [{"description":null}]
|
|
59
|
+
UPDATE items SET description = 'dddd' WHERE id = 'item-1';
|
|
60
|
+
SELECT description FROM items WHERE id = 'item-1';
|
|
61
|
+
→ [{"description":"dddd"}]
|
|
62
|
+
DROP TABLE items;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
-- adapted from SQLite test/bind.test
|
|
2
|
+
-- Bind parameter syntax and binding semantics across statement types.
|
|
3
|
+
-- Quereus parameter forms: `?` (positional), `:name`, `:N` (numeric named),
|
|
4
|
+
-- `$name`, `$N` (numeric named). `@name` and `?N` are NOT supported.
|
|
5
|
+
|
|
6
|
+
create table bp (id integer primary key, val integer null, name text);
|
|
7
|
+
insert into bp values (1, 10, 'alpha'), (2, 20, 'beta'), (3, 30, 'gamma'), (4, null, 'delta');
|
|
8
|
+
|
|
9
|
+
-- ===================================
|
|
10
|
+
-- Positional `?` in basic SELECT
|
|
11
|
+
-- ===================================
|
|
12
|
+
|
|
13
|
+
-- params: [1]
|
|
14
|
+
select val from bp where id = ?;
|
|
15
|
+
→ [{"val":10}]
|
|
16
|
+
|
|
17
|
+
-- Two positional parameters, both bound from one params array
|
|
18
|
+
-- params: [1, 25]
|
|
19
|
+
select id from bp where id = ? or val > ?;
|
|
20
|
+
→ [{"id":1},{"id":3}]
|
|
21
|
+
|
|
22
|
+
-- ===================================
|
|
23
|
+
-- Named `:name` in basic SELECT
|
|
24
|
+
-- ===================================
|
|
25
|
+
|
|
26
|
+
-- params: {"id": 2}
|
|
27
|
+
select val from bp where id = :id;
|
|
28
|
+
→ [{"val":20}]
|
|
29
|
+
|
|
30
|
+
-- params: {"min": 15, "name": "gamma"}
|
|
31
|
+
select id from bp where val >= :min and name = :name;
|
|
32
|
+
→ [{"id":3}]
|
|
33
|
+
|
|
34
|
+
-- Same named parameter referenced twice
|
|
35
|
+
-- params: {"target": 2}
|
|
36
|
+
select id from bp where id = :target or id = :target + 1;
|
|
37
|
+
→ [{"id":2},{"id":3}]
|
|
38
|
+
|
|
39
|
+
-- ===================================
|
|
40
|
+
-- Named `$name` in basic SELECT
|
|
41
|
+
-- ===================================
|
|
42
|
+
|
|
43
|
+
-- params: {"id": 3}
|
|
44
|
+
select val from bp where id = $id;
|
|
45
|
+
→ [{"val":30}]
|
|
46
|
+
|
|
47
|
+
-- ===================================
|
|
48
|
+
-- Numeric named `:N` and `$N`
|
|
49
|
+
-- ===================================
|
|
50
|
+
|
|
51
|
+
-- params: {"1": 1}
|
|
52
|
+
select val from bp where id = :1;
|
|
53
|
+
→ [{"val":10}]
|
|
54
|
+
|
|
55
|
+
-- params: {"1": 2}
|
|
56
|
+
select val from bp where id = $1;
|
|
57
|
+
→ [{"val":20}]
|
|
58
|
+
|
|
59
|
+
-- ===================================
|
|
60
|
+
-- Parameter type variation
|
|
61
|
+
-- ===================================
|
|
62
|
+
|
|
63
|
+
-- Integer
|
|
64
|
+
-- params: [10]
|
|
65
|
+
select id from bp where val = ?;
|
|
66
|
+
→ [{"id":1}]
|
|
67
|
+
|
|
68
|
+
-- Real
|
|
69
|
+
-- params: [20.0]
|
|
70
|
+
select id from bp where val = ?;
|
|
71
|
+
→ [{"id":2}]
|
|
72
|
+
|
|
73
|
+
-- Text
|
|
74
|
+
-- params: ["alpha"]
|
|
75
|
+
select id from bp where name = ?;
|
|
76
|
+
→ [{"id":1}]
|
|
77
|
+
|
|
78
|
+
-- NULL
|
|
79
|
+
-- IS-as-equality (val IS ?) is SQLite-only; Quereus restricts IS to IS NULL/IS NOT NULL.
|
|
80
|
+
-- Use explicit null check instead.
|
|
81
|
+
-- params: []
|
|
82
|
+
select id from bp where val is null;
|
|
83
|
+
→ [{"id":4}]
|
|
84
|
+
|
|
85
|
+
-- ===================================
|
|
86
|
+
-- Parameter in INSERT / UPDATE / DELETE
|
|
87
|
+
-- ===================================
|
|
88
|
+
|
|
89
|
+
-- params: [5, 50, "epsilon"]
|
|
90
|
+
insert into bp (id, val, name) values (?, ?, ?);
|
|
91
|
+
→ []
|
|
92
|
+
|
|
93
|
+
select val, name from bp where id = 5;
|
|
94
|
+
→ [{"val":50,"name":"epsilon"}]
|
|
95
|
+
|
|
96
|
+
-- params: [99, 5]
|
|
97
|
+
update bp set val = ? where id = ?;
|
|
98
|
+
→ []
|
|
99
|
+
|
|
100
|
+
select val from bp where id = 5;
|
|
101
|
+
→ [{"val":99}]
|
|
102
|
+
|
|
103
|
+
-- params: [5]
|
|
104
|
+
delete from bp where id = ?;
|
|
105
|
+
→ []
|
|
106
|
+
|
|
107
|
+
select count(*) as cnt from bp where id = 5;
|
|
108
|
+
→ [{"cnt":0}]
|
|
109
|
+
|
|
110
|
+
-- ===================================
|
|
111
|
+
-- Parameter in expression contexts
|
|
112
|
+
-- ===================================
|
|
113
|
+
|
|
114
|
+
-- Arithmetic — text-order binding.
|
|
115
|
+
-- Positional `?` bind in SOURCE-TEXT order, NOT plan/resolution order. Here the
|
|
116
|
+
-- projection `?` (first in the text) takes 100 and the WHERE `?` (second) takes 1,
|
|
117
|
+
-- so we boost row id=1 (val 10) by 100. Under the OLD plan-order behaviour the
|
|
118
|
+
-- WHERE `?` would have bound first (=100, no such id) yielding []; this case pins
|
|
119
|
+
-- the text-order contract.
|
|
120
|
+
-- params: [100, 1]
|
|
121
|
+
select val + ? as boosted from bp where id = ?;
|
|
122
|
+
→ [{"boosted":110}]
|
|
123
|
+
|
|
124
|
+
-- Discriminator — a projection `?` AND a WHERE `?` whose values differ, so the two
|
|
125
|
+
-- binding orders give visibly different results. Text order: projection `?`=7,
|
|
126
|
+
-- WHERE `?`=2 → boost row id=2 (val 20) → 27. Plan order would bind WHERE first
|
|
127
|
+
-- (=7, no row) → [].
|
|
128
|
+
-- params: [7, 2]
|
|
129
|
+
select val + ? as boosted from bp where id = ?;
|
|
130
|
+
→ [{"boosted":27}]
|
|
131
|
+
|
|
132
|
+
-- Projection `?` mixed with a FROM/WHERE `in (?, ?)` — mirrors the codec import/
|
|
133
|
+
-- export shape (a TVF/aggregate projection arg preceding WHERE-list args). Text
|
|
134
|
+
-- order: tag `?`='T', then the in-list `?`s = 1, 3.
|
|
135
|
+
-- params: ["T", 1, 3]
|
|
136
|
+
select ? as tag, id from bp where id in (?, ?) order by id;
|
|
137
|
+
→ [{"tag":"T","id":1},{"tag":"T","id":3}]
|
|
138
|
+
|
|
139
|
+
-- Function call
|
|
140
|
+
-- params: ["alp"]
|
|
141
|
+
select id from bp where name like ? || '%';
|
|
142
|
+
→ [{"id":1}]
|
|
143
|
+
|
|
144
|
+
-- CASE expression
|
|
145
|
+
-- params: [2]
|
|
146
|
+
select case when id = ? then 'match' else 'miss' end as r from bp order by id;
|
|
147
|
+
→ [{"r":"miss"},{"r":"match"},{"r":"miss"},{"r":"miss"}]
|
|
148
|
+
|
|
149
|
+
-- IN list with multiple parameters
|
|
150
|
+
-- params: [1, 3]
|
|
151
|
+
select id from bp where id in (?, ?) order by id;
|
|
152
|
+
→ [{"id":1},{"id":3}]
|
|
153
|
+
|
|
154
|
+
-- ===================================
|
|
155
|
+
-- Single-placeholder IN over the PK
|
|
156
|
+
-- ===================================
|
|
157
|
+
-- Regression: `col in (?)` with exactly one placeholder over an indexed/PK column
|
|
158
|
+
-- reduced to a point-seek on Literal(undefined) and degraded to a full-index walk,
|
|
159
|
+
-- so the predicate silently matched (and, for DELETE, wiped) every row. It must
|
|
160
|
+
-- match exactly the bound row. See quereus-single-element-in-list-matches-all.
|
|
161
|
+
|
|
162
|
+
-- params: [2]
|
|
163
|
+
select id from bp where id in (?) order by id;
|
|
164
|
+
→ [{"id":2}]
|
|
165
|
+
|
|
166
|
+
-- Re-bound with a different value (the placeholder must not be constant-folded)
|
|
167
|
+
-- params: [3]
|
|
168
|
+
select id from bp where id in (?) order by id;
|
|
169
|
+
→ [{"id":3}]
|
|
170
|
+
|
|
171
|
+
-- One-, two-, three-placeholder IN and `= ?` agree on the bound rows
|
|
172
|
+
-- params: [1]
|
|
173
|
+
select id from bp where id = ? order by id;
|
|
174
|
+
→ [{"id":1}]
|
|
175
|
+
|
|
176
|
+
-- params: [1, 4]
|
|
177
|
+
select id from bp where id in (?, ?) order by id;
|
|
178
|
+
→ [{"id":1},{"id":4}]
|
|
179
|
+
|
|
180
|
+
-- params: [1, 2, 4]
|
|
181
|
+
select id from bp where id in (?, ?, ?) order by id;
|
|
182
|
+
→ [{"id":1},{"id":2},{"id":4}]
|
|
183
|
+
|
|
184
|
+
-- A non-matching single placeholder matches nothing (not everything)
|
|
185
|
+
-- params: [99]
|
|
186
|
+
select id from bp where id in (?) order by id;
|
|
187
|
+
→ []
|
|
188
|
+
|
|
189
|
+
-- ===================================
|
|
190
|
+
-- Parameter in LIMIT / OFFSET
|
|
191
|
+
-- ===================================
|
|
192
|
+
|
|
193
|
+
-- params: [2]
|
|
194
|
+
select id from bp order by id limit ?;
|
|
195
|
+
→ [{"id":1},{"id":2}]
|
|
196
|
+
|
|
197
|
+
-- params: [2, 1]
|
|
198
|
+
select id from bp order by id limit ? offset ?;
|
|
199
|
+
→ [{"id":2},{"id":3}]
|
|
200
|
+
|
|
201
|
+
-- ===================================
|
|
202
|
+
-- Repeated execution with different parameter values
|
|
203
|
+
-- ===================================
|
|
204
|
+
-- Same prepared shape, different bind values — verifies parameters are
|
|
205
|
+
-- not constant-folded into the plan.
|
|
206
|
+
|
|
207
|
+
-- params: [1]
|
|
208
|
+
select val from bp where id = ?;
|
|
209
|
+
→ [{"val":10}]
|
|
210
|
+
|
|
211
|
+
-- params: [2]
|
|
212
|
+
select val from bp where id = ?;
|
|
213
|
+
→ [{"val":20}]
|
|
214
|
+
|
|
215
|
+
-- params: [99]
|
|
216
|
+
select val from bp where id = ?;
|
|
217
|
+
→ []
|
|
218
|
+
|
|
219
|
+
-- ===================================
|
|
220
|
+
-- Cleanup
|
|
221
|
+
-- ===================================
|
|
222
|
+
|
|
223
|
+
drop table bp;
|