@quereus/quereus 0.7.2 → 0.7.4
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/package.json +3 -3
- package/dist/src/common/constants.js.map +0 -1
- package/dist/src/common/datatype.js.map +0 -1
- package/dist/src/common/errors.js.map +0 -1
- package/dist/src/common/json-types.js.map +0 -1
- package/dist/src/common/logger.js.map +0 -1
- package/dist/src/common/type-inference.js.map +0 -1
- package/dist/src/common/types.js.map +0 -1
- package/dist/src/core/database-options.js.map +0 -1
- package/dist/src/core/database.js.map +0 -1
- package/dist/src/core/param.js.map +0 -1
- package/dist/src/core/statement.js.map +0 -1
- package/dist/src/func/builtins/aggregate.js.map +0 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +0 -1
- package/dist/src/func/builtins/conversion.js.map +0 -1
- package/dist/src/func/builtins/datetime.js.map +0 -1
- package/dist/src/func/builtins/explain.js.map +0 -1
- package/dist/src/func/builtins/generation.js.map +0 -1
- package/dist/src/func/builtins/index.js.map +0 -1
- package/dist/src/func/builtins/json-helpers.js.map +0 -1
- package/dist/src/func/builtins/json-tvf.js.map +0 -1
- package/dist/src/func/builtins/json.js.map +0 -1
- package/dist/src/func/builtins/scalar.js.map +0 -1
- package/dist/src/func/builtins/schema.js.map +0 -1
- package/dist/src/func/builtins/string.js.map +0 -1
- package/dist/src/func/builtins/timespan.js.map +0 -1
- package/dist/src/func/context.js.map +0 -1
- package/dist/src/func/registration.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/parser/ast.js.map +0 -1
- package/dist/src/parser/index.js.map +0 -1
- package/dist/src/parser/lexer.js.map +0 -1
- package/dist/src/parser/parser.js.map +0 -1
- package/dist/src/parser/utils.js.map +0 -1
- package/dist/src/parser/visitor.js.map +0 -1
- package/dist/src/planner/analysis/binding-collector.js.map +0 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +0 -1
- package/dist/src/planner/analysis/const-pass.js.map +0 -1
- package/dist/src/planner/analysis/constraint-extractor.js.map +0 -1
- package/dist/src/planner/analysis/predicate-normalizer.js.map +0 -1
- package/dist/src/planner/building/alter-table.js.map +0 -1
- package/dist/src/planner/building/block.js.map +0 -1
- package/dist/src/planner/building/constraint-builder.js.map +0 -1
- package/dist/src/planner/building/create-assertion.js.map +0 -1
- package/dist/src/planner/building/create-view.js.map +0 -1
- package/dist/src/planner/building/ddl.js.map +0 -1
- package/dist/src/planner/building/declare-schema.js.map +0 -1
- package/dist/src/planner/building/delete.js.map +0 -1
- package/dist/src/planner/building/drop-assertion.js.map +0 -1
- package/dist/src/planner/building/drop-table.js.map +0 -1
- package/dist/src/planner/building/drop-view.js.map +0 -1
- package/dist/src/planner/building/expression.js.map +0 -1
- package/dist/src/planner/building/function-call.js.map +0 -1
- package/dist/src/planner/building/insert.js.map +0 -1
- package/dist/src/planner/building/pragma.js.map +0 -1
- package/dist/src/planner/building/schema-resolution.js.map +0 -1
- package/dist/src/planner/building/select-aggregates.js.map +0 -1
- package/dist/src/planner/building/select-compound.js.map +0 -1
- package/dist/src/planner/building/select-context.js.map +0 -1
- package/dist/src/planner/building/select-modifiers.js.map +0 -1
- package/dist/src/planner/building/select-projections.js.map +0 -1
- package/dist/src/planner/building/select-window.js.map +0 -1
- package/dist/src/planner/building/select.js.map +0 -1
- package/dist/src/planner/building/table-function.js.map +0 -1
- package/dist/src/planner/building/table.js.map +0 -1
- package/dist/src/planner/building/transaction.js.map +0 -1
- package/dist/src/planner/building/update.js.map +0 -1
- package/dist/src/planner/building/with.js.map +0 -1
- package/dist/src/planner/cache/correlation-detector.js.map +0 -1
- package/dist/src/planner/cache/materialization-advisory.js.map +0 -1
- package/dist/src/planner/cache/reference-graph.js.map +0 -1
- package/dist/src/planner/cost/index.js.map +0 -1
- package/dist/src/planner/debug/logger-utils.js.map +0 -1
- package/dist/src/planner/debug.js.map +0 -1
- package/dist/src/planner/framework/characteristics.js.map +0 -1
- package/dist/src/planner/framework/context.js.map +0 -1
- package/dist/src/planner/framework/pass.js.map +0 -1
- package/dist/src/planner/framework/physical-utils.js.map +0 -1
- package/dist/src/planner/framework/registry.js.map +0 -1
- package/dist/src/planner/framework/trace.js.map +0 -1
- package/dist/src/planner/nodes/add-constraint-node.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-function.js.map +0 -1
- package/dist/src/planner/nodes/aggregate-node.js.map +0 -1
- package/dist/src/planner/nodes/array-index-node.js.map +0 -1
- package/dist/src/planner/nodes/block.js.map +0 -1
- package/dist/src/planner/nodes/cache-node.js.map +0 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +0 -1
- package/dist/src/planner/nodes/create-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/create-index-node.js.map +0 -1
- package/dist/src/planner/nodes/create-table-node.js.map +0 -1
- package/dist/src/planner/nodes/create-view-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-node.js.map +0 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/declarative-schema.js.map +0 -1
- package/dist/src/planner/nodes/delete-node.js.map +0 -1
- package/dist/src/planner/nodes/distinct-node.js.map +0 -1
- package/dist/src/planner/nodes/dml-executor-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-assertion-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-table-node.js.map +0 -1
- package/dist/src/planner/nodes/drop-view-node.js.map +0 -1
- package/dist/src/planner/nodes/filter.js.map +0 -1
- package/dist/src/planner/nodes/function.js.map +0 -1
- package/dist/src/planner/nodes/insert-node.js.map +0 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +0 -1
- package/dist/src/planner/nodes/join-node.js.map +0 -1
- package/dist/src/planner/nodes/limit-offset.js.map +0 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +0 -1
- package/dist/src/planner/nodes/plan-node.js.map +0 -1
- package/dist/src/planner/nodes/pragma.js.map +0 -1
- package/dist/src/planner/nodes/project-node.js.map +0 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +0 -1
- package/dist/src/planner/nodes/reference.js.map +0 -1
- package/dist/src/planner/nodes/remote-query-node.js.map +0 -1
- package/dist/src/planner/nodes/retrieve-node.js.map +0 -1
- package/dist/src/planner/nodes/returning-node.js.map +0 -1
- package/dist/src/planner/nodes/scalar.js.map +0 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +0 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +0 -1
- package/dist/src/planner/nodes/single-row.js.map +0 -1
- package/dist/src/planner/nodes/sink-node.js.map +0 -1
- package/dist/src/planner/nodes/sort.js.map +0 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +0 -1
- package/dist/src/planner/nodes/subquery.js.map +0 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +0 -1
- package/dist/src/planner/nodes/table-function-call.js.map +0 -1
- package/dist/src/planner/nodes/transaction-node.js.map +0 -1
- package/dist/src/planner/nodes/update-node.js.map +0 -1
- package/dist/src/planner/nodes/values-node.js.map +0 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +0 -1
- package/dist/src/planner/nodes/window-function.js.map +0 -1
- package/dist/src/planner/nodes/window-node.js.map +0 -1
- package/dist/src/planner/optimizer-tuning.js.map +0 -1
- package/dist/src/planner/optimizer.js.map +0 -1
- package/dist/src/planner/planning-context.js.map +0 -1
- package/dist/src/planner/resolve.js.map +0 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +0 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +0 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +0 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +0 -1
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +0 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +0 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +0 -1
- package/dist/src/planner/scopes/aliased.js.map +0 -1
- package/dist/src/planner/scopes/base.js.map +0 -1
- package/dist/src/planner/scopes/empty.js.map +0 -1
- package/dist/src/planner/scopes/global.js.map +0 -1
- package/dist/src/planner/scopes/multi.js.map +0 -1
- package/dist/src/planner/scopes/param.js.map +0 -1
- package/dist/src/planner/scopes/registered.js.map +0 -1
- package/dist/src/planner/scopes/scope.js.map +0 -1
- package/dist/src/planner/stats/basic-estimates.js.map +0 -1
- package/dist/src/planner/stats/index.js.map +0 -1
- package/dist/src/planner/type-utils.js.map +0 -1
- package/dist/src/planner/util/key-utils.js.map +0 -1
- package/dist/src/planner/validation/determinism-validator.js.map +0 -1
- package/dist/src/planner/validation/plan-validator.js.map +0 -1
- package/dist/src/runtime/async-util.js.map +0 -1
- package/dist/src/runtime/cache/shared-cache.js.map +0 -1
- package/dist/src/runtime/context-helpers.js.map +0 -1
- package/dist/src/runtime/deferred-constraint-queue.js.map +0 -1
- package/dist/src/runtime/emission-context.js.map +0 -1
- package/dist/src/runtime/emit/add-constraint.js.map +0 -1
- package/dist/src/runtime/emit/aggregate.js.map +0 -1
- package/dist/src/runtime/emit/array-index.js.map +0 -1
- package/dist/src/runtime/emit/between.js.map +0 -1
- package/dist/src/runtime/emit/binary.js.map +0 -1
- package/dist/src/runtime/emit/block.js.map +0 -1
- package/dist/src/runtime/emit/cache.js.map +0 -1
- package/dist/src/runtime/emit/case.js.map +0 -1
- package/dist/src/runtime/emit/cast.js.map +0 -1
- package/dist/src/runtime/emit/collate.js.map +0 -1
- package/dist/src/runtime/emit/column-reference.js.map +0 -1
- package/dist/src/runtime/emit/constraint-check.js.map +0 -1
- package/dist/src/runtime/emit/create-assertion.js.map +0 -1
- package/dist/src/runtime/emit/create-index.js.map +0 -1
- package/dist/src/runtime/emit/create-table.js.map +0 -1
- package/dist/src/runtime/emit/create-view.js.map +0 -1
- package/dist/src/runtime/emit/cte-reference.js.map +0 -1
- package/dist/src/runtime/emit/cte.js.map +0 -1
- package/dist/src/runtime/emit/delete.js.map +0 -1
- package/dist/src/runtime/emit/distinct.js.map +0 -1
- package/dist/src/runtime/emit/dml-executor.js.map +0 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +0 -1
- package/dist/src/runtime/emit/drop-table.js.map +0 -1
- package/dist/src/runtime/emit/drop-view.js.map +0 -1
- package/dist/src/runtime/emit/filter.js.map +0 -1
- package/dist/src/runtime/emit/insert.js.map +0 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +0 -1
- package/dist/src/runtime/emit/join.js.map +0 -1
- package/dist/src/runtime/emit/limit-offset.js.map +0 -1
- package/dist/src/runtime/emit/literal.js.map +0 -1
- package/dist/src/runtime/emit/parameter.js.map +0 -1
- package/dist/src/runtime/emit/pragma.js.map +0 -1
- package/dist/src/runtime/emit/project.js.map +0 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +0 -1
- package/dist/src/runtime/emit/remote-query.js.map +0 -1
- package/dist/src/runtime/emit/retrieve.js.map +0 -1
- package/dist/src/runtime/emit/returning.js.map +0 -1
- package/dist/src/runtime/emit/scalar-function.js.map +0 -1
- package/dist/src/runtime/emit/scan.js.map +0 -1
- package/dist/src/runtime/emit/schema-declarative.js.map +0 -1
- package/dist/src/runtime/emit/sequencing.js.map +0 -1
- package/dist/src/runtime/emit/set-operation.js.map +0 -1
- package/dist/src/runtime/emit/sink.js.map +0 -1
- package/dist/src/runtime/emit/sort.js.map +0 -1
- package/dist/src/runtime/emit/subquery.js.map +0 -1
- package/dist/src/runtime/emit/table-valued-function.js.map +0 -1
- package/dist/src/runtime/emit/temporal-arithmetic.js.map +0 -1
- package/dist/src/runtime/emit/transaction.js.map +0 -1
- package/dist/src/runtime/emit/unary.js.map +0 -1
- package/dist/src/runtime/emit/update.js.map +0 -1
- package/dist/src/runtime/emit/values.js.map +0 -1
- package/dist/src/runtime/emit/window-function.js.map +0 -1
- package/dist/src/runtime/emit/window.js.map +0 -1
- package/dist/src/runtime/emitters.js.map +0 -1
- package/dist/src/runtime/register.js.map +0 -1
- package/dist/src/runtime/scheduler.js.map +0 -1
- package/dist/src/runtime/types.js.map +0 -1
- package/dist/src/runtime/utils.js.map +0 -1
- package/dist/src/schema/assertion.js.map +0 -1
- package/dist/src/schema/catalog.js.map +0 -1
- package/dist/src/schema/change-events.js.map +0 -1
- package/dist/src/schema/column.js.map +0 -1
- package/dist/src/schema/declared-schema-manager.js.map +0 -1
- package/dist/src/schema/function.js.map +0 -1
- package/dist/src/schema/manager.js.map +0 -1
- package/dist/src/schema/schema-differ.js.map +0 -1
- package/dist/src/schema/schema-hasher.js.map +0 -1
- package/dist/src/schema/schema.js.map +0 -1
- package/dist/src/schema/table.js.map +0 -1
- package/dist/src/schema/view.js.map +0 -1
- package/dist/src/schema/window-function.js.map +0 -1
- package/dist/src/types/builtin-types.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/json-type.js.map +0 -1
- package/dist/src/types/logical-type.js.map +0 -1
- package/dist/src/types/plugin-interface.js.map +0 -1
- package/dist/src/types/registry.js.map +0 -1
- package/dist/src/types/temporal-types.js.map +0 -1
- package/dist/src/types/validation.js.map +0 -1
- package/dist/src/util/affinity.js.map +0 -1
- package/dist/src/util/ast-stringify.js.map +0 -1
- package/dist/src/util/cached.js.map +0 -1
- package/dist/src/util/coercion.js.map +0 -1
- package/dist/src/util/comparison.js.map +0 -1
- package/dist/src/util/environment.js.map +0 -1
- package/dist/src/util/hash.js.map +0 -1
- package/dist/src/util/latches.js.map +0 -1
- package/dist/src/util/mutation-statement.js.map +0 -1
- package/dist/src/util/patterns.js.map +0 -1
- package/dist/src/util/plan-formatter.js.map +0 -1
- package/dist/src/util/plugin-helper.js.map +0 -1
- package/dist/src/util/row-descriptor.js.map +0 -1
- package/dist/src/util/serialization.js.map +0 -1
- package/dist/src/util/sql-literal.js.map +0 -1
- package/dist/src/util/working-table-iterable.js.map +0 -1
- package/dist/src/vtab/best-access-plan.js.map +0 -1
- package/dist/src/vtab/connection.js.map +0 -1
- package/dist/src/vtab/filter-info.js.map +0 -1
- package/dist/src/vtab/index-info.js.map +0 -1
- package/dist/src/vtab/manifest.js.map +0 -1
- package/dist/src/vtab/memory/connection.js.map +0 -1
- package/dist/src/vtab/memory/index.js.map +0 -1
- package/dist/src/vtab/memory/layer/base-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/base.js.map +0 -1
- package/dist/src/vtab/memory/layer/connection.js.map +0 -1
- package/dist/src/vtab/memory/layer/interface.js.map +0 -1
- package/dist/src/vtab/memory/layer/manager.js.map +0 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +0 -1
- package/dist/src/vtab/memory/layer/scan-plan.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +0 -1
- package/dist/src/vtab/memory/layer/transaction.js.map +0 -1
- package/dist/src/vtab/memory/module.js.map +0 -1
- package/dist/src/vtab/memory/table.js.map +0 -1
- package/dist/src/vtab/memory/types.js.map +0 -1
- package/dist/src/vtab/memory/utils/logging.js.map +0 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +0 -1
- package/dist/src/vtab/module.js.map +0 -1
- package/dist/src/vtab/table.js.map +0 -1
- package/src/common/constants.ts +0 -60
- package/src/common/datatype.ts +0 -85
- package/src/common/errors.ts +0 -189
- package/src/common/json-types.ts +0 -16
- package/src/common/logger.ts +0 -97
- package/src/common/type-inference.ts +0 -39
- package/src/common/types.ts +0 -151
- package/src/core/database-options.ts +0 -258
- package/src/core/database.ts +0 -1461
- package/src/core/param.ts +0 -56
- package/src/core/statement.ts +0 -528
- package/src/func/builtins/aggregate.ts +0 -269
- package/src/func/builtins/builtin-window-functions.ts +0 -166
- package/src/func/builtins/conversion.ts +0 -226
- package/src/func/builtins/datetime.ts +0 -500
- package/src/func/builtins/explain.ts +0 -779
- package/src/func/builtins/generation.ts +0 -43
- package/src/func/builtins/index.ts +0 -167
- package/src/func/builtins/json-helpers.ts +0 -237
- package/src/func/builtins/json-tvf.ts +0 -224
- package/src/func/builtins/json.ts +0 -588
- package/src/func/builtins/scalar.ts +0 -423
- package/src/func/builtins/schema.ts +0 -213
- package/src/func/builtins/string.ts +0 -306
- package/src/func/builtins/timespan.ts +0 -179
- package/src/func/context.ts +0 -258
- package/src/func/registration.ts +0 -201
- package/src/index.ts +0 -172
- package/src/parser/ast.ts +0 -581
- package/src/parser/index.ts +0 -65
- package/src/parser/lexer.ts +0 -806
- package/src/parser/parser.ts +0 -3352
- package/src/parser/utils.ts +0 -10
- package/src/parser/visitor.ts +0 -188
- package/src/planner/analysis/README.md +0 -93
- package/src/planner/analysis/binding-collector.ts +0 -83
- package/src/planner/analysis/const-evaluator.ts +0 -63
- package/src/planner/analysis/const-pass.ts +0 -282
- package/src/planner/analysis/constraint-extractor.ts +0 -764
- package/src/planner/analysis/predicate-normalizer.ts +0 -237
- package/src/planner/building/alter-table.ts +0 -49
- package/src/planner/building/block.ts +0 -93
- package/src/planner/building/constraint-builder.ts +0 -178
- package/src/planner/building/create-assertion.ts +0 -7
- package/src/planner/building/create-view.ts +0 -29
- package/src/planner/building/ddl.ts +0 -24
- package/src/planner/building/declare-schema.ts +0 -22
- package/src/planner/building/delete.ts +0 -218
- package/src/planner/building/drop-assertion.ts +0 -11
- package/src/planner/building/drop-table.ts +0 -13
- package/src/planner/building/drop-view.ts +0 -19
- package/src/planner/building/expression.ts +0 -205
- package/src/planner/building/function-call.ts +0 -129
- package/src/planner/building/insert.ts +0 -435
- package/src/planner/building/pragma.ts +0 -34
- package/src/planner/building/schema-resolution.ts +0 -176
- package/src/planner/building/select-aggregates.ts +0 -318
- package/src/planner/building/select-compound.ts +0 -119
- package/src/planner/building/select-context.ts +0 -85
- package/src/planner/building/select-modifiers.ts +0 -236
- package/src/planner/building/select-projections.ts +0 -177
- package/src/planner/building/select-window.ts +0 -259
- package/src/planner/building/select.ts +0 -567
- package/src/planner/building/table-function.ts +0 -49
- package/src/planner/building/table.ts +0 -40
- package/src/planner/building/transaction.ts +0 -23
- package/src/planner/building/update.ts +0 -331
- package/src/planner/building/with.ts +0 -180
- package/src/planner/cache/correlation-detector.ts +0 -83
- package/src/planner/cache/materialization-advisory.ts +0 -265
- package/src/planner/cache/reference-graph.ts +0 -196
- package/src/planner/cost/index.ts +0 -169
- package/src/planner/debug/logger-utils.ts +0 -68
- package/src/planner/debug.ts +0 -480
- package/src/planner/framework/README.md +0 -132
- package/src/planner/framework/characteristics.ts +0 -503
- package/src/planner/framework/context.ts +0 -239
- package/src/planner/framework/pass.ts +0 -354
- package/src/planner/framework/physical-utils.ts +0 -210
- package/src/planner/framework/registry.ts +0 -261
- package/src/planner/framework/trace.ts +0 -259
- package/src/planner/nodes/add-constraint-node.ts +0 -62
- package/src/planner/nodes/aggregate-function.ts +0 -155
- package/src/planner/nodes/aggregate-node.ts +0 -267
- package/src/planner/nodes/array-index-node.ts +0 -50
- package/src/planner/nodes/block.ts +0 -80
- package/src/planner/nodes/cache-node.ts +0 -103
- package/src/planner/nodes/constraint-check-node.ts +0 -138
- package/src/planner/nodes/create-assertion-node.ts +0 -51
- package/src/planner/nodes/create-index-node.ts +0 -41
- package/src/planner/nodes/create-table-node.ts +0 -35
- package/src/planner/nodes/create-view-node.ts +0 -44
- package/src/planner/nodes/cte-node.ts +0 -168
- package/src/planner/nodes/cte-reference-node.ts +0 -125
- package/src/planner/nodes/declarative-schema.ts +0 -221
- package/src/planner/nodes/delete-node.ts +0 -102
- package/src/planner/nodes/distinct-node.ts +0 -107
- package/src/planner/nodes/dml-executor-node.ts +0 -104
- package/src/planner/nodes/drop-assertion-node.ts +0 -50
- package/src/planner/nodes/drop-table-node.ts +0 -36
- package/src/planner/nodes/drop-view-node.ts +0 -37
- package/src/planner/nodes/filter.ts +0 -144
- package/src/planner/nodes/function.ts +0 -98
- package/src/planner/nodes/insert-node.ts +0 -126
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +0 -61
- package/src/planner/nodes/join-node.ts +0 -336
- package/src/planner/nodes/limit-offset.ts +0 -144
- package/src/planner/nodes/plan-node-type.ts +0 -95
- package/src/planner/nodes/plan-node.ts +0 -503
- package/src/planner/nodes/pragma.ts +0 -98
- package/src/planner/nodes/project-node.ts +0 -337
- package/src/planner/nodes/recursive-cte-node.ts +0 -158
- package/src/planner/nodes/reference.ts +0 -334
- package/src/planner/nodes/remote-query-node.ts +0 -73
- package/src/planner/nodes/retrieve-node.ts +0 -86
- package/src/planner/nodes/returning-node.ts +0 -269
- package/src/planner/nodes/scalar.ts +0 -772
- package/src/planner/nodes/sequencing-node.ts +0 -113
- package/src/planner/nodes/set-operation-node.ts +0 -87
- package/src/planner/nodes/single-row.ts +0 -85
- package/src/planner/nodes/sink-node.ts +0 -61
- package/src/planner/nodes/sort.ts +0 -166
- package/src/planner/nodes/stream-aggregate.ts +0 -293
- package/src/planner/nodes/subquery.ts +0 -268
- package/src/planner/nodes/table-access-nodes.ts +0 -323
- package/src/planner/nodes/table-function-call.ts +0 -134
- package/src/planner/nodes/transaction-node.ts +0 -55
- package/src/planner/nodes/update-node.ts +0 -138
- package/src/planner/nodes/values-node.ts +0 -244
- package/src/planner/nodes/view-reference-node.ts +0 -97
- package/src/planner/nodes/window-function.ts +0 -73
- package/src/planner/nodes/window-node.ts +0 -199
- package/src/planner/optimizer-tuning.ts +0 -105
- package/src/planner/optimizer.ts +0 -332
- package/src/planner/planning-context.ts +0 -190
- package/src/planner/resolve.ts +0 -101
- package/src/planner/rules/README.md +0 -96
- package/src/planner/rules/access/rule-select-access-path.ts +0 -399
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +0 -162
- package/src/planner/rules/cache/rule-cte-optimization.ts +0 -79
- package/src/planner/rules/cache/rule-materialization-advisory.ts +0 -77
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +0 -104
- package/src/planner/rules/join/rule-join-greedy-commute.ts +0 -48
- package/src/planner/rules/join/rule-join-key-inference.ts +0 -35
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +0 -267
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +0 -144
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +0 -337
- package/src/planner/scopes/aliased.ts +0 -50
- package/src/planner/scopes/base.ts +0 -10
- package/src/planner/scopes/empty.ts +0 -12
- package/src/planner/scopes/global.ts +0 -73
- package/src/planner/scopes/multi.ts +0 -40
- package/src/planner/scopes/param.ts +0 -95
- package/src/planner/scopes/registered.ts +0 -67
- package/src/planner/scopes/scope.ts +0 -16
- package/src/planner/stats/basic-estimates.ts +0 -107
- package/src/planner/stats/index.ts +0 -158
- package/src/planner/type-utils.ts +0 -87
- package/src/planner/util/key-utils.ts +0 -46
- package/src/planner/validation/determinism-validator.ts +0 -104
- package/src/planner/validation/plan-validator.ts +0 -335
- package/src/runtime/async-util.ts +0 -283
- package/src/runtime/cache/shared-cache.ts +0 -169
- package/src/runtime/context-helpers.ts +0 -191
- package/src/runtime/deferred-constraint-queue.ts +0 -196
- package/src/runtime/emission-context.ts +0 -319
- package/src/runtime/emit/add-constraint.ts +0 -78
- package/src/runtime/emit/aggregate.ts +0 -581
- package/src/runtime/emit/array-index.ts +0 -25
- package/src/runtime/emit/between.ts +0 -51
- package/src/runtime/emit/binary.ts +0 -357
- package/src/runtime/emit/block.ts +0 -23
- package/src/runtime/emit/cache.ts +0 -64
- package/src/runtime/emit/case.ts +0 -87
- package/src/runtime/emit/cast.ts +0 -151
- package/src/runtime/emit/collate.ts +0 -9
- package/src/runtime/emit/column-reference.ts +0 -17
- package/src/runtime/emit/constraint-check.ts +0 -290
- package/src/runtime/emit/create-assertion.ts +0 -82
- package/src/runtime/emit/create-index.ts +0 -15
- package/src/runtime/emit/create-table.ts +0 -15
- package/src/runtime/emit/create-view.ts +0 -52
- package/src/runtime/emit/cte-reference.ts +0 -38
- package/src/runtime/emit/cte.ts +0 -39
- package/src/runtime/emit/delete.ts +0 -24
- package/src/runtime/emit/distinct.ts +0 -40
- package/src/runtime/emit/dml-executor.ts +0 -198
- package/src/runtime/emit/drop-assertion.ts +0 -45
- package/src/runtime/emit/drop-table.ts +0 -27
- package/src/runtime/emit/drop-view.ts +0 -49
- package/src/runtime/emit/filter.ts +0 -30
- package/src/runtime/emit/insert.ts +0 -42
- package/src/runtime/emit/internal-recursive-cte-ref.ts +0 -37
- package/src/runtime/emit/join.ts +0 -148
- package/src/runtime/emit/limit-offset.ts +0 -73
- package/src/runtime/emit/literal.ts +0 -17
- package/src/runtime/emit/parameter.ts +0 -59
- package/src/runtime/emit/pragma.ts +0 -56
- package/src/runtime/emit/project.ts +0 -46
- package/src/runtime/emit/recursive-cte.ts +0 -111
- package/src/runtime/emit/remote-query.ts +0 -47
- package/src/runtime/emit/retrieve.ts +0 -15
- package/src/runtime/emit/returning.ts +0 -41
- package/src/runtime/emit/scalar-function.ts +0 -69
- package/src/runtime/emit/scan.ts +0 -106
- package/src/runtime/emit/schema-declarative.ts +0 -215
- package/src/runtime/emit/sequencing.ts +0 -24
- package/src/runtime/emit/set-operation.ts +0 -141
- package/src/runtime/emit/sink.ts +0 -27
- package/src/runtime/emit/sort.ts +0 -75
- package/src/runtime/emit/subquery.ts +0 -203
- package/src/runtime/emit/table-valued-function.ts +0 -106
- package/src/runtime/emit/temporal-arithmetic.ts +0 -302
- package/src/runtime/emit/transaction.ts +0 -205
- package/src/runtime/emit/unary.ts +0 -101
- package/src/runtime/emit/update.ts +0 -66
- package/src/runtime/emit/values.ts +0 -66
- package/src/runtime/emit/window-function.ts +0 -42
- package/src/runtime/emit/window.ts +0 -458
- package/src/runtime/emitters.ts +0 -183
- package/src/runtime/register.ts +0 -150
- package/src/runtime/scheduler.ts +0 -488
- package/src/runtime/types.ts +0 -242
- package/src/runtime/utils.ts +0 -177
- package/src/schema/assertion.ts +0 -21
- package/src/schema/catalog.ts +0 -269
- package/src/schema/change-events.ts +0 -80
- package/src/schema/column.ts +0 -51
- package/src/schema/declared-schema-manager.ts +0 -82
- package/src/schema/function.ts +0 -188
- package/src/schema/manager.ts +0 -1034
- package/src/schema/schema-differ.ts +0 -214
- package/src/schema/schema-hasher.ts +0 -26
- package/src/schema/schema.ts +0 -222
- package/src/schema/table.ts +0 -409
- package/src/schema/view.ts +0 -19
- package/src/schema/window-function.ts +0 -56
- package/src/types/builtin-types.ts +0 -350
- package/src/types/index.ts +0 -17
- package/src/types/json-type.ts +0 -152
- package/src/types/logical-type.ts +0 -91
- package/src/types/plugin-interface.ts +0 -10
- package/src/types/registry.ts +0 -204
- package/src/types/temporal-types.ts +0 -290
- package/src/types/validation.ts +0 -120
- package/src/util/affinity.ts +0 -151
- package/src/util/ast-stringify.ts +0 -887
- package/src/util/cached.ts +0 -25
- package/src/util/coercion.ts +0 -113
- package/src/util/comparison.ts +0 -510
- package/src/util/environment.ts +0 -52
- package/src/util/hash.ts +0 -90
- package/src/util/latches.ts +0 -47
- package/src/util/mutation-statement.ts +0 -135
- package/src/util/patterns.ts +0 -56
- package/src/util/plan-formatter.ts +0 -48
- package/src/util/plugin-helper.ts +0 -110
- package/src/util/row-descriptor.ts +0 -105
- package/src/util/serialization.ts +0 -47
- package/src/util/sql-literal.ts +0 -22
- package/src/util/working-table-iterable.ts +0 -38
- package/src/vtab/best-access-plan.ts +0 -244
- package/src/vtab/connection.ts +0 -36
- package/src/vtab/filter-info.ts +0 -23
- package/src/vtab/index-info.ts +0 -84
- package/src/vtab/manifest.ts +0 -86
- package/src/vtab/memory/connection.ts +0 -73
- package/src/vtab/memory/index.ts +0 -191
- package/src/vtab/memory/layer/base-cursor.ts +0 -124
- package/src/vtab/memory/layer/base.ts +0 -275
- package/src/vtab/memory/layer/connection.ts +0 -203
- package/src/vtab/memory/layer/interface.ts +0 -47
- package/src/vtab/memory/layer/manager.ts +0 -909
- package/src/vtab/memory/layer/safe-iterate.ts +0 -49
- package/src/vtab/memory/layer/scan-plan.ts +0 -84
- package/src/vtab/memory/layer/transaction-cursor.ts +0 -162
- package/src/vtab/memory/layer/transaction.ts +0 -229
- package/src/vtab/memory/module.ts +0 -667
- package/src/vtab/memory/table.ts +0 -251
- package/src/vtab/memory/types.ts +0 -23
- package/src/vtab/memory/utils/logging.ts +0 -36
- package/src/vtab/memory/utils/primary-key.ts +0 -163
- package/src/vtab/module.ts +0 -162
- package/src/vtab/table.ts +0 -177
|
@@ -1,588 +0,0 @@
|
|
|
1
|
-
import fastJsonPatch from 'fast-json-patch';
|
|
2
|
-
import type { Operation } from 'fast-json-patch';
|
|
3
|
-
const { applyPatch } = fastJsonPatch;
|
|
4
|
-
|
|
5
|
-
// moat-maker: Runtime validation library with TypeScript-like syntax
|
|
6
|
-
// Used for json_schema() function to validate JSON against structural schemas
|
|
7
|
-
import { validator } from 'moat-maker';
|
|
8
|
-
|
|
9
|
-
import { createLogger } from '../../common/logger.js';
|
|
10
|
-
import type { SqlValue, JSONValue } from '../../common/types.js';
|
|
11
|
-
import { createScalarFunction, createAggregateFunction } from '../registration.js';
|
|
12
|
-
import { safeJsonParse, resolveJsonPathForModify, prepareJsonValue, deepCopyJson, getJsonType } from './json-helpers.js';
|
|
13
|
-
import type { ScalarFunctionCallNode } from '../../planner/nodes/function.js';
|
|
14
|
-
import type { EmissionContext } from '../../runtime/emission-context.js';
|
|
15
|
-
import type { Instruction, RuntimeContext } from '../../runtime/types.js';
|
|
16
|
-
import { PlanNodeType } from '../../planner/nodes/plan-node-type.js';
|
|
17
|
-
import { LiteralNode } from '../../planner/nodes/scalar.js';
|
|
18
|
-
import { emitPlanNode } from '../../runtime/emitters.js';
|
|
19
|
-
|
|
20
|
-
const log = createLogger('func:builtins:json');
|
|
21
|
-
const errorLog = log.extend('error');
|
|
22
|
-
|
|
23
|
-
// --- JSON Functions --- //
|
|
24
|
-
|
|
25
|
-
// json_valid(X)
|
|
26
|
-
export const jsonValidFunc = createScalarFunction(
|
|
27
|
-
{ name: 'json_valid', numArgs: 1, deterministic: true },
|
|
28
|
-
(json: SqlValue): SqlValue => {
|
|
29
|
-
return safeJsonParse(json) !== null;
|
|
30
|
-
}
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Custom emitter for json_schema that caches compiled validators in the EmissionContext.
|
|
37
|
-
* This provides significant performance improvements for CHECK constraints and repeated validations.
|
|
38
|
-
*/
|
|
39
|
-
function emitJsonSchema(
|
|
40
|
-
plan: ScalarFunctionCallNode,
|
|
41
|
-
ctx: EmissionContext,
|
|
42
|
-
defaultEmit: (plan: ScalarFunctionCallNode, ctx: EmissionContext) => Instruction
|
|
43
|
-
): Instruction {
|
|
44
|
-
// Check if the second argument (schema definition) is a constant
|
|
45
|
-
const schemaDefArg = plan.operands[1];
|
|
46
|
-
|
|
47
|
-
if (schemaDefArg?.nodeType === PlanNodeType.Literal) {
|
|
48
|
-
const literalNode = schemaDefArg as LiteralNode;
|
|
49
|
-
const schemaDef = literalNode.getValue();
|
|
50
|
-
|
|
51
|
-
if (typeof schemaDef === 'string') {
|
|
52
|
-
try {
|
|
53
|
-
// Compile the validator once at emission time using moat-maker
|
|
54
|
-
// moat-maker uses template literals, so we need to create a validator dynamically
|
|
55
|
-
// Template literals have a special structure: an array with a 'raw' property
|
|
56
|
-
// We create this structure manually to simulate a template literal
|
|
57
|
-
const parts: any = [schemaDef];
|
|
58
|
-
parts.raw = [schemaDef];
|
|
59
|
-
const compiledValidator = validator(parts, ...[]);
|
|
60
|
-
|
|
61
|
-
// Emit only the JSON argument (first operand)
|
|
62
|
-
const jsonArgInstruction = emitPlanNode(plan.operands[0], ctx);
|
|
63
|
-
|
|
64
|
-
// Create optimized runtime function that uses the cached validator
|
|
65
|
-
// The validator is captured in the closure, so it lives with the plan
|
|
66
|
-
function run(_rctx: RuntimeContext, ...args: any[]): SqlValue {
|
|
67
|
-
const json = args[0];
|
|
68
|
-
if (typeof json !== 'string') return false;
|
|
69
|
-
|
|
70
|
-
let data: JSONValue | null;
|
|
71
|
-
try {
|
|
72
|
-
data = JSON.parse(json) as JSONValue;
|
|
73
|
-
} catch {
|
|
74
|
-
return false; // Invalid JSON
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Use the cached compiled validator
|
|
78
|
-
try {
|
|
79
|
-
// moat-maker's .matches() returns true if valid, false otherwise
|
|
80
|
-
const isValid = compiledValidator.matches(data);
|
|
81
|
-
return isValid;
|
|
82
|
-
} catch (e) {
|
|
83
|
-
errorLog('json_schema validation failed: %O', e);
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
params: [jsonArgInstruction],
|
|
90
|
-
run,
|
|
91
|
-
note: `json_schema(cached:${schemaDef.substring(0, 20)}...)`
|
|
92
|
-
};
|
|
93
|
-
} catch (e) {
|
|
94
|
-
errorLog('Failed to compile schema at emission time: %O', e);
|
|
95
|
-
// Fall through to default emission
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// If schema is not a constant or compilation failed, use default emission
|
|
101
|
-
return defaultEmit(plan, ctx);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// json_schema(X, schema_def)
|
|
105
|
-
// Note: This function uses a custom emitter that caches compiled validators
|
|
106
|
-
// during plan emission for better performance.
|
|
107
|
-
export const jsonSchemaFunc = createScalarFunction(
|
|
108
|
-
{ name: 'json_schema', numArgs: 2, deterministic: true },
|
|
109
|
-
(json: SqlValue, schemaDef: SqlValue): SqlValue => {
|
|
110
|
-
// This is the fallback implementation for when no cache is available
|
|
111
|
-
// (e.g., during direct function calls outside of query execution)
|
|
112
|
-
|
|
113
|
-
// Schema definition must be a string
|
|
114
|
-
if (typeof schemaDef !== 'string') return false;
|
|
115
|
-
|
|
116
|
-
// Parse the JSON value - need to check if it's valid JSON first
|
|
117
|
-
if (typeof json !== 'string') return false;
|
|
118
|
-
|
|
119
|
-
let data: JSONValue | null;
|
|
120
|
-
try {
|
|
121
|
-
data = JSON.parse(json) as JSONValue;
|
|
122
|
-
} catch {
|
|
123
|
-
return false; // Invalid JSON
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Compile and validate using moat-maker (no caching in fallback path)
|
|
127
|
-
try {
|
|
128
|
-
const parts: any = [schemaDef];
|
|
129
|
-
parts.raw = [schemaDef];
|
|
130
|
-
const compiledValidator = validator(parts, ...[]);
|
|
131
|
-
// moat-maker's .matches() returns true if valid, false otherwise
|
|
132
|
-
const isValid = compiledValidator.matches(data);
|
|
133
|
-
return isValid;
|
|
134
|
-
} catch (e) {
|
|
135
|
-
errorLog('json_schema validation failed: %O', e);
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
// Attach the custom emitter to the function schema
|
|
142
|
-
jsonSchemaFunc.customEmitter = emitJsonSchema;
|
|
143
|
-
|
|
144
|
-
// json_type(X, P?)
|
|
145
|
-
export const jsonTypeFunc = createScalarFunction(
|
|
146
|
-
{ name: 'json_type', numArgs: -1, deterministic: true },
|
|
147
|
-
(json: SqlValue, path?: SqlValue): SqlValue => {
|
|
148
|
-
const data = safeJsonParse(json);
|
|
149
|
-
if (data === null && typeof json === 'string') return null; // Invalid JSON input
|
|
150
|
-
|
|
151
|
-
let targetValue: JSONValue | undefined = data;
|
|
152
|
-
if (path !== undefined && path !== null) {
|
|
153
|
-
if (typeof path !== 'string') return 'null'; // Invalid path
|
|
154
|
-
const resolved = resolveJsonPathForModify(data, path);
|
|
155
|
-
targetValue = resolved?.exists ? resolved.value : undefined;
|
|
156
|
-
// If path evaluation leads nowhere, SQLite returns NULL type
|
|
157
|
-
if (targetValue === undefined) return null;
|
|
158
|
-
}
|
|
159
|
-
return getJsonType(targetValue as JSONValue);
|
|
160
|
-
}
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
// json_extract(X, P1, P2, ...)
|
|
164
|
-
export const jsonExtractFunc = createScalarFunction(
|
|
165
|
-
{ name: 'json_extract', numArgs: -1, deterministic: true },
|
|
166
|
-
(json: SqlValue, ...paths: SqlValue[]): SqlValue => {
|
|
167
|
-
const data = safeJsonParse(json);
|
|
168
|
-
if (data === null && typeof json === 'string') return null; // Return NULL if JSON is invalid
|
|
169
|
-
|
|
170
|
-
if (paths.length === 0) return null; // No paths provided
|
|
171
|
-
|
|
172
|
-
// SQLite json_extract: Find the first path that resolves
|
|
173
|
-
let extractedValue: any = undefined;
|
|
174
|
-
for (const pathVal of paths) {
|
|
175
|
-
if (typeof pathVal === 'string') {
|
|
176
|
-
const resolved = resolveJsonPathForModify(data, pathVal);
|
|
177
|
-
extractedValue = resolved?.exists ? resolved.value : undefined;
|
|
178
|
-
// Stop at the first path that successfully extracts a value (even if null)
|
|
179
|
-
if (extractedValue !== undefined) {
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
} else {
|
|
183
|
-
// Invalid path type itself results in overall NULL
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Map the extracted JS value to the corresponding SQL type
|
|
189
|
-
if (extractedValue === undefined) {
|
|
190
|
-
return null; // Path did not resolve
|
|
191
|
-
} else if (extractedValue === null) {
|
|
192
|
-
return null;
|
|
193
|
-
} else if (typeof extractedValue === 'boolean') {
|
|
194
|
-
return extractedValue;
|
|
195
|
-
} else if (typeof extractedValue === 'number') {
|
|
196
|
-
return extractedValue; // Return as INTEGER or REAL
|
|
197
|
-
} else if (typeof extractedValue === 'string') {
|
|
198
|
-
return extractedValue;
|
|
199
|
-
} else if (typeof extractedValue === 'object') {
|
|
200
|
-
// Return arrays/objects as JSON strings
|
|
201
|
-
try {
|
|
202
|
-
return JSON.stringify(extractedValue);
|
|
203
|
-
} catch {
|
|
204
|
-
return null; // Should not happen for valid extracted JSON parts
|
|
205
|
-
}
|
|
206
|
-
} else {
|
|
207
|
-
// Should not happen for valid JSON (e.g., bigint, symbol, function)
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
// json_quote(X)
|
|
214
|
-
export const jsonQuoteFunc = createScalarFunction(
|
|
215
|
-
{ name: 'json_quote', numArgs: 1, deterministic: true },
|
|
216
|
-
(value: SqlValue): SqlValue => {
|
|
217
|
-
if (value === null) return 'null';
|
|
218
|
-
switch (typeof value) {
|
|
219
|
-
case 'number':
|
|
220
|
-
if (!Number.isFinite(value)) return 'null'; // JSON doesn't support Infinity/NaN
|
|
221
|
-
return String(value);
|
|
222
|
-
case 'boolean':
|
|
223
|
-
return value ? 'true' : 'false';
|
|
224
|
-
case 'string':
|
|
225
|
-
return JSON.stringify(value); // Correctly escapes the string
|
|
226
|
-
case 'bigint':
|
|
227
|
-
// BigInts are not directly representable in standard JSON
|
|
228
|
-
return null;
|
|
229
|
-
case 'object':
|
|
230
|
-
if (value instanceof Uint8Array) {
|
|
231
|
-
// BLOBs cannot be represented in JSON
|
|
232
|
-
return null;
|
|
233
|
-
} else if (Array.isArray(value) || (value !== null && typeof value === 'object')) {
|
|
234
|
-
// Handle arrays and plain objects by converting to JSON string
|
|
235
|
-
try {
|
|
236
|
-
return JSON.stringify(value);
|
|
237
|
-
} catch {
|
|
238
|
-
return null;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return null;
|
|
242
|
-
default:
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
// json_array(X, Y, ...)
|
|
249
|
-
export const jsonArrayFunc = createScalarFunction(
|
|
250
|
-
{ name: 'json_array', numArgs: -1, deterministic: true },
|
|
251
|
-
(...args: SqlValue[]): SqlValue => {
|
|
252
|
-
// Values need to be converted to valid JSON representations before stringifying
|
|
253
|
-
const jsonCompatibleArgs = args.map(arg => prepareJsonValue(arg)); // Use helper
|
|
254
|
-
try {
|
|
255
|
-
return JSON.stringify(jsonCompatibleArgs);
|
|
256
|
-
} catch {
|
|
257
|
-
return null; // Should not happen with basic types
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
// json_object(N1, V1, N2, V2, ...)
|
|
263
|
-
export const jsonObjectFunc = createScalarFunction(
|
|
264
|
-
{ name: 'json_object', numArgs: -1, deterministic: true },
|
|
265
|
-
(...args: SqlValue[]): SqlValue => {
|
|
266
|
-
if (args.length % 2 !== 0) {
|
|
267
|
-
// SQLite json_object returns NULL if odd number of args
|
|
268
|
-
return null;
|
|
269
|
-
}
|
|
270
|
-
const obj: Record<string, any> = {};
|
|
271
|
-
for (let i = 0; i < args.length; i += 2) {
|
|
272
|
-
const key = args[i];
|
|
273
|
-
const value = args[i + 1];
|
|
274
|
-
if (typeof key !== 'string') {
|
|
275
|
-
// SQLite requires keys to be strings
|
|
276
|
-
return null;
|
|
277
|
-
}
|
|
278
|
-
// Convert value to JSON compatible using helper
|
|
279
|
-
obj[key] = prepareJsonValue(value);
|
|
280
|
-
}
|
|
281
|
-
try {
|
|
282
|
-
return JSON.stringify(obj);
|
|
283
|
-
} catch {
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
// --- Additional JSON Functions --- //
|
|
290
|
-
|
|
291
|
-
// json_array_length(json, path?)
|
|
292
|
-
export const jsonArrayLengthFunc = createScalarFunction(
|
|
293
|
-
{ name: 'json_array_length', numArgs: -1, deterministic: true },
|
|
294
|
-
(json: SqlValue, path?: SqlValue): SqlValue => {
|
|
295
|
-
const data = safeJsonParse(json);
|
|
296
|
-
if (data === null && typeof json === 'string') return null;
|
|
297
|
-
|
|
298
|
-
let targetValue: JSONValue | undefined = data;
|
|
299
|
-
if (path !== undefined && path !== null) {
|
|
300
|
-
if (typeof path !== 'string') return 0; // Invalid path -> 0 length
|
|
301
|
-
const resolved = resolveJsonPathForModify(data, path);
|
|
302
|
-
targetValue = resolved?.exists ? resolved.value : undefined;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
if (Array.isArray(targetValue)) {
|
|
306
|
-
return targetValue.length;
|
|
307
|
-
} else {
|
|
308
|
-
// If the target exists but is not an array, SQLite returns 0
|
|
309
|
-
// If the path doesn't resolve (targetValue is undefined), return 0?
|
|
310
|
-
// Let's return 0 if not an array, consistent with SQLite.
|
|
311
|
-
return 0;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
);
|
|
315
|
-
|
|
316
|
-
// json_patch(json, patch)
|
|
317
|
-
export const jsonPatchFunc = createScalarFunction(
|
|
318
|
-
{ name: 'json_patch', numArgs: 2, deterministic: false }, // Not deterministic as patch content varies
|
|
319
|
-
(json: SqlValue, patchVal: SqlValue): SqlValue => {
|
|
320
|
-
const data = safeJsonParse(json);
|
|
321
|
-
// JSON Patches must be JSON arrays
|
|
322
|
-
const patchData = safeJsonParse(patchVal);
|
|
323
|
-
|
|
324
|
-
if (data === null && typeof json === 'string') return null; // Invalid target JSON
|
|
325
|
-
if (!Array.isArray(patchData)) return null; // Invalid patch JSON (must be array)
|
|
326
|
-
|
|
327
|
-
// Ensure patch operations have the correct structure (basic check)
|
|
328
|
-
const patch = patchData as unknown as Operation[];
|
|
329
|
-
if (!patch.every(op => typeof op === 'object' && op !== null && 'op' in op && 'path' in op)) {
|
|
330
|
-
return null; // Invalid operation structure
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
try {
|
|
334
|
-
// fast-json-patch might throw on invalid patch operations or test failures
|
|
335
|
-
// applyPatch mutates by default, but since `data` is freshly parsed, it's okay.
|
|
336
|
-
// If data came from elsewhere, we might need deepCopyJson first.
|
|
337
|
-
const result = applyPatch(data, patch, true /* validate operations */).newDocument;
|
|
338
|
-
return JSON.stringify(result);
|
|
339
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
-
} catch (e: any) {
|
|
341
|
-
errorLog('json_patch failed: %s, %O', e?.message, e);
|
|
342
|
-
return null; // Return NULL on patch failure
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
// --- Manipulation Functions --- //
|
|
348
|
-
|
|
349
|
-
// json_insert(JSON, PATH, VALUE, PATH, VALUE, ...)
|
|
350
|
-
export const jsonInsertFunc = createScalarFunction(
|
|
351
|
-
{ name: 'json_insert', numArgs: -1, deterministic: true },
|
|
352
|
-
(json: SqlValue, ...args: SqlValue[]): SqlValue => {
|
|
353
|
-
const data = safeJsonParse(json);
|
|
354
|
-
if (data === null && typeof json === 'string') return null; // Invalid JSON input
|
|
355
|
-
if (args.length === 0 || args.length % 2 !== 0) return null; // Need path/value pairs
|
|
356
|
-
|
|
357
|
-
// Work on a copy
|
|
358
|
-
const currentData = deepCopyJson(data);
|
|
359
|
-
|
|
360
|
-
for (let i = 0; i < args.length; i += 2) {
|
|
361
|
-
const pathVal = args[i];
|
|
362
|
-
const valueVal = args[i + 1];
|
|
363
|
-
|
|
364
|
-
if (typeof pathVal !== 'string') return null; // Path must be string
|
|
365
|
-
|
|
366
|
-
const preparedValue = prepareJsonValue(valueVal);
|
|
367
|
-
const pathInfo = resolveJsonPathForModify(currentData, pathVal);
|
|
368
|
-
|
|
369
|
-
if (pathInfo === null) continue; // Ignore invalid paths
|
|
370
|
-
|
|
371
|
-
const { parent, key, exists } = pathInfo;
|
|
372
|
-
|
|
373
|
-
if (!exists) {
|
|
374
|
-
if (parent === null) continue; // Cannot insert at root if it doesn't exist (shouldn't happen)
|
|
375
|
-
|
|
376
|
-
if (Array.isArray(parent) && typeof key === 'number') {
|
|
377
|
-
if (key === parent.length) {
|
|
378
|
-
parent.push(preparedValue);
|
|
379
|
-
} else if (key < parent.length) {
|
|
380
|
-
parent.splice(key, 0, preparedValue); // Insert *before* existing element
|
|
381
|
-
}
|
|
382
|
-
// Ignore if key > parent.length?
|
|
383
|
-
} else if (typeof parent === 'object' && parent !== null && !Array.isArray(parent) && typeof key === 'string') {
|
|
384
|
-
(parent as Record<string, JSONValue>)[key] = preparedValue;
|
|
385
|
-
}
|
|
386
|
-
// else: Cannot insert into non-container or invalid key type - ignore
|
|
387
|
-
}
|
|
388
|
-
// If path *does* exist, json_insert does nothing.
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
try {
|
|
392
|
-
return JSON.stringify(currentData);
|
|
393
|
-
} catch {
|
|
394
|
-
return null;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
// json_replace(JSON, PATH, VALUE, PATH, VALUE, ...)
|
|
400
|
-
export const jsonReplaceFunc = createScalarFunction(
|
|
401
|
-
{ name: 'json_replace', numArgs: -1, deterministic: true },
|
|
402
|
-
(json: SqlValue, ...args: SqlValue[]): SqlValue => {
|
|
403
|
-
const data = safeJsonParse(json);
|
|
404
|
-
if (data === null && typeof json === 'string') return null;
|
|
405
|
-
if (args.length === 0 || args.length % 2 !== 0) return null;
|
|
406
|
-
|
|
407
|
-
let currentData = deepCopyJson(data);
|
|
408
|
-
|
|
409
|
-
for (let i = 0; i < args.length; i += 2) {
|
|
410
|
-
const pathVal = args[i];
|
|
411
|
-
const valueVal = args[i + 1];
|
|
412
|
-
|
|
413
|
-
if (typeof pathVal !== 'string') return null;
|
|
414
|
-
|
|
415
|
-
const preparedValue = prepareJsonValue(valueVal);
|
|
416
|
-
const pathInfo = resolveJsonPathForModify(currentData, pathVal);
|
|
417
|
-
|
|
418
|
-
if (pathInfo === null) continue; // Ignore invalid paths
|
|
419
|
-
|
|
420
|
-
const { parent, key, exists } = pathInfo;
|
|
421
|
-
|
|
422
|
-
if (exists) {
|
|
423
|
-
if (parent === null && key === '') {
|
|
424
|
-
// Replace the root value
|
|
425
|
-
currentData = preparedValue;
|
|
426
|
-
} else if (parent !== null && typeof key === 'string' && typeof parent === 'object' && !Array.isArray(parent)) {
|
|
427
|
-
parent[key] = preparedValue;
|
|
428
|
-
} else if (parent !== null && typeof key === 'number' && Array.isArray(parent)) {
|
|
429
|
-
if (key >= 0 && key < parent.length) {
|
|
430
|
-
parent[key] = preparedValue;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
// else: Cannot replace non-existent or invalid path - ignore
|
|
434
|
-
}
|
|
435
|
-
// If path does *not* exist, json_replace does nothing.
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
try {
|
|
439
|
-
return JSON.stringify(currentData);
|
|
440
|
-
} catch {
|
|
441
|
-
return null;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
);
|
|
445
|
-
|
|
446
|
-
// json_set(JSON, PATH, VALUE, PATH, VALUE, ...)
|
|
447
|
-
export const jsonSetFunc = createScalarFunction(
|
|
448
|
-
{ name: 'json_set', numArgs: -1, deterministic: true },
|
|
449
|
-
(json: SqlValue, ...args: SqlValue[]): SqlValue => {
|
|
450
|
-
const data = safeJsonParse(json);
|
|
451
|
-
if (data === null && typeof json === 'string') return null;
|
|
452
|
-
if (args.length === 0 || args.length % 2 !== 0) return null;
|
|
453
|
-
|
|
454
|
-
let currentData = deepCopyJson(data);
|
|
455
|
-
|
|
456
|
-
for (let i = 0; i < args.length; i += 2) {
|
|
457
|
-
const pathVal = args[i];
|
|
458
|
-
const valueVal = args[i + 1];
|
|
459
|
-
|
|
460
|
-
if (typeof pathVal !== 'string') return null;
|
|
461
|
-
|
|
462
|
-
const preparedValue = prepareJsonValue(valueVal);
|
|
463
|
-
// Pass createParents = true to enable intermediate creation
|
|
464
|
-
const pathInfo = resolveJsonPathForModify(currentData, pathVal, true);
|
|
465
|
-
|
|
466
|
-
if (pathInfo === null) continue; // Ignore invalid paths
|
|
467
|
-
|
|
468
|
-
const { parent, key } = pathInfo;
|
|
469
|
-
|
|
470
|
-
if (parent === null && key === '') {
|
|
471
|
-
// Set the root value
|
|
472
|
-
currentData = preparedValue;
|
|
473
|
-
} else if (parent !== null) {
|
|
474
|
-
if (typeof parent === 'object' && !Array.isArray(parent) && typeof key === 'string') {
|
|
475
|
-
parent[key] = preparedValue; // Set object property (create or replace)
|
|
476
|
-
} else if (Array.isArray(parent) && typeof key === 'number') {
|
|
477
|
-
if (key >= 0 && key < parent.length) {
|
|
478
|
-
parent[key] = preparedValue; // Replace existing array element
|
|
479
|
-
} else if (key === parent.length) {
|
|
480
|
-
parent.push(preparedValue); // Append to array
|
|
481
|
-
} else if (key > parent.length) {
|
|
482
|
-
// Pad array with nulls and append (SQLite behavior)
|
|
483
|
-
while (parent.length < key) {
|
|
484
|
-
parent.push(null);
|
|
485
|
-
}
|
|
486
|
-
parent.push(preparedValue);
|
|
487
|
-
}
|
|
488
|
-
// Ignore negative index?
|
|
489
|
-
}
|
|
490
|
-
// NOTE: This implementation does *not* create intermediate objects/arrays
|
|
491
|
-
// if the parent itself doesn't exist. A full json_set would need recursion here.
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
try {
|
|
496
|
-
return JSON.stringify(currentData);
|
|
497
|
-
} catch {
|
|
498
|
-
return null;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
);
|
|
502
|
-
|
|
503
|
-
// json_remove(JSON, PATH, PATH, ...)
|
|
504
|
-
export const jsonRemoveFunc = createScalarFunction(
|
|
505
|
-
{ name: 'json_remove', numArgs: -1, deterministic: true },
|
|
506
|
-
(json: SqlValue, ...paths: SqlValue[]): SqlValue => {
|
|
507
|
-
const data = safeJsonParse(json);
|
|
508
|
-
if (data === null && typeof json === 'string') return null; // Invalid JSON input
|
|
509
|
-
if (paths.length === 0) return JSON.stringify(data); // No paths means no change
|
|
510
|
-
|
|
511
|
-
const currentData = deepCopyJson(data);
|
|
512
|
-
|
|
513
|
-
for (const pathVal of paths) {
|
|
514
|
-
if (typeof pathVal !== 'string') return null; // Path must be string
|
|
515
|
-
|
|
516
|
-
const pathInfo = resolveJsonPathForModify(currentData, pathVal);
|
|
517
|
-
|
|
518
|
-
if (pathInfo === null || !pathInfo.exists || pathInfo.parent === null) {
|
|
519
|
-
// Invalid path, path doesn't exist, or trying to remove root - ignore
|
|
520
|
-
continue;
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
const { parent, key } = pathInfo;
|
|
524
|
-
|
|
525
|
-
if (Array.isArray(parent) && typeof key === 'number') {
|
|
526
|
-
if (key >= 0 && key < parent.length) {
|
|
527
|
-
parent.splice(key, 1); // Remove array element
|
|
528
|
-
}
|
|
529
|
-
} else if (typeof parent === 'object' && parent !== null && !Array.isArray(parent) && typeof key === 'string') {
|
|
530
|
-
if (Object.prototype.hasOwnProperty.call(parent, key)) {
|
|
531
|
-
delete (parent as Record<string, JSONValue>)[key]; // Remove object property
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
// else: Cannot remove from non-container or invalid key type - ignore
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
try {
|
|
538
|
-
return JSON.stringify(currentData);
|
|
539
|
-
} catch {
|
|
540
|
-
return null;
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
);
|
|
544
|
-
|
|
545
|
-
// --- Aggregate Functions --- //
|
|
546
|
-
|
|
547
|
-
// json_group_array(value)
|
|
548
|
-
export const jsonGroupArrayFunc = createAggregateFunction(
|
|
549
|
-
{ name: 'json_group_array', numArgs: 1, initialValue: [] },
|
|
550
|
-
(acc: any[], value: SqlValue): any[] => {
|
|
551
|
-
// SQLite's json_group_array includes NULLs, unlike json_array function
|
|
552
|
-
const preparedValue = prepareJsonValue(value);
|
|
553
|
-
acc.push(preparedValue);
|
|
554
|
-
return acc;
|
|
555
|
-
},
|
|
556
|
-
(acc: any[]): SqlValue => {
|
|
557
|
-
try {
|
|
558
|
-
// Returns NULL if the group is empty, otherwise the JSON array string
|
|
559
|
-
return acc.length > 0 ? JSON.stringify(acc) : null;
|
|
560
|
-
} catch {
|
|
561
|
-
return null;
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
);
|
|
565
|
-
|
|
566
|
-
// json_group_object(name, value)
|
|
567
|
-
export const jsonGroupObjectFunc = createAggregateFunction(
|
|
568
|
-
{ name: 'json_group_object', numArgs: 2, initialValue: {} },
|
|
569
|
-
(acc: Record<string, any>, name: SqlValue, value: SqlValue): Record<string, any> => {
|
|
570
|
-
if (name === null || name === undefined) {
|
|
571
|
-
return acc; // Skip if name is NULL/undefined
|
|
572
|
-
}
|
|
573
|
-
// Convert the name to a string key - SQLite converts non-string keys to strings
|
|
574
|
-
const stringKey = String(name);
|
|
575
|
-
// SQLite's json_group_object includes NULL values associated with keys
|
|
576
|
-
const preparedValue = prepareJsonValue(value);
|
|
577
|
-
acc[stringKey] = preparedValue;
|
|
578
|
-
return acc;
|
|
579
|
-
},
|
|
580
|
-
(acc: Record<string, any>): SqlValue => {
|
|
581
|
-
try {
|
|
582
|
-
// Returns NULL if the group is empty, otherwise the JSON object string
|
|
583
|
-
return Object.keys(acc).length > 0 ? JSON.stringify(acc) : null;
|
|
584
|
-
} catch {
|
|
585
|
-
return null;
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
);
|