@quereus/quereus 4.20.1 → 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/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,382 @@
|
|
|
1
|
+
-- json-structural-equality.sqllogic
|
|
2
|
+
-- Comparing a JSON column against SQL text must agree with the JSON value comparator
|
|
3
|
+
-- and with the index: whitespace and object key order are irrelevant, array element
|
|
4
|
+
-- order is significant (ticket bug-json-equality-not-structural). The text operand is
|
|
5
|
+
-- coerced to JSON at plan time (insertCrossTypeCoercion), so `=`, `<`/`>`, BETWEEN and
|
|
6
|
+
-- IN all route through JSON_TYPE.compare.
|
|
7
|
+
-- No `using memory`, so store mode exercises the persisted byte-key path too.
|
|
8
|
+
|
|
9
|
+
-- ===================================
|
|
10
|
+
-- 1. Unindexed JSON column: text literal on the right
|
|
11
|
+
-- ===================================
|
|
12
|
+
create table jse_t (id integer primary key, v json);
|
|
13
|
+
insert into jse_t values (1, '{"a":1,"b":2}'), (2, '[1,2,3]'), (3, '"hello"'), (4, '42');
|
|
14
|
+
-- run
|
|
15
|
+
|
|
16
|
+
-- Byte-identical text matches (this was false before the fix — the stored value is a
|
|
17
|
+
-- native object and the literal a string, so the storage classes never met).
|
|
18
|
+
select id from jse_t where v = '{"a":1,"b":2}';
|
|
19
|
+
→ [{"id":1}]
|
|
20
|
+
|
|
21
|
+
-- Differently spaced, same document.
|
|
22
|
+
select id from jse_t where v = '{ "a" : 1 , "b" : 2 }';
|
|
23
|
+
→ [{"id":1}]
|
|
24
|
+
|
|
25
|
+
-- Reordered keys, same document.
|
|
26
|
+
select id from jse_t where v = '{"b":2,"a":1}';
|
|
27
|
+
→ [{"id":1}]
|
|
28
|
+
|
|
29
|
+
-- Array element order stays significant.
|
|
30
|
+
select id from jse_t where v = '[1,2,3]';
|
|
31
|
+
→ [{"id":2}]
|
|
32
|
+
|
|
33
|
+
select id from jse_t where v = '[3,2,1]';
|
|
34
|
+
→ []
|
|
35
|
+
|
|
36
|
+
-- Text on the LEFT works identically — the coercion is symmetric.
|
|
37
|
+
select id from jse_t where '{"b":2,"a":1}' = v;
|
|
38
|
+
→ [{"id":1}]
|
|
39
|
+
|
|
40
|
+
-- `!=` is the complement, not an error.
|
|
41
|
+
select id from jse_t where v <> '{"b":2,"a":1}' order by id;
|
|
42
|
+
→ [{"id":2},{"id":3},{"id":4}]
|
|
43
|
+
|
|
44
|
+
-- ===================================
|
|
45
|
+
-- 2. Text that is not valid JSON is FALSE, never an error
|
|
46
|
+
-- ===================================
|
|
47
|
+
-- CAST to JSON is lenient: a parse failure yields NULL, except where the JSON type
|
|
48
|
+
-- itself still accepts the operand — a bare string is a valid JSON string scalar, so
|
|
49
|
+
-- it survives the cast and the comparison is simply unequal rather than an error.
|
|
50
|
+
select id from jse_t where v = 'not json';
|
|
51
|
+
→ []
|
|
52
|
+
|
|
53
|
+
select count(*) as c from jse_t where v = '{unclosed';
|
|
54
|
+
→ [{"c":0}]
|
|
55
|
+
|
|
56
|
+
-- An operand the JSON type rejects outright (a blob is a JSON value under no
|
|
57
|
+
-- reading) casts to NULL, so the comparison is UNKNOWN rather than false: `<>`
|
|
58
|
+
-- yields no rows either, where a text operand's `<>` yields every row.
|
|
59
|
+
select count(*) as c from jse_t where v = x'0102';
|
|
60
|
+
→ [{"c":0}]
|
|
61
|
+
|
|
62
|
+
select count(*) as c from jse_t where v <> x'0102';
|
|
63
|
+
→ [{"c":0}]
|
|
64
|
+
|
|
65
|
+
select count(*) as c from jse_t where v <> 'not json';
|
|
66
|
+
→ [{"c":4}]
|
|
67
|
+
|
|
68
|
+
-- SQL NULL on either side stays UNKNOWN (no rows), not an error.
|
|
69
|
+
select count(*) as c from jse_t where v = null;
|
|
70
|
+
→ [{"c":0}]
|
|
71
|
+
|
|
72
|
+
-- ===================================
|
|
73
|
+
-- 3. JSON scalars
|
|
74
|
+
-- ===================================
|
|
75
|
+
-- A JSON number scalar matches both its JSON source text and a bare SQL number.
|
|
76
|
+
select id from jse_t where v = '42';
|
|
77
|
+
→ [{"id":4}]
|
|
78
|
+
|
|
79
|
+
select id from jse_t where v = 42;
|
|
80
|
+
→ [{"id":4}]
|
|
81
|
+
|
|
82
|
+
-- A JSON string scalar matches its quoted JSON source...
|
|
83
|
+
select id from jse_t where v = '"hello"';
|
|
84
|
+
→ [{"id":3}]
|
|
85
|
+
|
|
86
|
+
-- ...and also the bare text: 'hello' is not valid JSON, so the lenient cast leaves it
|
|
87
|
+
-- as the raw string, and JSON_TYPE.compare compares two string scalars as text. Pinned
|
|
88
|
+
-- deliberately — the quoted form is the one that generalizes to non-string documents.
|
|
89
|
+
select id from jse_t where v = 'hello';
|
|
90
|
+
→ [{"id":3}]
|
|
91
|
+
|
|
92
|
+
-- ===================================
|
|
93
|
+
-- 4. Ordering: <, >, BETWEEN
|
|
94
|
+
-- ===================================
|
|
95
|
+
-- JSON type rank is null < boolean < number < string < array < object, so the number
|
|
96
|
+
-- 42 sorts below the string scalar and the containers sort above it.
|
|
97
|
+
select id from jse_t where v < '"hello"' order by id;
|
|
98
|
+
→ [{"id":4}]
|
|
99
|
+
|
|
100
|
+
select id from jse_t where v > '"hello"' order by id;
|
|
101
|
+
→ [{"id":1},{"id":2}]
|
|
102
|
+
|
|
103
|
+
-- BETWEEN routes both bounds through the same coercion.
|
|
104
|
+
create table jse_b (id integer primary key, v json);
|
|
105
|
+
insert into jse_b values (1, '{"a":1}');
|
|
106
|
+
-- run
|
|
107
|
+
|
|
108
|
+
select id from jse_b where v between '{"a":0}' and '{"a":2}';
|
|
109
|
+
→ [{"id":1}]
|
|
110
|
+
|
|
111
|
+
select id from jse_b where v between '{"a":2}' and '{"a":9}';
|
|
112
|
+
→ []
|
|
113
|
+
|
|
114
|
+
-- ===================================
|
|
115
|
+
-- 5. IN value list
|
|
116
|
+
-- ===================================
|
|
117
|
+
select id from jse_t where v in ('{ "b" : 2 , "a" : 1 }');
|
|
118
|
+
→ [{"id":1}]
|
|
119
|
+
|
|
120
|
+
select id from jse_t where v in ('[1,2,3]', '{"b":2,"a":1}') order by id;
|
|
121
|
+
→ [{"id":1},{"id":2}]
|
|
122
|
+
|
|
123
|
+
select id from jse_t where v in ('{"z":26}');
|
|
124
|
+
→ []
|
|
125
|
+
|
|
126
|
+
-- A non-JSON entry in the list is inert, not an error.
|
|
127
|
+
select id from jse_t where v in ('not json', '{"a":1,"b":2}');
|
|
128
|
+
→ [{"id":1}]
|
|
129
|
+
|
|
130
|
+
-- ===================================
|
|
131
|
+
-- 5.1 IN subquery
|
|
132
|
+
-- ===================================
|
|
133
|
+
-- A subquery right-hand side has no fixed operand list to wrap at plan time, so the
|
|
134
|
+
-- text→JSON conversion happens PER ROW inside membership evaluation
|
|
135
|
+
-- (`inMembershipKeys`, runtime/emit/subquery.ts). Only the non-JSON side converts, so a
|
|
136
|
+
-- JSON string scalar is never re-parsed. A *correlated* form is decorrelated into a semi
|
|
137
|
+
-- join, whose synthesized `=` carries the same conversion
|
|
138
|
+
-- (`extractInCorrelation` in rule-subquery-decorrelation.ts).
|
|
139
|
+
create table jse_txt (id integer primary key, s text);
|
|
140
|
+
insert into jse_txt values (1, '{ "b" : 2 , "a" : 1 }'), (2, 'not json');
|
|
141
|
+
-- run
|
|
142
|
+
|
|
143
|
+
-- Uncorrelated (set-probe path): agrees with `=`, spelling irrelevant.
|
|
144
|
+
select id from jse_t where v in (select s from jse_txt);
|
|
145
|
+
→ [{"id":1}]
|
|
146
|
+
|
|
147
|
+
-- Reverse direction: a TEXT probe against a JSON subquery. "Either side is JSON coerces
|
|
148
|
+
-- the other" holds here too — the probe converts, the members do not.
|
|
149
|
+
select t.id from jse_txt t where t.s in (select v from jse_t);
|
|
150
|
+
→ [{"id":1}]
|
|
151
|
+
|
|
152
|
+
-- Correlated (decorrelated to a semi join; the coercion rides in the join residual).
|
|
153
|
+
select j.id from jse_t j where j.v in (select t.s from jse_txt t where t.id = j.id);
|
|
154
|
+
→ [{"id":1}]
|
|
155
|
+
|
|
156
|
+
-- Correlated in the REVERSE direction (TEXT outer, JSON inner). Same rewrite, but now it
|
|
157
|
+
-- is the OUTER operand `coerceObjectPhysicalSet` wraps — the probe-side branch of the
|
|
158
|
+
-- decorrelation coercion, which the forward case above never exercises.
|
|
159
|
+
select t.id from jse_txt t where t.s in (select j.v from jse_t j where j.id = t.id);
|
|
160
|
+
→ [{"id":1}]
|
|
161
|
+
|
|
162
|
+
-- SELECT-list position: an undeclared column is NOT NULL in this engine, so both sides
|
|
163
|
+
-- are non-nullable and the existence-flag LEFT JOIN arm (decorrelateExistsInProjection)
|
|
164
|
+
-- fires. Its join condition carries the same synthesized `v = cast(s as json)`, verified
|
|
165
|
+
-- against the rendered plan.
|
|
166
|
+
select j.id, (j.v in (select t.s from jse_txt t where t.id = j.id)) as m from jse_t j order by j.id;
|
|
167
|
+
→ [{"id":1,"m":true},{"id":2,"m":false},{"id":3,"m":false},{"id":4,"m":false}]
|
|
168
|
+
|
|
169
|
+
-- Same shape over a NULLABLE JSON column: the flag is two-valued, so the rewrite
|
|
170
|
+
-- declines and the conjunct stays on emitIn's correlated STREAMING arm — the third of
|
|
171
|
+
-- the three subquery source paths, and the one place a NULL probe short-circuits.
|
|
172
|
+
create table jse_jn (id integer primary key, v json null);
|
|
173
|
+
insert into jse_jn values (1, '{"a":1,"b":2}'), (2, null);
|
|
174
|
+
-- run
|
|
175
|
+
|
|
176
|
+
select j.id, (j.v in (select t.s from jse_txt t where t.id = j.id)) as m from jse_jn j order by j.id;
|
|
177
|
+
→ [{"id":1,"m":true},{"id":2,"m":null}]
|
|
178
|
+
|
|
179
|
+
-- Array element order stays significant.
|
|
180
|
+
select id from jse_t where v in (select '[3,2,1]');
|
|
181
|
+
→ []
|
|
182
|
+
|
|
183
|
+
select id from jse_t where v in (select '[1,2,3]');
|
|
184
|
+
→ [{"id":2}]
|
|
185
|
+
|
|
186
|
+
-- A non-JSON inner value is inert, not an error: it survives the lenient cast as a plain
|
|
187
|
+
-- string, which no JSON document in jse_t equals.
|
|
188
|
+
select count(*) as c from jse_t where v in (select s from jse_txt where id = 2);
|
|
189
|
+
→ [{"c":0}]
|
|
190
|
+
|
|
191
|
+
-- Both sides JSON keeps working — regression guard on the untouched (identity) arm.
|
|
192
|
+
-- This is also the one shape here that still decorrelates: agreeing semantic orderings
|
|
193
|
+
-- let extractUncorrelatedIn through, so the plan is a SEMI HASH JOIN, not a set probe.
|
|
194
|
+
create table jse_j2 (id integer primary key, v json);
|
|
195
|
+
insert into jse_j2 values (1, '{ "b" : 2 , "a" : 1 }'), (2, '[9]');
|
|
196
|
+
-- run
|
|
197
|
+
|
|
198
|
+
select j.id from jse_t j where j.v in (select k.v from jse_j2 k);
|
|
199
|
+
→ [{"id":1}]
|
|
200
|
+
|
|
201
|
+
-- Two spellings of one document are ONE member of the probe set (duplicate BTree insert
|
|
202
|
+
-- is a no-op). Note IN is a membership test, so the row count alone would be 1 either
|
|
203
|
+
-- way; what this pins is that a multi-row, mixed-spelling inner still matches.
|
|
204
|
+
select count(*) as c from jse_t
|
|
205
|
+
where v in (select '{"a":1,"b":2}' as x union all select '{ "b":2, "a":1 }');
|
|
206
|
+
→ [{"c":1}]
|
|
207
|
+
|
|
208
|
+
-- A value the JSON type rejects outright (a blob) coerces to NULL, so membership is
|
|
209
|
+
-- UNKNOWN rather than false: neither IN nor NOT IN yields a row.
|
|
210
|
+
create table jse_blob (id integer primary key, b blob);
|
|
211
|
+
insert into jse_blob values (1, x'0102');
|
|
212
|
+
-- run
|
|
213
|
+
|
|
214
|
+
select count(*) as c from jse_t where v in (select b from jse_blob);
|
|
215
|
+
→ [{"c":0}]
|
|
216
|
+
|
|
217
|
+
select count(*) as c from jse_t where v not in (select b from jse_blob);
|
|
218
|
+
→ [{"c":0}]
|
|
219
|
+
|
|
220
|
+
-- Inner NULL keeps three-valued logic: a hit is still TRUE, a miss becomes UNKNOWN.
|
|
221
|
+
create table jse_null (id integer primary key, s text null);
|
|
222
|
+
insert into jse_null values (1, '{ "b" : 2 , "a" : 1 }'), (2, null);
|
|
223
|
+
-- run
|
|
224
|
+
|
|
225
|
+
select id from jse_t where v in (select s from jse_null);
|
|
226
|
+
→ [{"id":1}]
|
|
227
|
+
|
|
228
|
+
select id from jse_t where v not in (select s from jse_null);
|
|
229
|
+
→ []
|
|
230
|
+
|
|
231
|
+
-- NOT IN over a NULL-free inner is the plain complement: the coerced member excludes its
|
|
232
|
+
-- own row and nothing else. (The two NOT IN cases above both land on UNKNOWN, so neither
|
|
233
|
+
-- pins the FALSE-becomes-TRUE direction of the negation.)
|
|
234
|
+
select id from jse_t where v not in (select s from jse_txt where id = 1) order by id;
|
|
235
|
+
→ [{"id":2},{"id":3},{"id":4}]
|
|
236
|
+
|
|
237
|
+
-- The impure arm (a DML-with-RETURNING inner) drains rather than short-circuiting, and
|
|
238
|
+
-- coerces its drained rows the same way. `count(*)` on the sink pins that the drain still
|
|
239
|
+
-- covers every row past the match.
|
|
240
|
+
create table jse_log (s text);
|
|
241
|
+
-- run
|
|
242
|
+
|
|
243
|
+
select cast('{"b":2,"a":1}' as json) in (insert into jse_log values ('{ "a" : 1 , "b" : 2 }'), ('nope') returning s) as found;
|
|
244
|
+
→ [{"found":true}]
|
|
245
|
+
|
|
246
|
+
select count(*) as c from jse_log;
|
|
247
|
+
→ [{"c":2}]
|
|
248
|
+
|
|
249
|
+
-- ===================================
|
|
250
|
+
-- 5.2 The numeric ↔ textual pairing takes the SAME route
|
|
251
|
+
-- ===================================
|
|
252
|
+
-- `int_col in ('1')` is true, exactly as `int_col = '1'` is
|
|
253
|
+
-- (bug-numeric-text-coercion-skips-in-and-case). The value list is reconciled at plan
|
|
254
|
+
-- time, the subquery forms at membership-evaluation time, and the decorrelating rewrite
|
|
255
|
+
-- declines to the set probe — three routes that must land on one answer.
|
|
256
|
+
create table jse_num (id integer primary key, n integer);
|
|
257
|
+
insert into jse_num values (1, 1), (2, 2);
|
|
258
|
+
create table jse_numtxt (id integer primary key, s text);
|
|
259
|
+
insert into jse_numtxt values (1, '1'), (2, '2');
|
|
260
|
+
-- run
|
|
261
|
+
|
|
262
|
+
select id from jse_num where n in ('1');
|
|
263
|
+
→ [{"id":1}]
|
|
264
|
+
|
|
265
|
+
-- Both decorrelation arms now reconcile their synthesized `=` the way a hand-written one
|
|
266
|
+
-- is: the uncorrelated arm's cast wrapper fails the equi-pair gate and falls back to the
|
|
267
|
+
-- set probe, the correlated arm keeps the cast in the join's residual.
|
|
268
|
+
select id from jse_num where n in (select s from jse_numtxt);
|
|
269
|
+
→ [{"id":1},{"id":2}]
|
|
270
|
+
|
|
271
|
+
select m.id from jse_num m where m.n in (select t.s from jse_numtxt t where t.id = m.id);
|
|
272
|
+
→ [{"id":1},{"id":2}]
|
|
273
|
+
|
|
274
|
+
-- These two DO reach emitIn's membership evaluation — a non-column left side and a
|
|
275
|
+
-- projection-position IN both decline decorrelation — so they are what actually pins
|
|
276
|
+
-- `inMembershipKeys`' numeric ↔ textual arm.
|
|
277
|
+
select id from jse_num where n + 0 in (select s from jse_numtxt);
|
|
278
|
+
→ [{"id":1},{"id":2}]
|
|
279
|
+
|
|
280
|
+
select id, (n in (select s from jse_numtxt)) as m from jse_num order by id;
|
|
281
|
+
→ [{"id":1,"m":true},{"id":2,"m":true}]
|
|
282
|
+
|
|
283
|
+
-- ===================================
|
|
284
|
+
-- 6. The same set with a UNIQUE index on the JSON column
|
|
285
|
+
-- ===================================
|
|
286
|
+
-- Lives in 06.9.2.1-json-structural-equality-index: the indexed answers and the
|
|
287
|
+
-- structural UNIQUE enforcement need a standalone `create unique index`.
|
|
288
|
+
|
|
289
|
+
-- ===================================
|
|
290
|
+
-- 7. Cross-column: a TEXT column compared against a JSON column
|
|
291
|
+
-- ===================================
|
|
292
|
+
-- Behavior change, made explicit: "one side is JSON" coerces the other side, so a text
|
|
293
|
+
-- column holding JSON source now matches structurally where it was always false.
|
|
294
|
+
-- (`jse_txt` is created in § 5.1 above, which needs it first.)
|
|
295
|
+
select t.id as tid, j.id as jid from jse_txt t join jse_t j on t.s = j.v;
|
|
296
|
+
→ [{"tid":1,"jid":1}]
|
|
297
|
+
|
|
298
|
+
select t.id as tid, j.id as jid from jse_txt t join jse_t j on j.v = t.s;
|
|
299
|
+
→ [{"tid":1,"jid":1}]
|
|
300
|
+
|
|
301
|
+
-- ===================================
|
|
302
|
+
-- 8. A TEXT column retyped to JSON answers exactly as a native JSON column does
|
|
303
|
+
-- ===================================
|
|
304
|
+
create table jse_re (id integer primary key, v text);
|
|
305
|
+
insert into jse_re values (1, '{"a":1}');
|
|
306
|
+
-- run
|
|
307
|
+
|
|
308
|
+
alter table jse_re alter column v set data type json;
|
|
309
|
+
-- run
|
|
310
|
+
|
|
311
|
+
select id from jse_re where v = '{ "a" : 1 }';
|
|
312
|
+
→ [{"id":1}]
|
|
313
|
+
|
|
314
|
+
-- The indexed half of this check (same retype, then `create unique index`) lives in
|
|
315
|
+
-- 06.9.2.1-json-structural-equality-index § 2.
|
|
316
|
+
|
|
317
|
+
-- ===================================
|
|
318
|
+
-- 9. Two DIFFERENT JSON comparisons in one statement stay different
|
|
319
|
+
-- ===================================
|
|
320
|
+
-- Every object literal used to fingerprint as '[object Object]'
|
|
321
|
+
-- (analysis/expression-fingerprint.ts), so scalar CSE folded these two comparisons
|
|
322
|
+
-- into one and evaluated only the first: the AND matched row 1 and the OR missed
|
|
323
|
+
-- row 2. Reachable through `json(...)` before this file existed, and through a
|
|
324
|
+
-- plain text literal after the coercion landed.
|
|
325
|
+
create table jse_cse (id integer primary key, v json);
|
|
326
|
+
insert into jse_cse values (1, '{"a":1}'), (2, '{"a":2}');
|
|
327
|
+
-- run
|
|
328
|
+
|
|
329
|
+
select id from jse_cse where v = '{"a":1}' and v = '{"a":2}';
|
|
330
|
+
→ []
|
|
331
|
+
|
|
332
|
+
select id from jse_cse where v = json('{"a":1}') and v = json('{"a":2}');
|
|
333
|
+
→ []
|
|
334
|
+
|
|
335
|
+
select id from jse_cse where v = '{"a":1}' or v = '{"a":2}' order by id;
|
|
336
|
+
→ [{"id":1},{"id":2}]
|
|
337
|
+
|
|
338
|
+
-- Reorder-equal literals ARE the same value, so folding them is correct.
|
|
339
|
+
select id from jse_cse where v = '{"a":1}' and v = '{ "a" : 1 }';
|
|
340
|
+
→ [{"id":1}]
|
|
341
|
+
|
|
342
|
+
select id, (v = '{"a":1}') as p, (v = '{"a":2}') as q from jse_cse order by id;
|
|
343
|
+
→ [{"id":1,"p":true,"q":false},{"id":2,"p":false,"q":true}]
|
|
344
|
+
|
|
345
|
+
-- ===================================
|
|
346
|
+
-- 10. A simple CASE compares its base structurally, like `=` does
|
|
347
|
+
-- ===================================
|
|
348
|
+
select id, case v when '{ "a" : 1 }' then 'one' when '{"a":2}' then 'two' else 'miss' end as r
|
|
349
|
+
from jse_cse order by id;
|
|
350
|
+
→ [{"id":1,"r":"one"},{"id":2,"r":"two"}]
|
|
351
|
+
|
|
352
|
+
-- ===================================
|
|
353
|
+
-- 11. Identity sites are unchanged — GROUP BY / DISTINCT were already structural
|
|
354
|
+
-- ===================================
|
|
355
|
+
select count(*) as groups from (select v from jse_t group by v);
|
|
356
|
+
→ [{"groups":4}]
|
|
357
|
+
|
|
358
|
+
select count(*) as c from (select distinct v from jse_t);
|
|
359
|
+
→ [{"c":4}]
|
|
360
|
+
|
|
361
|
+
-- ===================================
|
|
362
|
+
-- 12. min/max rank structurally, agreeing with ORDER BY (docs/types.md
|
|
363
|
+
-- "Semantic ordering"). Canonical-text order would report mn=[10], mx=[9].
|
|
364
|
+
-- ===================================
|
|
365
|
+
create table jse_mm (id integer primary key, d json);
|
|
366
|
+
insert into jse_mm values (1, '[8,1]'), (2, '[9]'), (3, '[10]');
|
|
367
|
+
-- run
|
|
368
|
+
|
|
369
|
+
select id, d from jse_mm order by d;
|
|
370
|
+
→ [{"id":1,"d":[8,1]},{"id":2,"d":[9]},{"id":3,"d":[10]}]
|
|
371
|
+
|
|
372
|
+
select min(d) as mn, max(d) as mx from jse_mm;
|
|
373
|
+
→ [{"mn":[8,1],"mx":[10]}]
|
|
374
|
+
|
|
375
|
+
-- DISTINCT agrees with the plain form.
|
|
376
|
+
select min(distinct d) as mn, max(distinct d) as mx from jse_mm;
|
|
377
|
+
→ [{"mn":[8,1],"mx":[10]}]
|
|
378
|
+
|
|
379
|
+
-- GROUP BY shape (hash aggregate) reaches the same bound comparator: group 1
|
|
380
|
+
-- holds [8,1] and [10], whose structural and canonical-text orders disagree.
|
|
381
|
+
select id % 2 as g, min(d) as mn, max(d) as mx from jse_mm group by id % 2 order by g;
|
|
382
|
+
→ [{"g":0,"mn":[9],"mx":[9]},{"g":1,"mn":[8,1],"mx":[10]}]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
-- 06.9.2.1-json-structural-equality-index.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 06.9.2-json-structural-equality: ten of that file's twelve sections
|
|
6
|
+
-- compare a JSON column against SQL text with no index in sight (plan-time coercion,
|
|
7
|
+
-- ordering, IN lists, cross-column joins, CSE fingerprints). These two sections put a
|
|
8
|
+
-- standalone `create unique index` over the JSON column, so they move here and leave
|
|
9
|
+
-- the coercion coverage runnable on a backend without first-class CREATE INDEX.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: an INDEXED JSON column answers `=`, `in` and BETWEEN identically to the
|
|
12
|
+
-- unindexed one, and the index enforces uniqueness by structure — including after a
|
|
13
|
+
-- text column is retyped to JSON.
|
|
14
|
+
-- No `using memory`, so store mode exercises the persisted byte-key path too.
|
|
15
|
+
|
|
16
|
+
-- ===================================
|
|
17
|
+
-- 1. The same set with a UNIQUE index on the JSON column
|
|
18
|
+
-- ===================================
|
|
19
|
+
-- Before the fix, an indexed JSON column raised `Unknown literal type object` at plan
|
|
20
|
+
-- time for the forms that DID work unindexed (`= json(...)` / `= cast(... as json)`),
|
|
21
|
+
-- because the seek key was rebuilt as a LiteralNode with no type.
|
|
22
|
+
create table jse_ix (id integer primary key, v json);
|
|
23
|
+
create unique index jse_ix_v on jse_ix (v);
|
|
24
|
+
insert into jse_ix values (1, '{"a":1,"b":2}'), (2, '[1,2,3]');
|
|
25
|
+
-- run
|
|
26
|
+
|
|
27
|
+
select id from jse_ix where v = '{"a":1,"b":2}';
|
|
28
|
+
→ [{"id":1}]
|
|
29
|
+
|
|
30
|
+
select id from jse_ix where v = '{ "b" : 2 , "a" : 1 }';
|
|
31
|
+
→ [{"id":1}]
|
|
32
|
+
|
|
33
|
+
select id from jse_ix where v = json('{"b":2,"a":1}');
|
|
34
|
+
→ [{"id":1}]
|
|
35
|
+
|
|
36
|
+
select id from jse_ix where v = cast('{ "a" : 1 , "b" : 2 }' as json);
|
|
37
|
+
→ [{"id":1}]
|
|
38
|
+
|
|
39
|
+
select id from jse_ix where v in ('{"b":2,"a":1}', '[1,2,3]') order by id;
|
|
40
|
+
→ [{"id":1},{"id":2}]
|
|
41
|
+
|
|
42
|
+
-- A range over the index: the tree, `<`/`>` and BETWEEN all rank JSON documents by the
|
|
43
|
+
-- same structural compare, so the indexed answer equals the unindexed one. Ranges over a
|
|
44
|
+
-- corpus of every JSON kind (including array-valued documents) are covered in
|
|
45
|
+
-- 06.9.3-json-index-range-seek.sqllogic.
|
|
46
|
+
select id from jse_ix where v between '{"a":1,"b":1}' and '{"a":1,"b":3}';
|
|
47
|
+
→ [{"id":1}]
|
|
48
|
+
|
|
49
|
+
select id from jse_ix where v = 'not json';
|
|
50
|
+
→ []
|
|
51
|
+
|
|
52
|
+
-- The index still enforces uniqueness by structure, and `=` now agrees with it.
|
|
53
|
+
insert into jse_ix values (3, '{ "b" : 2 , "a" : 1 }');
|
|
54
|
+
-- error: UNIQUE constraint failed
|
|
55
|
+
|
|
56
|
+
-- The seek returns the stored native document, not the literal's text.
|
|
57
|
+
select v from jse_ix where v = '{"b":2,"a":1}';
|
|
58
|
+
→ [{"v":{"a":1,"b":2}}]
|
|
59
|
+
|
|
60
|
+
-- ===================================
|
|
61
|
+
-- 2. A retyped TEXT → JSON column answers the same once indexed
|
|
62
|
+
-- ===================================
|
|
63
|
+
-- The unindexed half of this retype check lives in 06.9.2 § 8; here the same column
|
|
64
|
+
-- is indexed after the retype, so the seek key is built from the NEW logical type.
|
|
65
|
+
create table jse_re (id integer primary key, v text);
|
|
66
|
+
insert into jse_re values (1, '{"a":1}');
|
|
67
|
+
-- run
|
|
68
|
+
|
|
69
|
+
alter table jse_re alter column v set data type json;
|
|
70
|
+
-- run
|
|
71
|
+
|
|
72
|
+
create unique index jse_re_v on jse_re (v);
|
|
73
|
+
-- run
|
|
74
|
+
|
|
75
|
+
select id from jse_re where v = '{ "a" : 1 }';
|
|
76
|
+
→ [{"id":1}]
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
-- json-index-range-seek.sqllogic
|
|
2
|
+
-- A range / equality / IN seek over an INDEXED json column must return exactly the
|
|
3
|
+
-- rows the same predicate returns over an UNINDEXED one (ticket
|
|
4
|
+
-- bug-json-index-range-seek-order). The defect was not an ordering disagreement:
|
|
5
|
+
-- the index tree, `<`/`>` and `order by` all rank JSON documents by the same
|
|
6
|
+
-- structural compare. The scan path recovered a key's scalar-vs-tuple shape with
|
|
7
|
+
-- `Array.isArray`, so a stored document that IS a JS array (`[1]`, `[null]`) was
|
|
8
|
+
-- misread as a composite key tuple and every bound / prefix / NULL check compared
|
|
9
|
+
-- against its first element.
|
|
10
|
+
--
|
|
11
|
+
-- requires-capability: standalone-index-ddl
|
|
12
|
+
--
|
|
13
|
+
-- Every query below is asserted against BOTH tables with the SAME expected rows,
|
|
14
|
+
-- and the expectations agree with the `order by v` sequence at the end of section 1.
|
|
15
|
+
-- No `using memory`, so store mode runs this too (the store encodes JSON key members
|
|
16
|
+
-- structurally and never had the defect — this pins that the two modules agree).
|
|
17
|
+
|
|
18
|
+
-- ===================================
|
|
19
|
+
-- 1. Single-column index over a mixed JSON corpus
|
|
20
|
+
-- ===================================
|
|
21
|
+
-- The corpus spans every JSON kind, in structural rank order (null < boolean <
|
|
22
|
+
-- number < string < array < object) plus the shapes that specifically broke:
|
|
23
|
+
-- `[]` (empty array), `[1]` (single-element — read as the tuple `(1)`), `[null]`
|
|
24
|
+
-- (read as a NULL-bearing tuple, so equality returned nothing), `[9,9]`, and a
|
|
25
|
+
-- nested array. `g` exists only for the composite index in section 3.
|
|
26
|
+
create table jrs_n (id integer primary key, g integer, v json);
|
|
27
|
+
create table jrs_i (id integer primary key, g integer, v json);
|
|
28
|
+
create index jrs_i_v on jrs_i (v);
|
|
29
|
+
insert into jrs_n values
|
|
30
|
+
(1, 1, 'false'), (2, 1, 'true'),
|
|
31
|
+
(3, 1, '-1'), (4, 1, '5'), (5, 1, '2.5'),
|
|
32
|
+
(6, 1, '"a"'), (7, 1, '"z"'),
|
|
33
|
+
(8, 1, '[]'), (9, 1, '[1]'), (10, 1, '[null]'), (11, 1, '[9,9]'), (12, 1, '[[1,2],[3]]'),
|
|
34
|
+
(13, 1, '{}'), (14, 1, '{"a":1}'), (15, 1, '{"a":2}'), (16, 1, '{"a":10}'), (17, 1, '{"b":1}'),
|
|
35
|
+
(18, 2, '[1]'), (19, 2, '{"a":1}'), (20, 2, '5');
|
|
36
|
+
insert into jrs_i select * from jrs_n;
|
|
37
|
+
-- run
|
|
38
|
+
|
|
39
|
+
-- The structural order both tables must agree with. Ties (`5` at ids 4 and 20,
|
|
40
|
+
-- `[1]` at 9 and 18, `{"a":1}` at 14 and 19) are broken by id so the row list is
|
|
41
|
+
-- deterministic.
|
|
42
|
+
select id from jrs_n order by v, id;
|
|
43
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":5},{"id":4},{"id":20},{"id":6},{"id":7},{"id":8},{"id":10},{"id":9},{"id":18},{"id":11},{"id":12},{"id":13},{"id":14},{"id":19},{"id":15},{"id":16},{"id":17}]
|
|
44
|
+
|
|
45
|
+
select id from jrs_i order by v, id;
|
|
46
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":5},{"id":4},{"id":20},{"id":6},{"id":7},{"id":8},{"id":10},{"id":9},{"id":18},{"id":11},{"id":12},{"id":13},{"id":14},{"id":19},{"id":15},{"id":16},{"id":17}]
|
|
47
|
+
|
|
48
|
+
-- ===================================
|
|
49
|
+
-- 2. Range bounds: indexed answer == unindexed answer
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- `> 5` must include every string, array and object — the arrays (8..12, 18) are
|
|
52
|
+
-- exactly what the shape sniff used to drop.
|
|
53
|
+
select id from jrs_n where v > json('5') order by id;
|
|
54
|
+
→ [{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19}]
|
|
55
|
+
|
|
56
|
+
select id from jrs_i where v > json('5') order by id;
|
|
57
|
+
→ [{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19}]
|
|
58
|
+
|
|
59
|
+
select id from jrs_n where v >= json('5') order by id;
|
|
60
|
+
→ [{"id":4},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19},{"id":20}]
|
|
61
|
+
|
|
62
|
+
select id from jrs_i where v >= json('5') order by id;
|
|
63
|
+
→ [{"id":4},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19},{"id":20}]
|
|
64
|
+
|
|
65
|
+
select id from jrs_n where v < json('"a"') order by id;
|
|
66
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":20}]
|
|
67
|
+
|
|
68
|
+
select id from jrs_i where v < json('"a"') order by id;
|
|
69
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":20}]
|
|
70
|
+
|
|
71
|
+
-- An ARRAY as the bound: `<= [1]` stops just after the two `[1]` rows, and `[null]`
|
|
72
|
+
-- (id 10) sorts BELOW `[1]` because element-wise null < number.
|
|
73
|
+
select id from jrs_n where v <= json('[1]') order by id;
|
|
74
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":18},{"id":20}]
|
|
75
|
+
|
|
76
|
+
select id from jrs_i where v <= json('[1]') order by id;
|
|
77
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":18},{"id":20}]
|
|
78
|
+
|
|
79
|
+
-- Both bounds are arrays/objects.
|
|
80
|
+
select id from jrs_n where v > json('[1]') and v < json('{"b":1}') order by id;
|
|
81
|
+
→ [{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":19}]
|
|
82
|
+
|
|
83
|
+
select id from jrs_i where v > json('[1]') and v < json('{"b":1}') order by id;
|
|
84
|
+
→ [{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":19}]
|
|
85
|
+
|
|
86
|
+
select id from jrs_n where v between json('[1]') and json('{"a":1}') order by id;
|
|
87
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14},{"id":18},{"id":19}]
|
|
88
|
+
|
|
89
|
+
select id from jrs_i where v between json('[1]') and json('{"a":1}') order by id;
|
|
90
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14},{"id":18},{"id":19}]
|
|
91
|
+
|
|
92
|
+
-- Descending walk over the same window.
|
|
93
|
+
select id from jrs_n where v > json('5') order by v desc, id desc;
|
|
94
|
+
→ [{"id":17},{"id":16},{"id":15},{"id":19},{"id":14},{"id":13},{"id":12},{"id":11},{"id":18},{"id":9},{"id":10},{"id":8},{"id":7},{"id":6}]
|
|
95
|
+
|
|
96
|
+
select id from jrs_i where v > json('5') order by v desc, id desc;
|
|
97
|
+
→ [{"id":17},{"id":16},{"id":15},{"id":19},{"id":14},{"id":13},{"id":12},{"id":11},{"id":18},{"id":9},{"id":10},{"id":8},{"id":7},{"id":6}]
|
|
98
|
+
|
|
99
|
+
-- ===================================
|
|
100
|
+
-- 3. Equality and IN on array-valued documents
|
|
101
|
+
-- ===================================
|
|
102
|
+
-- `[null]` is the case the naive fix (bound comparison only) leaves broken: the
|
|
103
|
+
-- seek-key NULL test read the document as a tuple containing SQL NULL and returned
|
|
104
|
+
-- no rows at all.
|
|
105
|
+
select id from jrs_n where v = json('[null]') order by id;
|
|
106
|
+
→ [{"id":10}]
|
|
107
|
+
|
|
108
|
+
select id from jrs_i where v = json('[null]') order by id;
|
|
109
|
+
→ [{"id":10}]
|
|
110
|
+
|
|
111
|
+
select id from jrs_n where v = json('[9,9]') order by id;
|
|
112
|
+
→ [{"id":11}]
|
|
113
|
+
|
|
114
|
+
select id from jrs_i where v = json('[9,9]') order by id;
|
|
115
|
+
→ [{"id":11}]
|
|
116
|
+
|
|
117
|
+
select id from jrs_n where v = json('[]') order by id;
|
|
118
|
+
→ [{"id":8}]
|
|
119
|
+
|
|
120
|
+
select id from jrs_i where v = json('[]') order by id;
|
|
121
|
+
→ [{"id":8}]
|
|
122
|
+
|
|
123
|
+
select id from jrs_n where v = json('{}') order by id;
|
|
124
|
+
→ [{"id":13}]
|
|
125
|
+
|
|
126
|
+
select id from jrs_i where v = json('{}') order by id;
|
|
127
|
+
→ [{"id":13}]
|
|
128
|
+
|
|
129
|
+
-- Multi-seek (`IN`) mixes an array-with-null, a plain array and an object.
|
|
130
|
+
select id from jrs_n where v in (json('[null]'), json('[1]'), json('{"a":10}')) order by id;
|
|
131
|
+
→ [{"id":9},{"id":10},{"id":16},{"id":18}]
|
|
132
|
+
|
|
133
|
+
select id from jrs_i where v in (json('[null]'), json('[1]'), json('{"a":10}')) order by id;
|
|
134
|
+
→ [{"id":9},{"id":10},{"id":16},{"id":18}]
|
|
135
|
+
|
|
136
|
+
-- ===================================
|
|
137
|
+
-- 4. Composite index: leading equality + trailing JSON range
|
|
138
|
+
-- ===================================
|
|
139
|
+
-- Here the index key genuinely IS a tuple, so the arity-derived shape must stay
|
|
140
|
+
-- `true` — this is the direction a fix that simply hard-coded "scalar" would break.
|
|
141
|
+
create table jrs_c (id integer primary key, g integer, v json);
|
|
142
|
+
create index jrs_c_gv on jrs_c (g, v);
|
|
143
|
+
insert into jrs_c select * from jrs_n;
|
|
144
|
+
-- run
|
|
145
|
+
|
|
146
|
+
select id from jrs_c where g = 1 and v > json('5') order by id;
|
|
147
|
+
→ [{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17}]
|
|
148
|
+
|
|
149
|
+
select id from jrs_n where g = 1 and v > json('5') order by id;
|
|
150
|
+
→ [{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17}]
|
|
151
|
+
|
|
152
|
+
select id from jrs_c where g = 2 and v >= json('[1]') order by id;
|
|
153
|
+
→ [{"id":18},{"id":19}]
|
|
154
|
+
|
|
155
|
+
select id from jrs_n where g = 2 and v >= json('[1]') order by id;
|
|
156
|
+
→ [{"id":18},{"id":19}]
|
|
157
|
+
|
|
158
|
+
select id from jrs_c where g = 1 and v between json('[1]') and json('{"a":1}') order by id;
|
|
159
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14}]
|
|
160
|
+
|
|
161
|
+
select id from jrs_n where g = 1 and v between json('[1]') and json('{"a":1}') order by id;
|
|
162
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14}]
|
|
163
|
+
|
|
164
|
+
select id from jrs_c where g = 2 and v = json('[1]') order by id;
|
|
165
|
+
→ [{"id":18}]
|
|
166
|
+
|
|
167
|
+
select id from jrs_n where g = 2 and v = json('[1]') order by id;
|
|
168
|
+
→ [{"id":18}]
|
|
169
|
+
|
|
170
|
+
-- ===================================
|
|
171
|
+
-- 5. Composite index with the JSON column LEADING
|
|
172
|
+
-- ===================================
|
|
173
|
+
-- The mirror of section 4: the key is a tuple whose FIRST component is a document.
|
|
174
|
+
-- Range bounds read that component, and an equality prefix compares a whole document
|
|
175
|
+
-- against a tuple slot — the two places a fix that mixed up the tuple view with the
|
|
176
|
+
-- document would land on the wrong value.
|
|
177
|
+
create table jrs_l (id integer primary key, g integer, v json);
|
|
178
|
+
create index jrs_l_vg on jrs_l (v, g);
|
|
179
|
+
insert into jrs_l select * from jrs_n;
|
|
180
|
+
-- run
|
|
181
|
+
|
|
182
|
+
select id from jrs_l where v > json('5') order by id;
|
|
183
|
+
→ [{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19}]
|
|
184
|
+
|
|
185
|
+
select id from jrs_l where v >= json('[1]') order by id;
|
|
186
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19}]
|
|
187
|
+
|
|
188
|
+
select id from jrs_n where v >= json('[1]') order by id;
|
|
189
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19}]
|
|
190
|
+
|
|
191
|
+
select id from jrs_l where v between json('[1]') and json('{"a":1}') order by id;
|
|
192
|
+
→ [{"id":9},{"id":11},{"id":12},{"id":13},{"id":14},{"id":18},{"id":19}]
|
|
193
|
+
|
|
194
|
+
-- Document as the equality PREFIX, integer range on the trailing column.
|
|
195
|
+
select id from jrs_l where v = json('[1]') and g > 1 order by id;
|
|
196
|
+
→ [{"id":18}]
|
|
197
|
+
|
|
198
|
+
select id from jrs_n where v = json('[1]') and g > 1 order by id;
|
|
199
|
+
→ [{"id":18}]
|
|
200
|
+
|
|
201
|
+
select id from jrs_l where v = json('[1]') and g = 1 order by id;
|
|
202
|
+
→ [{"id":9}]
|
|
203
|
+
|
|
204
|
+
select id from jrs_n where v = json('[1]') and g = 1 order by id;
|
|
205
|
+
→ [{"id":9}]
|