@quereus/quereus 0.7.3 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +19 -18
- 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,500 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '../../common/logger.js'; // Import logger
|
|
2
|
-
import { Temporal } from 'temporal-polyfill';
|
|
3
|
-
import { StatusCode, type SqlValue } from '../../common/types.js';
|
|
4
|
-
import { createScalarFunction } from '../registration.js';
|
|
5
|
-
import { quereusError } from '../../common/errors.js';
|
|
6
|
-
|
|
7
|
-
const log = createLogger('func:builtins:datetime'); // Create logger instance
|
|
8
|
-
const warnLog = log.extend('warn');
|
|
9
|
-
const errorLog = log.extend('error');
|
|
10
|
-
|
|
11
|
-
// --- Constants ---
|
|
12
|
-
const MILLIS_PER_DAY = 86400000;
|
|
13
|
-
const JULIAN_DAY_UNIX_EPOCH = 2440587.5;
|
|
14
|
-
const SQLITE_DEFAULT_DATE = { year: 2000, month: 1, day: 1 }; // Used for time-only inputs
|
|
15
|
-
|
|
16
|
-
// --- Parsing Helper (using Temporal) --- //
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Parses various date/time string formats, Julian day numbers, or Unix timestamps
|
|
20
|
-
* into a Temporal object. Tries to mimic SQLite's lenient parsing.
|
|
21
|
-
* @param timeVal The input value (string, number, null).
|
|
22
|
-
* @param isUnixEpoch Flag indicating if the input number should be treated as Unix epoch seconds.
|
|
23
|
-
* @returns A Temporal.ZonedDateTime (usually UTC) or null if parsing fails.
|
|
24
|
-
*/
|
|
25
|
-
function parseToTemporal(timeVal: SqlValue, isUnixEpoch = false): Temporal.ZonedDateTime | null {
|
|
26
|
-
if (timeVal === null || timeVal === undefined) return null;
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
if (typeof timeVal === 'number') {
|
|
30
|
-
if (isUnixEpoch) {
|
|
31
|
-
// Assume Unix timestamp in seconds, convert to Instant using milliseconds
|
|
32
|
-
const instant = Temporal.Instant.fromEpochMilliseconds(timeVal * 1000);
|
|
33
|
-
return instant.toZonedDateTimeISO('UTC');
|
|
34
|
-
} else {
|
|
35
|
-
// Check if it looks like a Julian day number
|
|
36
|
-
if (timeVal > 1000000 && timeVal < 4000000) { // Heuristic for JD
|
|
37
|
-
const epochMillis = (timeVal - JULIAN_DAY_UNIX_EPOCH) * MILLIS_PER_DAY;
|
|
38
|
-
const instant = Temporal.Instant.fromEpochMilliseconds(epochMillis);
|
|
39
|
-
return instant.toZonedDateTimeISO('UTC');
|
|
40
|
-
} else {
|
|
41
|
-
// Try interpreting as Unix timestamp (seconds or milliseconds) - prioritize seconds if reasonable
|
|
42
|
-
try {
|
|
43
|
-
// Reasonable range check for seconds (approx 1900-3000 AD)
|
|
44
|
-
if (timeVal > -2208988800 && timeVal < 32503680000) {
|
|
45
|
-
// Use fromEpochMilliseconds for seconds as fromEpochSeconds might not be in polyfill types
|
|
46
|
-
const instant = Temporal.Instant.fromEpochMilliseconds(timeVal * 1000);
|
|
47
|
-
return instant.toZonedDateTimeISO('UTC');
|
|
48
|
-
}
|
|
49
|
-
} catch { /* continue */ }
|
|
50
|
-
// Try milliseconds if seconds failed or out of range
|
|
51
|
-
try {
|
|
52
|
-
// Reasonable range check for milliseconds (approx 1900-3000 AD)
|
|
53
|
-
if (timeVal > -2208988800000 && timeVal < 32503680000000) {
|
|
54
|
-
const instant = Temporal.Instant.fromEpochMilliseconds(timeVal);
|
|
55
|
-
return instant.toZonedDateTimeISO('UTC');
|
|
56
|
-
}
|
|
57
|
-
} catch { /* continue */ }
|
|
58
|
-
return null; // Unrecognized number format
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (typeof timeVal !== 'string') return null;
|
|
64
|
-
|
|
65
|
-
const trimmedVal = timeVal.trim();
|
|
66
|
-
const lowerTrimmedVal = trimmedVal.toLowerCase();
|
|
67
|
-
|
|
68
|
-
if (lowerTrimmedVal === 'now') {
|
|
69
|
-
// 'now' typically means the current time in the local timezone in SQL contexts
|
|
70
|
-
return Temporal.Now.zonedDateTimeISO();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Attempt direct parsing with Temporal.ZonedDateTime (ISO format with timezone)
|
|
74
|
-
try {
|
|
75
|
-
if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/.test(trimmedVal)) {
|
|
76
|
-
const instant = Temporal.Instant.from(trimmedVal.replace(' ','T') + 'Z');
|
|
77
|
-
return instant.toZonedDateTimeISO('UTC');
|
|
78
|
-
}
|
|
79
|
-
const zdt = Temporal.ZonedDateTime.from(trimmedVal);
|
|
80
|
-
return zdt;
|
|
81
|
-
} catch { /* continue */ }
|
|
82
|
-
|
|
83
|
-
// Attempt direct parsing with Temporal.PlainDateTime (ISO format without timezone)
|
|
84
|
-
try {
|
|
85
|
-
const pdt = Temporal.PlainDateTime.from(trimmedVal.replace(' ','T'));
|
|
86
|
-
return pdt.toZonedDateTime('UTC');
|
|
87
|
-
} catch { /* continue */ }
|
|
88
|
-
|
|
89
|
-
// Attempt direct parsing with Temporal.PlainDate (YYYY-MM-DD)
|
|
90
|
-
try {
|
|
91
|
-
const pd = Temporal.PlainDate.from(trimmedVal);
|
|
92
|
-
return pd.toZonedDateTime('UTC'); // Defaults to 00:00:00 UTC
|
|
93
|
-
} catch { /* continue */ }
|
|
94
|
-
|
|
95
|
-
// Attempt direct parsing with Temporal.PlainTime (HH:MM:SS.SSS)
|
|
96
|
-
try {
|
|
97
|
-
const pt = Temporal.PlainTime.from(trimmedVal);
|
|
98
|
-
// If only time, assume default date (2000-01-01) and UTC
|
|
99
|
-
// Access individual properties instead of getISOFields
|
|
100
|
-
return Temporal.PlainDateTime.from({
|
|
101
|
-
...SQLITE_DEFAULT_DATE,
|
|
102
|
-
hour: pt.hour,
|
|
103
|
-
minute: pt.minute,
|
|
104
|
-
second: pt.second,
|
|
105
|
-
millisecond: pt.millisecond,
|
|
106
|
-
microsecond: pt.microsecond,
|
|
107
|
-
nanosecond: pt.nanosecond,
|
|
108
|
-
}).toZonedDateTime('UTC');
|
|
109
|
-
} catch { /* continue */ }
|
|
110
|
-
|
|
111
|
-
// --- Fallback Manual Parsing for SQLite Lenient Formats ---
|
|
112
|
-
|
|
113
|
-
// YYYYMMDD
|
|
114
|
-
let match = trimmedVal.match(/^(\d{4})(\d{2})(\d{2})$/);
|
|
115
|
-
if (match) {
|
|
116
|
-
const pdt = Temporal.PlainDateTime.from({ year: parseInt(match[1]), month: parseInt(match[2]), day: parseInt(match[3])});
|
|
117
|
-
return pdt.toZonedDateTime('UTC');
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// HH:MM
|
|
121
|
-
match = trimmedVal.match(/^(\d{2}):(\d{2})$/);
|
|
122
|
-
if (match) {
|
|
123
|
-
const ptArgs = { hour: parseInt(match[1]), minute: parseInt(match[2]) };
|
|
124
|
-
return Temporal.PlainDateTime.from({ ...SQLITE_DEFAULT_DATE, ...ptArgs }).toZonedDateTime('UTC');
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// HH:MM:SS
|
|
128
|
-
match = trimmedVal.match(/^(\d{2}):(\d{2}):(\d{2})$/);
|
|
129
|
-
if (match) {
|
|
130
|
-
const ptArgs = { hour: parseInt(match[1]), minute: parseInt(match[2]), second: parseInt(match[3]) };
|
|
131
|
-
return Temporal.PlainDateTime.from({ ...SQLITE_DEFAULT_DATE, ...ptArgs }).toZonedDateTime('UTC');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// HH:MM:SS.SSS (handle varying ms digits)
|
|
135
|
-
match = trimmedVal.match(/^(\d{2}):(\d{2}):(\d{2})\.(\d{1,9})$/);
|
|
136
|
-
if (match) {
|
|
137
|
-
const ns = parseInt(match[4].padEnd(9, '0').substring(0, 9)); // Pad/truncate to nanoseconds
|
|
138
|
-
const ptArgs = {
|
|
139
|
-
hour: parseInt(match[1]),
|
|
140
|
-
minute: parseInt(match[2]),
|
|
141
|
-
second: parseInt(match[3]),
|
|
142
|
-
millisecond: Math.floor(ns / 1_000_000),
|
|
143
|
-
microsecond: Math.floor((ns % 1_000_000) / 1_000),
|
|
144
|
-
nanosecond: ns % 1_000,
|
|
145
|
-
};
|
|
146
|
-
return Temporal.PlainDateTime.from({ ...SQLITE_DEFAULT_DATE, ...ptArgs }).toZonedDateTime('UTC');
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
warnLog('Failed to parse date/time string with Temporal: %s', timeVal);
|
|
150
|
-
return null;
|
|
151
|
-
|
|
152
|
-
} catch (e) {
|
|
153
|
-
warnLog('Error parsing date/time value "%s": %O', timeVal, e);
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// --- Modifier Application (using Temporal) --- //
|
|
159
|
-
|
|
160
|
-
// Regex to parse relative time modifiers like '+1 day', '-3 months'
|
|
161
|
-
const RELATIVE_MODIFIER_REGEX = /^\s*([+-]?\s*\d+(\.\d+)?)\s+(day|hour|minute|second|month|year)s?\s*$/i;
|
|
162
|
-
// Regex for 'weekday N'
|
|
163
|
-
const WEEKDAY_MODIFIER_REGEX = /^\s*weekday\s+([0-6])\s*$/i; // 0=Sun, 1=Mon..6=Sat
|
|
164
|
-
|
|
165
|
-
function applyTemporalModifier(dt: Temporal.ZonedDateTime, modifier: string): Temporal.ZonedDateTime {
|
|
166
|
-
const trimmedModifier = modifier.trim().toLowerCase();
|
|
167
|
-
|
|
168
|
-
// Group 1: Relative Time Shifts
|
|
169
|
-
const relativeMatch = trimmedModifier.match(RELATIVE_MODIFIER_REGEX);
|
|
170
|
-
if (relativeMatch) {
|
|
171
|
-
const valueStr = relativeMatch[1].replace(/\s/g, '');
|
|
172
|
-
const value = parseFloat(valueStr);
|
|
173
|
-
const unit = relativeMatch[3]; // unit is guaranteed to be a string here
|
|
174
|
-
|
|
175
|
-
if (isNaN(value)) {
|
|
176
|
-
quereusError(`Invalid number in modifier: ${modifier}`, StatusCode.MISUSE);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Use Record<string, number> for better type checking with dynamic keys
|
|
180
|
-
const durationLike: Record<string, number> = {};
|
|
181
|
-
if (unit === 'year' || unit === 'month' || unit === 'day') {
|
|
182
|
-
durationLike[`${unit}s`] = Math.trunc(value);
|
|
183
|
-
} else if (unit === 'hour' || unit === 'minute' || unit === 'second') {
|
|
184
|
-
if (unit === 'second') {
|
|
185
|
-
const seconds = Math.trunc(value);
|
|
186
|
-
const nanoseconds = Math.round((value % 1) * 1e9);
|
|
187
|
-
durationLike.seconds = seconds;
|
|
188
|
-
if (nanoseconds !== 0) durationLike.nanoseconds = nanoseconds;
|
|
189
|
-
} else {
|
|
190
|
-
durationLike[`${unit}s`] = value;
|
|
191
|
-
}
|
|
192
|
-
} else {
|
|
193
|
-
quereusError(`Internal error: Unknown unit ${unit}`, StatusCode.MISUSE);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const duration = Temporal.Duration.from(durationLike);
|
|
197
|
-
return dt.add(duration);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Group 2: Start/End of Unit
|
|
201
|
-
switch (trimmedModifier) {
|
|
202
|
-
case 'start of day':
|
|
203
|
-
return dt.startOfDay();
|
|
204
|
-
case 'start of month':
|
|
205
|
-
return dt.startOfDay().with({ day: 1 });
|
|
206
|
-
case 'start of year':
|
|
207
|
-
return dt.startOfDay().with({ month: 1, day: 1 });
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Group 3: Weekday Adjustment
|
|
211
|
-
const weekdayMatch = trimmedModifier.match(WEEKDAY_MODIFIER_REGEX);
|
|
212
|
-
if (weekdayMatch) {
|
|
213
|
-
const targetWeekday = parseInt(weekdayMatch[1], 10);
|
|
214
|
-
const targetWeekdayISO = targetWeekday === 0 ? 7 : targetWeekday;
|
|
215
|
-
const currentWeekdayISO = dt.dayOfWeek;
|
|
216
|
-
let daysToAdd = targetWeekdayISO - currentWeekdayISO;
|
|
217
|
-
if (daysToAdd > 0) {
|
|
218
|
-
daysToAdd -= 7;
|
|
219
|
-
}
|
|
220
|
-
if (daysToAdd !== 0) {
|
|
221
|
-
return dt.add({ days: daysToAdd });
|
|
222
|
-
}
|
|
223
|
-
return dt;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Group 4: Timezone (Handled before modifier application)
|
|
227
|
-
warnLog('Modifier not implemented or unrecognized: %s', modifier);
|
|
228
|
-
return dt;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
// --- Core Logic --- //
|
|
233
|
-
|
|
234
|
-
function processDateTimeArgs(args: ReadonlyArray<SqlValue>): Temporal.ZonedDateTime | null {
|
|
235
|
-
if (args.length === 0) return null;
|
|
236
|
-
|
|
237
|
-
let initialTimeVal = args[0];
|
|
238
|
-
let startIndex = 1;
|
|
239
|
-
let isUnixEpoch = false;
|
|
240
|
-
let modifiers: SqlValue[] = [];
|
|
241
|
-
|
|
242
|
-
const unixEpochIndex = args.findIndex(arg => typeof arg === 'string' && arg.trim().toLowerCase() === 'unixepoch');
|
|
243
|
-
|
|
244
|
-
if (unixEpochIndex !== -1) {
|
|
245
|
-
if (unixEpochIndex === 0) {
|
|
246
|
-
if (args.length < 2) return null;
|
|
247
|
-
initialTimeVal = args[1];
|
|
248
|
-
isUnixEpoch = true;
|
|
249
|
-
startIndex = 2;
|
|
250
|
-
modifiers = args.slice(startIndex);
|
|
251
|
-
} else {
|
|
252
|
-
initialTimeVal = args[0];
|
|
253
|
-
isUnixEpoch = true;
|
|
254
|
-
if (typeof initialTimeVal !== 'number') return null;
|
|
255
|
-
modifiers = args.slice(1).filter((_, i) => i !== (unixEpochIndex - 1));
|
|
256
|
-
startIndex = 1;
|
|
257
|
-
}
|
|
258
|
-
} else {
|
|
259
|
-
initialTimeVal = args[0];
|
|
260
|
-
modifiers = args.slice(1);
|
|
261
|
-
startIndex = 1;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Determine target timezone from modifiers ('localtime' or 'utc')
|
|
265
|
-
let targetTimeZoneId: string = 'UTC'; // Store ID as string, default to UTC
|
|
266
|
-
const remainingModifiers: string[] = [];
|
|
267
|
-
|
|
268
|
-
for (const mod of modifiers) {
|
|
269
|
-
if (typeof mod !== 'string') continue;
|
|
270
|
-
const lowerMod = mod.trim().toLowerCase();
|
|
271
|
-
if (lowerMod === 'localtime') {
|
|
272
|
-
targetTimeZoneId = Temporal.Now.timeZoneId();
|
|
273
|
-
} else if (lowerMod === 'utc') {
|
|
274
|
-
targetTimeZoneId = 'UTC'; // Use string literal
|
|
275
|
-
} else {
|
|
276
|
-
remainingModifiers.push(mod);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Parse the initial value
|
|
281
|
-
let currentDt = parseToTemporal(initialTimeVal, isUnixEpoch);
|
|
282
|
-
if (!currentDt) return null;
|
|
283
|
-
|
|
284
|
-
// Adjust initial ZonedDateTime to the target timezone if necessary
|
|
285
|
-
if (targetTimeZoneId !== currentDt.timeZoneId) {
|
|
286
|
-
try {
|
|
287
|
-
currentDt = currentDt.toInstant().toZonedDateTimeISO(targetTimeZoneId);
|
|
288
|
-
} catch (e) {
|
|
289
|
-
warnLog('Failed to convert to timezone "%s": %O', targetTimeZoneId, e);
|
|
290
|
-
return null;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Apply remaining modifiers
|
|
295
|
-
for (const modifier of remainingModifiers) {
|
|
296
|
-
if (typeof modifier !== 'string') continue;
|
|
297
|
-
try {
|
|
298
|
-
currentDt = applyTemporalModifier(currentDt, modifier);
|
|
299
|
-
} catch (e) {
|
|
300
|
-
warnLog('Error applying modifier "%s": %O', modifier, e);
|
|
301
|
-
return null;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return currentDt;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
// --- Function Implementations --- //
|
|
310
|
-
|
|
311
|
-
// date(timestring, modifier, ...)
|
|
312
|
-
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
313
|
-
export const dateFunc = createScalarFunction(
|
|
314
|
-
{ name: 'date', numArgs: -1, deterministic: false },
|
|
315
|
-
(...args: SqlValue[]): SqlValue => {
|
|
316
|
-
const finalDt = processDateTimeArgs(args);
|
|
317
|
-
if (!finalDt) return null;
|
|
318
|
-
return finalDt.toPlainDate().toString();
|
|
319
|
-
}
|
|
320
|
-
);
|
|
321
|
-
|
|
322
|
-
// time(timestring, modifier, ...)
|
|
323
|
-
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
324
|
-
export const timeFunc = createScalarFunction(
|
|
325
|
-
{ name: 'time', numArgs: -1, deterministic: false },
|
|
326
|
-
(...args: SqlValue[]): SqlValue => {
|
|
327
|
-
const finalDt = processDateTimeArgs(args);
|
|
328
|
-
if (!finalDt) return null;
|
|
329
|
-
return finalDt.toPlainTime().toString({ smallestUnit: 'second' });
|
|
330
|
-
}
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
// datetime(timestring, modifier, ...)
|
|
334
|
-
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
335
|
-
export const datetimeFunc = createScalarFunction(
|
|
336
|
-
{ name: 'datetime', numArgs: -1, deterministic: false },
|
|
337
|
-
(...args: SqlValue[]): SqlValue => {
|
|
338
|
-
const finalDt = processDateTimeArgs(args);
|
|
339
|
-
if (!finalDt) return null;
|
|
340
|
-
const datePart = finalDt.toPlainDate().toString();
|
|
341
|
-
const timePart = finalDt.toPlainTime().toString({ smallestUnit: 'second' });
|
|
342
|
-
return `${datePart} ${timePart}`;
|
|
343
|
-
}
|
|
344
|
-
);
|
|
345
|
-
|
|
346
|
-
// julianday(timestring, modifier, ...)
|
|
347
|
-
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
348
|
-
export const juliandayFunc = createScalarFunction(
|
|
349
|
-
{ name: 'julianday', numArgs: -1, deterministic: false },
|
|
350
|
-
(...args: SqlValue[]): SqlValue => {
|
|
351
|
-
const finalDt = processDateTimeArgs(args);
|
|
352
|
-
if (!finalDt) return null;
|
|
353
|
-
const epochMillis = finalDt.toInstant().epochMilliseconds;
|
|
354
|
-
return (epochMillis / MILLIS_PER_DAY) + JULIAN_DAY_UNIX_EPOCH;
|
|
355
|
-
}
|
|
356
|
-
);
|
|
357
|
-
|
|
358
|
-
// strftime(format, timestring, modifier, ...)
|
|
359
|
-
// NOTE: Marked as non-deterministic because it accepts 'now' as a timestring
|
|
360
|
-
export const strftimeFunc = createScalarFunction(
|
|
361
|
-
{ name: 'strftime', numArgs: -1, deterministic: false },
|
|
362
|
-
(format: SqlValue, ...timeArgs: SqlValue[]): SqlValue => {
|
|
363
|
-
if (typeof format !== 'string') return null;
|
|
364
|
-
const finalDt = processDateTimeArgs(timeArgs);
|
|
365
|
-
if (!finalDt) return null;
|
|
366
|
-
|
|
367
|
-
// Abbreviated month names (SQLite standard)
|
|
368
|
-
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
369
|
-
|
|
370
|
-
try {
|
|
371
|
-
let result = format;
|
|
372
|
-
// Use replace with a callback function for better handling
|
|
373
|
-
result = result.replace(/%./g, (match) => {
|
|
374
|
-
switch (match) {
|
|
375
|
-
// Date
|
|
376
|
-
case '%Y': return finalDt.year.toString().padStart(4, '0');
|
|
377
|
-
case '%m': return finalDt.month.toString().padStart(2, '0');
|
|
378
|
-
case '%d': return finalDt.day.toString().padStart(2, '0');
|
|
379
|
-
case '%j': return finalDt.dayOfYear.toString().padStart(3, '0');
|
|
380
|
-
case '%F': return `${finalDt.year.toString().padStart(4, '0')}-${finalDt.month.toString().padStart(2, '0')}-${finalDt.day.toString().padStart(2, '0')}`;
|
|
381
|
-
case '%D': return `${finalDt.month.toString().padStart(2, '0')}/${finalDt.day.toString().padStart(2, '0')}/${finalDt.year.toString().slice(-2)}`;
|
|
382
|
-
case '%C': return Math.floor(finalDt.year / 100).toString().padStart(2, '0');
|
|
383
|
-
case '%y': return finalDt.year.toString().slice(-2);
|
|
384
|
-
case '%h': return months[finalDt.month - 1];
|
|
385
|
-
case '%e': return finalDt.day.toString().padStart(2, ' ');
|
|
386
|
-
|
|
387
|
-
// Time
|
|
388
|
-
case '%H': return finalDt.hour.toString().padStart(2, '0');
|
|
389
|
-
case '%M': return finalDt.minute.toString().padStart(2, '0');
|
|
390
|
-
case '%S': return finalDt.second.toString().padStart(2, '0');
|
|
391
|
-
case '%f': { // SQLite %f is .SSS
|
|
392
|
-
const msStr = finalDt.millisecond.toString().padStart(3,'0');
|
|
393
|
-
return `.${msStr}`;
|
|
394
|
-
}
|
|
395
|
-
case '%s': return Math.floor(finalDt.epochMilliseconds / 1000).toString();
|
|
396
|
-
case '%I': return (finalDt.hour % 12 || 12).toString().padStart(2, '0'); // 12-hour clock
|
|
397
|
-
case '%k': return finalDt.hour.toString().padStart(2, ' '); // 24-hour, space padded
|
|
398
|
-
case '%l': return (finalDt.hour % 12 || 12).toString().padStart(2, ' '); // 12-hour, space padded
|
|
399
|
-
case '%p': return finalDt.hour < 12 ? 'AM' : 'PM';
|
|
400
|
-
case '%P': return finalDt.hour < 12 ? 'am' : 'pm';
|
|
401
|
-
case '%T': return `${finalDt.hour.toString().padStart(2, '0')}:${finalDt.minute.toString().padStart(2, '0')}:${finalDt.second.toString().padStart(2, '0')}`;
|
|
402
|
-
case '%R': return `${finalDt.hour.toString().padStart(2, '0')}:${finalDt.minute.toString().padStart(2, '0')}`;
|
|
403
|
-
case '%r': { // 12-hour time hh:mm:ss AM/PM
|
|
404
|
-
const hour12 = (finalDt.hour % 12 || 12).toString().padStart(2, '0');
|
|
405
|
-
const min = finalDt.minute.toString().padStart(2, '0');
|
|
406
|
-
const sec = finalDt.second.toString().padStart(2, '0');
|
|
407
|
-
const ampm = finalDt.hour < 12 ? 'AM' : 'PM';
|
|
408
|
-
return `${hour12}:${min}:${sec} ${ampm}`;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Weekday / Week Number
|
|
412
|
-
case '%w': return (finalDt.dayOfWeek % 7).toString(); // 0=Sunday..6=Saturday (SQLite)
|
|
413
|
-
case '%u': return finalDt.dayOfWeek.toString(); // 1=Monday..7=Sunday (ISO)
|
|
414
|
-
// Handle potentially undefined weekOfYear (though Temporal usually provides it)
|
|
415
|
-
case '%W': // Week number (Sunday start, 00-53) - SQLite specific implementation
|
|
416
|
-
warnLog('strftime %W not fully implemented');
|
|
417
|
-
return (finalDt.weekOfYear ?? 0).toString().padStart(2, '0'); // Fallback to ISO week
|
|
418
|
-
case '%V': return (finalDt.weekOfYear ?? 0).toString().padStart(2, '0'); // ISO 8601 week number
|
|
419
|
-
case '%g': // ISO 8601 week-based year, last two digits
|
|
420
|
-
return (finalDt.yearOfWeek ?? finalDt.year).toString().slice(-2);
|
|
421
|
-
case '%G': // ISO 8601 week-based year, four digits
|
|
422
|
-
return (finalDt.yearOfWeek ?? finalDt.year).toString().padStart(4, '0');
|
|
423
|
-
|
|
424
|
-
// Julian Day
|
|
425
|
-
case '%J': {
|
|
426
|
-
const epochMillis = finalDt.toInstant().epochMilliseconds;
|
|
427
|
-
const jd = (epochMillis / MILLIS_PER_DAY) + JULIAN_DAY_UNIX_EPOCH;
|
|
428
|
-
return jd.toString();
|
|
429
|
-
}
|
|
430
|
-
// Timezone
|
|
431
|
-
case '%z': { // +hhmm or -hhmm
|
|
432
|
-
const offsetStr = finalDt.offset;
|
|
433
|
-
const sign = offsetStr.startsWith('-') ? '-' : '+';
|
|
434
|
-
const parts = offsetStr.substring(1).split(':');
|
|
435
|
-
return `${sign}${parts[0].padStart(2, '0')}${parts[1]?.padStart(2, '0') ?? '00'}`;
|
|
436
|
-
}
|
|
437
|
-
case '%:z': // +hh:mm or -hh:mm
|
|
438
|
-
return finalDt.offset;
|
|
439
|
-
// case '%Z': // Timezone name - Complex, depends on available data. Skip for now.
|
|
440
|
-
|
|
441
|
-
// Literal Percent
|
|
442
|
-
case '%%': return '%';
|
|
443
|
-
|
|
444
|
-
// Week numbering formats are complex to implement correctly
|
|
445
|
-
// Using ISO week numbers as fallback where appropriate
|
|
446
|
-
|
|
447
|
-
default:
|
|
448
|
-
warnLog(`Unsupported strftime specifier: ${match}`);
|
|
449
|
-
return match; // Return the specifier itself if unsupported
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
return result;
|
|
453
|
-
} catch (e) {
|
|
454
|
-
errorLog("Error during strftime formatting: %O", e);
|
|
455
|
-
return null;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
);
|
|
459
|
-
|
|
460
|
-
// IsISODate(text)
|
|
461
|
-
export const isISODateFunc = createScalarFunction(
|
|
462
|
-
{ name: 'IsISODate', numArgs: 1, deterministic: true },
|
|
463
|
-
(value: SqlValue): SqlValue => {
|
|
464
|
-
if (typeof value !== 'string') return false;
|
|
465
|
-
const s = value.trim();
|
|
466
|
-
if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) return false;
|
|
467
|
-
try {
|
|
468
|
-
const d = Temporal.PlainDate.from(s);
|
|
469
|
-
return d.toString() === s;
|
|
470
|
-
} catch {
|
|
471
|
-
return false;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
);
|
|
475
|
-
|
|
476
|
-
// IsISODateTime(text)
|
|
477
|
-
export const isISODateTimeFunc = createScalarFunction(
|
|
478
|
-
{ name: 'IsISODateTime', numArgs: 1, deterministic: true },
|
|
479
|
-
(value: SqlValue): SqlValue => {
|
|
480
|
-
if (typeof value !== 'string') return false;
|
|
481
|
-
const s = value.trim();
|
|
482
|
-
// YYYY-MM-DDTHH:MM[:SS[.fraction]] [timezone]
|
|
483
|
-
const re =
|
|
484
|
-
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:\d{2})?$/;
|
|
485
|
-
if (!re.test(s)) return false;
|
|
486
|
-
const hasZone = /(?:Z|[+-]\d{2}:\d{2})$/.test(s);
|
|
487
|
-
try {
|
|
488
|
-
if (hasZone) {
|
|
489
|
-
// Zoned ISO string
|
|
490
|
-
void Temporal.Instant.from(s);
|
|
491
|
-
return true;
|
|
492
|
-
}
|
|
493
|
-
// Plain ISO local date-time
|
|
494
|
-
void Temporal.PlainDateTime.from(s);
|
|
495
|
-
return true;
|
|
496
|
-
} catch {
|
|
497
|
-
return false;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
);
|