@quereus/quereus 0.7.3 → 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.
Files changed (566) hide show
  1. package/package.json +3 -3
  2. package/dist/src/common/constants.js.map +0 -1
  3. package/dist/src/common/datatype.js.map +0 -1
  4. package/dist/src/common/errors.js.map +0 -1
  5. package/dist/src/common/json-types.js.map +0 -1
  6. package/dist/src/common/logger.js.map +0 -1
  7. package/dist/src/common/type-inference.js.map +0 -1
  8. package/dist/src/common/types.js.map +0 -1
  9. package/dist/src/core/database-options.js.map +0 -1
  10. package/dist/src/core/database.js.map +0 -1
  11. package/dist/src/core/param.js.map +0 -1
  12. package/dist/src/core/statement.js.map +0 -1
  13. package/dist/src/func/builtins/aggregate.js.map +0 -1
  14. package/dist/src/func/builtins/builtin-window-functions.js.map +0 -1
  15. package/dist/src/func/builtins/conversion.js.map +0 -1
  16. package/dist/src/func/builtins/datetime.js.map +0 -1
  17. package/dist/src/func/builtins/explain.js.map +0 -1
  18. package/dist/src/func/builtins/generation.js.map +0 -1
  19. package/dist/src/func/builtins/index.js.map +0 -1
  20. package/dist/src/func/builtins/json-helpers.js.map +0 -1
  21. package/dist/src/func/builtins/json-tvf.js.map +0 -1
  22. package/dist/src/func/builtins/json.js.map +0 -1
  23. package/dist/src/func/builtins/scalar.js.map +0 -1
  24. package/dist/src/func/builtins/schema.js.map +0 -1
  25. package/dist/src/func/builtins/string.js.map +0 -1
  26. package/dist/src/func/builtins/timespan.js.map +0 -1
  27. package/dist/src/func/context.js.map +0 -1
  28. package/dist/src/func/registration.js.map +0 -1
  29. package/dist/src/index.js.map +0 -1
  30. package/dist/src/parser/ast.js.map +0 -1
  31. package/dist/src/parser/index.js.map +0 -1
  32. package/dist/src/parser/lexer.js.map +0 -1
  33. package/dist/src/parser/parser.js.map +0 -1
  34. package/dist/src/parser/utils.js.map +0 -1
  35. package/dist/src/parser/visitor.js.map +0 -1
  36. package/dist/src/planner/analysis/binding-collector.js.map +0 -1
  37. package/dist/src/planner/analysis/const-evaluator.js.map +0 -1
  38. package/dist/src/planner/analysis/const-pass.js.map +0 -1
  39. package/dist/src/planner/analysis/constraint-extractor.js.map +0 -1
  40. package/dist/src/planner/analysis/predicate-normalizer.js.map +0 -1
  41. package/dist/src/planner/building/alter-table.js.map +0 -1
  42. package/dist/src/planner/building/block.js.map +0 -1
  43. package/dist/src/planner/building/constraint-builder.js.map +0 -1
  44. package/dist/src/planner/building/create-assertion.js.map +0 -1
  45. package/dist/src/planner/building/create-view.js.map +0 -1
  46. package/dist/src/planner/building/ddl.js.map +0 -1
  47. package/dist/src/planner/building/declare-schema.js.map +0 -1
  48. package/dist/src/planner/building/delete.js.map +0 -1
  49. package/dist/src/planner/building/drop-assertion.js.map +0 -1
  50. package/dist/src/planner/building/drop-table.js.map +0 -1
  51. package/dist/src/planner/building/drop-view.js.map +0 -1
  52. package/dist/src/planner/building/expression.js.map +0 -1
  53. package/dist/src/planner/building/function-call.js.map +0 -1
  54. package/dist/src/planner/building/insert.js.map +0 -1
  55. package/dist/src/planner/building/pragma.js.map +0 -1
  56. package/dist/src/planner/building/schema-resolution.js.map +0 -1
  57. package/dist/src/planner/building/select-aggregates.js.map +0 -1
  58. package/dist/src/planner/building/select-compound.js.map +0 -1
  59. package/dist/src/planner/building/select-context.js.map +0 -1
  60. package/dist/src/planner/building/select-modifiers.js.map +0 -1
  61. package/dist/src/planner/building/select-projections.js.map +0 -1
  62. package/dist/src/planner/building/select-window.js.map +0 -1
  63. package/dist/src/planner/building/select.js.map +0 -1
  64. package/dist/src/planner/building/table-function.js.map +0 -1
  65. package/dist/src/planner/building/table.js.map +0 -1
  66. package/dist/src/planner/building/transaction.js.map +0 -1
  67. package/dist/src/planner/building/update.js.map +0 -1
  68. package/dist/src/planner/building/with.js.map +0 -1
  69. package/dist/src/planner/cache/correlation-detector.js.map +0 -1
  70. package/dist/src/planner/cache/materialization-advisory.js.map +0 -1
  71. package/dist/src/planner/cache/reference-graph.js.map +0 -1
  72. package/dist/src/planner/cost/index.js.map +0 -1
  73. package/dist/src/planner/debug/logger-utils.js.map +0 -1
  74. package/dist/src/planner/debug.js.map +0 -1
  75. package/dist/src/planner/framework/characteristics.js.map +0 -1
  76. package/dist/src/planner/framework/context.js.map +0 -1
  77. package/dist/src/planner/framework/pass.js.map +0 -1
  78. package/dist/src/planner/framework/physical-utils.js.map +0 -1
  79. package/dist/src/planner/framework/registry.js.map +0 -1
  80. package/dist/src/planner/framework/trace.js.map +0 -1
  81. package/dist/src/planner/nodes/add-constraint-node.js.map +0 -1
  82. package/dist/src/planner/nodes/aggregate-function.js.map +0 -1
  83. package/dist/src/planner/nodes/aggregate-node.js.map +0 -1
  84. package/dist/src/planner/nodes/array-index-node.js.map +0 -1
  85. package/dist/src/planner/nodes/block.js.map +0 -1
  86. package/dist/src/planner/nodes/cache-node.js.map +0 -1
  87. package/dist/src/planner/nodes/constraint-check-node.js.map +0 -1
  88. package/dist/src/planner/nodes/create-assertion-node.js.map +0 -1
  89. package/dist/src/planner/nodes/create-index-node.js.map +0 -1
  90. package/dist/src/planner/nodes/create-table-node.js.map +0 -1
  91. package/dist/src/planner/nodes/create-view-node.js.map +0 -1
  92. package/dist/src/planner/nodes/cte-node.js.map +0 -1
  93. package/dist/src/planner/nodes/cte-reference-node.js.map +0 -1
  94. package/dist/src/planner/nodes/declarative-schema.js.map +0 -1
  95. package/dist/src/planner/nodes/delete-node.js.map +0 -1
  96. package/dist/src/planner/nodes/distinct-node.js.map +0 -1
  97. package/dist/src/planner/nodes/dml-executor-node.js.map +0 -1
  98. package/dist/src/planner/nodes/drop-assertion-node.js.map +0 -1
  99. package/dist/src/planner/nodes/drop-table-node.js.map +0 -1
  100. package/dist/src/planner/nodes/drop-view-node.js.map +0 -1
  101. package/dist/src/planner/nodes/filter.js.map +0 -1
  102. package/dist/src/planner/nodes/function.js.map +0 -1
  103. package/dist/src/planner/nodes/insert-node.js.map +0 -1
  104. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +0 -1
  105. package/dist/src/planner/nodes/join-node.js.map +0 -1
  106. package/dist/src/planner/nodes/limit-offset.js.map +0 -1
  107. package/dist/src/planner/nodes/plan-node-type.js.map +0 -1
  108. package/dist/src/planner/nodes/plan-node.js.map +0 -1
  109. package/dist/src/planner/nodes/pragma.js.map +0 -1
  110. package/dist/src/planner/nodes/project-node.js.map +0 -1
  111. package/dist/src/planner/nodes/recursive-cte-node.js.map +0 -1
  112. package/dist/src/planner/nodes/reference.js.map +0 -1
  113. package/dist/src/planner/nodes/remote-query-node.js.map +0 -1
  114. package/dist/src/planner/nodes/retrieve-node.js.map +0 -1
  115. package/dist/src/planner/nodes/returning-node.js.map +0 -1
  116. package/dist/src/planner/nodes/scalar.js.map +0 -1
  117. package/dist/src/planner/nodes/sequencing-node.js.map +0 -1
  118. package/dist/src/planner/nodes/set-operation-node.js.map +0 -1
  119. package/dist/src/planner/nodes/single-row.js.map +0 -1
  120. package/dist/src/planner/nodes/sink-node.js.map +0 -1
  121. package/dist/src/planner/nodes/sort.js.map +0 -1
  122. package/dist/src/planner/nodes/stream-aggregate.js.map +0 -1
  123. package/dist/src/planner/nodes/subquery.js.map +0 -1
  124. package/dist/src/planner/nodes/table-access-nodes.js.map +0 -1
  125. package/dist/src/planner/nodes/table-function-call.js.map +0 -1
  126. package/dist/src/planner/nodes/transaction-node.js.map +0 -1
  127. package/dist/src/planner/nodes/update-node.js.map +0 -1
  128. package/dist/src/planner/nodes/values-node.js.map +0 -1
  129. package/dist/src/planner/nodes/view-reference-node.js.map +0 -1
  130. package/dist/src/planner/nodes/window-function.js.map +0 -1
  131. package/dist/src/planner/nodes/window-node.js.map +0 -1
  132. package/dist/src/planner/optimizer-tuning.js.map +0 -1
  133. package/dist/src/planner/optimizer.js.map +0 -1
  134. package/dist/src/planner/planning-context.js.map +0 -1
  135. package/dist/src/planner/resolve.js.map +0 -1
  136. package/dist/src/planner/rules/access/rule-select-access-path.js.map +0 -1
  137. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +0 -1
  138. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +0 -1
  139. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +0 -1
  140. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +0 -1
  141. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +0 -1
  142. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +0 -1
  143. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +0 -1
  144. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +0 -1
  145. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +0 -1
  146. package/dist/src/planner/scopes/aliased.js.map +0 -1
  147. package/dist/src/planner/scopes/base.js.map +0 -1
  148. package/dist/src/planner/scopes/empty.js.map +0 -1
  149. package/dist/src/planner/scopes/global.js.map +0 -1
  150. package/dist/src/planner/scopes/multi.js.map +0 -1
  151. package/dist/src/planner/scopes/param.js.map +0 -1
  152. package/dist/src/planner/scopes/registered.js.map +0 -1
  153. package/dist/src/planner/scopes/scope.js.map +0 -1
  154. package/dist/src/planner/stats/basic-estimates.js.map +0 -1
  155. package/dist/src/planner/stats/index.js.map +0 -1
  156. package/dist/src/planner/type-utils.js.map +0 -1
  157. package/dist/src/planner/util/key-utils.js.map +0 -1
  158. package/dist/src/planner/validation/determinism-validator.js.map +0 -1
  159. package/dist/src/planner/validation/plan-validator.js.map +0 -1
  160. package/dist/src/runtime/async-util.js.map +0 -1
  161. package/dist/src/runtime/cache/shared-cache.js.map +0 -1
  162. package/dist/src/runtime/context-helpers.js.map +0 -1
  163. package/dist/src/runtime/deferred-constraint-queue.js.map +0 -1
  164. package/dist/src/runtime/emission-context.js.map +0 -1
  165. package/dist/src/runtime/emit/add-constraint.js.map +0 -1
  166. package/dist/src/runtime/emit/aggregate.js.map +0 -1
  167. package/dist/src/runtime/emit/array-index.js.map +0 -1
  168. package/dist/src/runtime/emit/between.js.map +0 -1
  169. package/dist/src/runtime/emit/binary.js.map +0 -1
  170. package/dist/src/runtime/emit/block.js.map +0 -1
  171. package/dist/src/runtime/emit/cache.js.map +0 -1
  172. package/dist/src/runtime/emit/case.js.map +0 -1
  173. package/dist/src/runtime/emit/cast.js.map +0 -1
  174. package/dist/src/runtime/emit/collate.js.map +0 -1
  175. package/dist/src/runtime/emit/column-reference.js.map +0 -1
  176. package/dist/src/runtime/emit/constraint-check.js.map +0 -1
  177. package/dist/src/runtime/emit/create-assertion.js.map +0 -1
  178. package/dist/src/runtime/emit/create-index.js.map +0 -1
  179. package/dist/src/runtime/emit/create-table.js.map +0 -1
  180. package/dist/src/runtime/emit/create-view.js.map +0 -1
  181. package/dist/src/runtime/emit/cte-reference.js.map +0 -1
  182. package/dist/src/runtime/emit/cte.js.map +0 -1
  183. package/dist/src/runtime/emit/delete.js.map +0 -1
  184. package/dist/src/runtime/emit/distinct.js.map +0 -1
  185. package/dist/src/runtime/emit/dml-executor.js.map +0 -1
  186. package/dist/src/runtime/emit/drop-assertion.js.map +0 -1
  187. package/dist/src/runtime/emit/drop-table.js.map +0 -1
  188. package/dist/src/runtime/emit/drop-view.js.map +0 -1
  189. package/dist/src/runtime/emit/filter.js.map +0 -1
  190. package/dist/src/runtime/emit/insert.js.map +0 -1
  191. package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +0 -1
  192. package/dist/src/runtime/emit/join.js.map +0 -1
  193. package/dist/src/runtime/emit/limit-offset.js.map +0 -1
  194. package/dist/src/runtime/emit/literal.js.map +0 -1
  195. package/dist/src/runtime/emit/parameter.js.map +0 -1
  196. package/dist/src/runtime/emit/pragma.js.map +0 -1
  197. package/dist/src/runtime/emit/project.js.map +0 -1
  198. package/dist/src/runtime/emit/recursive-cte.js.map +0 -1
  199. package/dist/src/runtime/emit/remote-query.js.map +0 -1
  200. package/dist/src/runtime/emit/retrieve.js.map +0 -1
  201. package/dist/src/runtime/emit/returning.js.map +0 -1
  202. package/dist/src/runtime/emit/scalar-function.js.map +0 -1
  203. package/dist/src/runtime/emit/scan.js.map +0 -1
  204. package/dist/src/runtime/emit/schema-declarative.js.map +0 -1
  205. package/dist/src/runtime/emit/sequencing.js.map +0 -1
  206. package/dist/src/runtime/emit/set-operation.js.map +0 -1
  207. package/dist/src/runtime/emit/sink.js.map +0 -1
  208. package/dist/src/runtime/emit/sort.js.map +0 -1
  209. package/dist/src/runtime/emit/subquery.js.map +0 -1
  210. package/dist/src/runtime/emit/table-valued-function.js.map +0 -1
  211. package/dist/src/runtime/emit/temporal-arithmetic.js.map +0 -1
  212. package/dist/src/runtime/emit/transaction.js.map +0 -1
  213. package/dist/src/runtime/emit/unary.js.map +0 -1
  214. package/dist/src/runtime/emit/update.js.map +0 -1
  215. package/dist/src/runtime/emit/values.js.map +0 -1
  216. package/dist/src/runtime/emit/window-function.js.map +0 -1
  217. package/dist/src/runtime/emit/window.js.map +0 -1
  218. package/dist/src/runtime/emitters.js.map +0 -1
  219. package/dist/src/runtime/register.js.map +0 -1
  220. package/dist/src/runtime/scheduler.js.map +0 -1
  221. package/dist/src/runtime/types.js.map +0 -1
  222. package/dist/src/runtime/utils.js.map +0 -1
  223. package/dist/src/schema/assertion.js.map +0 -1
  224. package/dist/src/schema/catalog.js.map +0 -1
  225. package/dist/src/schema/change-events.js.map +0 -1
  226. package/dist/src/schema/column.js.map +0 -1
  227. package/dist/src/schema/declared-schema-manager.js.map +0 -1
  228. package/dist/src/schema/function.js.map +0 -1
  229. package/dist/src/schema/manager.js.map +0 -1
  230. package/dist/src/schema/schema-differ.js.map +0 -1
  231. package/dist/src/schema/schema-hasher.js.map +0 -1
  232. package/dist/src/schema/schema.js.map +0 -1
  233. package/dist/src/schema/table.js.map +0 -1
  234. package/dist/src/schema/view.js.map +0 -1
  235. package/dist/src/schema/window-function.js.map +0 -1
  236. package/dist/src/types/builtin-types.js.map +0 -1
  237. package/dist/src/types/index.js.map +0 -1
  238. package/dist/src/types/json-type.js.map +0 -1
  239. package/dist/src/types/logical-type.js.map +0 -1
  240. package/dist/src/types/plugin-interface.js.map +0 -1
  241. package/dist/src/types/registry.js.map +0 -1
  242. package/dist/src/types/temporal-types.js.map +0 -1
  243. package/dist/src/types/validation.js.map +0 -1
  244. package/dist/src/util/affinity.js.map +0 -1
  245. package/dist/src/util/ast-stringify.js.map +0 -1
  246. package/dist/src/util/cached.js.map +0 -1
  247. package/dist/src/util/coercion.js.map +0 -1
  248. package/dist/src/util/comparison.js.map +0 -1
  249. package/dist/src/util/environment.js.map +0 -1
  250. package/dist/src/util/hash.js.map +0 -1
  251. package/dist/src/util/latches.js.map +0 -1
  252. package/dist/src/util/mutation-statement.js.map +0 -1
  253. package/dist/src/util/patterns.js.map +0 -1
  254. package/dist/src/util/plan-formatter.js.map +0 -1
  255. package/dist/src/util/plugin-helper.js.map +0 -1
  256. package/dist/src/util/row-descriptor.js.map +0 -1
  257. package/dist/src/util/serialization.js.map +0 -1
  258. package/dist/src/util/sql-literal.js.map +0 -1
  259. package/dist/src/util/working-table-iterable.js.map +0 -1
  260. package/dist/src/vtab/best-access-plan.js.map +0 -1
  261. package/dist/src/vtab/connection.js.map +0 -1
  262. package/dist/src/vtab/filter-info.js.map +0 -1
  263. package/dist/src/vtab/index-info.js.map +0 -1
  264. package/dist/src/vtab/manifest.js.map +0 -1
  265. package/dist/src/vtab/memory/connection.js.map +0 -1
  266. package/dist/src/vtab/memory/index.js.map +0 -1
  267. package/dist/src/vtab/memory/layer/base-cursor.js.map +0 -1
  268. package/dist/src/vtab/memory/layer/base.js.map +0 -1
  269. package/dist/src/vtab/memory/layer/connection.js.map +0 -1
  270. package/dist/src/vtab/memory/layer/interface.js.map +0 -1
  271. package/dist/src/vtab/memory/layer/manager.js.map +0 -1
  272. package/dist/src/vtab/memory/layer/safe-iterate.js.map +0 -1
  273. package/dist/src/vtab/memory/layer/scan-plan.js.map +0 -1
  274. package/dist/src/vtab/memory/layer/transaction-cursor.js.map +0 -1
  275. package/dist/src/vtab/memory/layer/transaction.js.map +0 -1
  276. package/dist/src/vtab/memory/module.js.map +0 -1
  277. package/dist/src/vtab/memory/table.js.map +0 -1
  278. package/dist/src/vtab/memory/types.js.map +0 -1
  279. package/dist/src/vtab/memory/utils/logging.js.map +0 -1
  280. package/dist/src/vtab/memory/utils/primary-key.js.map +0 -1
  281. package/dist/src/vtab/module.js.map +0 -1
  282. package/dist/src/vtab/table.js.map +0 -1
  283. package/src/common/constants.ts +0 -60
  284. package/src/common/datatype.ts +0 -85
  285. package/src/common/errors.ts +0 -189
  286. package/src/common/json-types.ts +0 -16
  287. package/src/common/logger.ts +0 -97
  288. package/src/common/type-inference.ts +0 -39
  289. package/src/common/types.ts +0 -151
  290. package/src/core/database-options.ts +0 -258
  291. package/src/core/database.ts +0 -1461
  292. package/src/core/param.ts +0 -56
  293. package/src/core/statement.ts +0 -528
  294. package/src/func/builtins/aggregate.ts +0 -269
  295. package/src/func/builtins/builtin-window-functions.ts +0 -166
  296. package/src/func/builtins/conversion.ts +0 -226
  297. package/src/func/builtins/datetime.ts +0 -500
  298. package/src/func/builtins/explain.ts +0 -779
  299. package/src/func/builtins/generation.ts +0 -43
  300. package/src/func/builtins/index.ts +0 -167
  301. package/src/func/builtins/json-helpers.ts +0 -237
  302. package/src/func/builtins/json-tvf.ts +0 -224
  303. package/src/func/builtins/json.ts +0 -588
  304. package/src/func/builtins/scalar.ts +0 -423
  305. package/src/func/builtins/schema.ts +0 -213
  306. package/src/func/builtins/string.ts +0 -306
  307. package/src/func/builtins/timespan.ts +0 -179
  308. package/src/func/context.ts +0 -258
  309. package/src/func/registration.ts +0 -201
  310. package/src/index.ts +0 -172
  311. package/src/parser/ast.ts +0 -581
  312. package/src/parser/index.ts +0 -65
  313. package/src/parser/lexer.ts +0 -806
  314. package/src/parser/parser.ts +0 -3352
  315. package/src/parser/utils.ts +0 -10
  316. package/src/parser/visitor.ts +0 -188
  317. package/src/planner/analysis/README.md +0 -93
  318. package/src/planner/analysis/binding-collector.ts +0 -83
  319. package/src/planner/analysis/const-evaluator.ts +0 -63
  320. package/src/planner/analysis/const-pass.ts +0 -282
  321. package/src/planner/analysis/constraint-extractor.ts +0 -764
  322. package/src/planner/analysis/predicate-normalizer.ts +0 -237
  323. package/src/planner/building/alter-table.ts +0 -49
  324. package/src/planner/building/block.ts +0 -93
  325. package/src/planner/building/constraint-builder.ts +0 -178
  326. package/src/planner/building/create-assertion.ts +0 -7
  327. package/src/planner/building/create-view.ts +0 -29
  328. package/src/planner/building/ddl.ts +0 -24
  329. package/src/planner/building/declare-schema.ts +0 -22
  330. package/src/planner/building/delete.ts +0 -218
  331. package/src/planner/building/drop-assertion.ts +0 -11
  332. package/src/planner/building/drop-table.ts +0 -13
  333. package/src/planner/building/drop-view.ts +0 -19
  334. package/src/planner/building/expression.ts +0 -205
  335. package/src/planner/building/function-call.ts +0 -129
  336. package/src/planner/building/insert.ts +0 -435
  337. package/src/planner/building/pragma.ts +0 -34
  338. package/src/planner/building/schema-resolution.ts +0 -176
  339. package/src/planner/building/select-aggregates.ts +0 -318
  340. package/src/planner/building/select-compound.ts +0 -119
  341. package/src/planner/building/select-context.ts +0 -85
  342. package/src/planner/building/select-modifiers.ts +0 -236
  343. package/src/planner/building/select-projections.ts +0 -177
  344. package/src/planner/building/select-window.ts +0 -259
  345. package/src/planner/building/select.ts +0 -567
  346. package/src/planner/building/table-function.ts +0 -49
  347. package/src/planner/building/table.ts +0 -40
  348. package/src/planner/building/transaction.ts +0 -23
  349. package/src/planner/building/update.ts +0 -331
  350. package/src/planner/building/with.ts +0 -180
  351. package/src/planner/cache/correlation-detector.ts +0 -83
  352. package/src/planner/cache/materialization-advisory.ts +0 -265
  353. package/src/planner/cache/reference-graph.ts +0 -196
  354. package/src/planner/cost/index.ts +0 -169
  355. package/src/planner/debug/logger-utils.ts +0 -68
  356. package/src/planner/debug.ts +0 -480
  357. package/src/planner/framework/README.md +0 -132
  358. package/src/planner/framework/characteristics.ts +0 -503
  359. package/src/planner/framework/context.ts +0 -239
  360. package/src/planner/framework/pass.ts +0 -354
  361. package/src/planner/framework/physical-utils.ts +0 -210
  362. package/src/planner/framework/registry.ts +0 -261
  363. package/src/planner/framework/trace.ts +0 -259
  364. package/src/planner/nodes/add-constraint-node.ts +0 -62
  365. package/src/planner/nodes/aggregate-function.ts +0 -155
  366. package/src/planner/nodes/aggregate-node.ts +0 -267
  367. package/src/planner/nodes/array-index-node.ts +0 -50
  368. package/src/planner/nodes/block.ts +0 -80
  369. package/src/planner/nodes/cache-node.ts +0 -103
  370. package/src/planner/nodes/constraint-check-node.ts +0 -138
  371. package/src/planner/nodes/create-assertion-node.ts +0 -51
  372. package/src/planner/nodes/create-index-node.ts +0 -41
  373. package/src/planner/nodes/create-table-node.ts +0 -35
  374. package/src/planner/nodes/create-view-node.ts +0 -44
  375. package/src/planner/nodes/cte-node.ts +0 -168
  376. package/src/planner/nodes/cte-reference-node.ts +0 -125
  377. package/src/planner/nodes/declarative-schema.ts +0 -221
  378. package/src/planner/nodes/delete-node.ts +0 -102
  379. package/src/planner/nodes/distinct-node.ts +0 -107
  380. package/src/planner/nodes/dml-executor-node.ts +0 -104
  381. package/src/planner/nodes/drop-assertion-node.ts +0 -50
  382. package/src/planner/nodes/drop-table-node.ts +0 -36
  383. package/src/planner/nodes/drop-view-node.ts +0 -37
  384. package/src/planner/nodes/filter.ts +0 -144
  385. package/src/planner/nodes/function.ts +0 -98
  386. package/src/planner/nodes/insert-node.ts +0 -126
  387. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +0 -61
  388. package/src/planner/nodes/join-node.ts +0 -336
  389. package/src/planner/nodes/limit-offset.ts +0 -144
  390. package/src/planner/nodes/plan-node-type.ts +0 -95
  391. package/src/planner/nodes/plan-node.ts +0 -503
  392. package/src/planner/nodes/pragma.ts +0 -98
  393. package/src/planner/nodes/project-node.ts +0 -337
  394. package/src/planner/nodes/recursive-cte-node.ts +0 -158
  395. package/src/planner/nodes/reference.ts +0 -334
  396. package/src/planner/nodes/remote-query-node.ts +0 -73
  397. package/src/planner/nodes/retrieve-node.ts +0 -86
  398. package/src/planner/nodes/returning-node.ts +0 -269
  399. package/src/planner/nodes/scalar.ts +0 -772
  400. package/src/planner/nodes/sequencing-node.ts +0 -113
  401. package/src/planner/nodes/set-operation-node.ts +0 -87
  402. package/src/planner/nodes/single-row.ts +0 -85
  403. package/src/planner/nodes/sink-node.ts +0 -61
  404. package/src/planner/nodes/sort.ts +0 -166
  405. package/src/planner/nodes/stream-aggregate.ts +0 -293
  406. package/src/planner/nodes/subquery.ts +0 -268
  407. package/src/planner/nodes/table-access-nodes.ts +0 -323
  408. package/src/planner/nodes/table-function-call.ts +0 -134
  409. package/src/planner/nodes/transaction-node.ts +0 -55
  410. package/src/planner/nodes/update-node.ts +0 -138
  411. package/src/planner/nodes/values-node.ts +0 -244
  412. package/src/planner/nodes/view-reference-node.ts +0 -97
  413. package/src/planner/nodes/window-function.ts +0 -73
  414. package/src/planner/nodes/window-node.ts +0 -199
  415. package/src/planner/optimizer-tuning.ts +0 -105
  416. package/src/planner/optimizer.ts +0 -332
  417. package/src/planner/planning-context.ts +0 -190
  418. package/src/planner/resolve.ts +0 -101
  419. package/src/planner/rules/README.md +0 -96
  420. package/src/planner/rules/access/rule-select-access-path.ts +0 -399
  421. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +0 -162
  422. package/src/planner/rules/cache/rule-cte-optimization.ts +0 -79
  423. package/src/planner/rules/cache/rule-materialization-advisory.ts +0 -77
  424. package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +0 -104
  425. package/src/planner/rules/join/rule-join-greedy-commute.ts +0 -48
  426. package/src/planner/rules/join/rule-join-key-inference.ts +0 -35
  427. package/src/planner/rules/join/rule-quickpick-enumeration.ts +0 -267
  428. package/src/planner/rules/predicate/rule-predicate-pushdown.ts +0 -144
  429. package/src/planner/rules/retrieve/rule-grow-retrieve.ts +0 -337
  430. package/src/planner/scopes/aliased.ts +0 -50
  431. package/src/planner/scopes/base.ts +0 -10
  432. package/src/planner/scopes/empty.ts +0 -12
  433. package/src/planner/scopes/global.ts +0 -73
  434. package/src/planner/scopes/multi.ts +0 -40
  435. package/src/planner/scopes/param.ts +0 -95
  436. package/src/planner/scopes/registered.ts +0 -67
  437. package/src/planner/scopes/scope.ts +0 -16
  438. package/src/planner/stats/basic-estimates.ts +0 -107
  439. package/src/planner/stats/index.ts +0 -158
  440. package/src/planner/type-utils.ts +0 -87
  441. package/src/planner/util/key-utils.ts +0 -46
  442. package/src/planner/validation/determinism-validator.ts +0 -104
  443. package/src/planner/validation/plan-validator.ts +0 -335
  444. package/src/runtime/async-util.ts +0 -283
  445. package/src/runtime/cache/shared-cache.ts +0 -169
  446. package/src/runtime/context-helpers.ts +0 -191
  447. package/src/runtime/deferred-constraint-queue.ts +0 -196
  448. package/src/runtime/emission-context.ts +0 -319
  449. package/src/runtime/emit/add-constraint.ts +0 -78
  450. package/src/runtime/emit/aggregate.ts +0 -581
  451. package/src/runtime/emit/array-index.ts +0 -25
  452. package/src/runtime/emit/between.ts +0 -51
  453. package/src/runtime/emit/binary.ts +0 -357
  454. package/src/runtime/emit/block.ts +0 -23
  455. package/src/runtime/emit/cache.ts +0 -64
  456. package/src/runtime/emit/case.ts +0 -87
  457. package/src/runtime/emit/cast.ts +0 -151
  458. package/src/runtime/emit/collate.ts +0 -9
  459. package/src/runtime/emit/column-reference.ts +0 -17
  460. package/src/runtime/emit/constraint-check.ts +0 -290
  461. package/src/runtime/emit/create-assertion.ts +0 -82
  462. package/src/runtime/emit/create-index.ts +0 -15
  463. package/src/runtime/emit/create-table.ts +0 -15
  464. package/src/runtime/emit/create-view.ts +0 -52
  465. package/src/runtime/emit/cte-reference.ts +0 -38
  466. package/src/runtime/emit/cte.ts +0 -39
  467. package/src/runtime/emit/delete.ts +0 -24
  468. package/src/runtime/emit/distinct.ts +0 -40
  469. package/src/runtime/emit/dml-executor.ts +0 -198
  470. package/src/runtime/emit/drop-assertion.ts +0 -45
  471. package/src/runtime/emit/drop-table.ts +0 -27
  472. package/src/runtime/emit/drop-view.ts +0 -49
  473. package/src/runtime/emit/filter.ts +0 -30
  474. package/src/runtime/emit/insert.ts +0 -42
  475. package/src/runtime/emit/internal-recursive-cte-ref.ts +0 -37
  476. package/src/runtime/emit/join.ts +0 -148
  477. package/src/runtime/emit/limit-offset.ts +0 -73
  478. package/src/runtime/emit/literal.ts +0 -17
  479. package/src/runtime/emit/parameter.ts +0 -59
  480. package/src/runtime/emit/pragma.ts +0 -56
  481. package/src/runtime/emit/project.ts +0 -46
  482. package/src/runtime/emit/recursive-cte.ts +0 -111
  483. package/src/runtime/emit/remote-query.ts +0 -47
  484. package/src/runtime/emit/retrieve.ts +0 -15
  485. package/src/runtime/emit/returning.ts +0 -41
  486. package/src/runtime/emit/scalar-function.ts +0 -69
  487. package/src/runtime/emit/scan.ts +0 -106
  488. package/src/runtime/emit/schema-declarative.ts +0 -215
  489. package/src/runtime/emit/sequencing.ts +0 -24
  490. package/src/runtime/emit/set-operation.ts +0 -141
  491. package/src/runtime/emit/sink.ts +0 -27
  492. package/src/runtime/emit/sort.ts +0 -75
  493. package/src/runtime/emit/subquery.ts +0 -203
  494. package/src/runtime/emit/table-valued-function.ts +0 -106
  495. package/src/runtime/emit/temporal-arithmetic.ts +0 -302
  496. package/src/runtime/emit/transaction.ts +0 -205
  497. package/src/runtime/emit/unary.ts +0 -101
  498. package/src/runtime/emit/update.ts +0 -66
  499. package/src/runtime/emit/values.ts +0 -66
  500. package/src/runtime/emit/window-function.ts +0 -42
  501. package/src/runtime/emit/window.ts +0 -458
  502. package/src/runtime/emitters.ts +0 -183
  503. package/src/runtime/register.ts +0 -150
  504. package/src/runtime/scheduler.ts +0 -488
  505. package/src/runtime/types.ts +0 -242
  506. package/src/runtime/utils.ts +0 -177
  507. package/src/schema/assertion.ts +0 -21
  508. package/src/schema/catalog.ts +0 -269
  509. package/src/schema/change-events.ts +0 -80
  510. package/src/schema/column.ts +0 -51
  511. package/src/schema/declared-schema-manager.ts +0 -82
  512. package/src/schema/function.ts +0 -188
  513. package/src/schema/manager.ts +0 -1034
  514. package/src/schema/schema-differ.ts +0 -214
  515. package/src/schema/schema-hasher.ts +0 -26
  516. package/src/schema/schema.ts +0 -222
  517. package/src/schema/table.ts +0 -409
  518. package/src/schema/view.ts +0 -19
  519. package/src/schema/window-function.ts +0 -56
  520. package/src/types/builtin-types.ts +0 -350
  521. package/src/types/index.ts +0 -17
  522. package/src/types/json-type.ts +0 -152
  523. package/src/types/logical-type.ts +0 -91
  524. package/src/types/plugin-interface.ts +0 -10
  525. package/src/types/registry.ts +0 -204
  526. package/src/types/temporal-types.ts +0 -290
  527. package/src/types/validation.ts +0 -120
  528. package/src/util/affinity.ts +0 -151
  529. package/src/util/ast-stringify.ts +0 -887
  530. package/src/util/cached.ts +0 -25
  531. package/src/util/coercion.ts +0 -113
  532. package/src/util/comparison.ts +0 -510
  533. package/src/util/environment.ts +0 -52
  534. package/src/util/hash.ts +0 -90
  535. package/src/util/latches.ts +0 -47
  536. package/src/util/mutation-statement.ts +0 -135
  537. package/src/util/patterns.ts +0 -56
  538. package/src/util/plan-formatter.ts +0 -48
  539. package/src/util/plugin-helper.ts +0 -110
  540. package/src/util/row-descriptor.ts +0 -105
  541. package/src/util/serialization.ts +0 -47
  542. package/src/util/sql-literal.ts +0 -22
  543. package/src/util/working-table-iterable.ts +0 -38
  544. package/src/vtab/best-access-plan.ts +0 -244
  545. package/src/vtab/connection.ts +0 -36
  546. package/src/vtab/filter-info.ts +0 -23
  547. package/src/vtab/index-info.ts +0 -84
  548. package/src/vtab/manifest.ts +0 -86
  549. package/src/vtab/memory/connection.ts +0 -73
  550. package/src/vtab/memory/index.ts +0 -191
  551. package/src/vtab/memory/layer/base-cursor.ts +0 -124
  552. package/src/vtab/memory/layer/base.ts +0 -275
  553. package/src/vtab/memory/layer/connection.ts +0 -203
  554. package/src/vtab/memory/layer/interface.ts +0 -47
  555. package/src/vtab/memory/layer/manager.ts +0 -909
  556. package/src/vtab/memory/layer/safe-iterate.ts +0 -49
  557. package/src/vtab/memory/layer/scan-plan.ts +0 -84
  558. package/src/vtab/memory/layer/transaction-cursor.ts +0 -162
  559. package/src/vtab/memory/layer/transaction.ts +0 -229
  560. package/src/vtab/memory/module.ts +0 -667
  561. package/src/vtab/memory/table.ts +0 -251
  562. package/src/vtab/memory/types.ts +0 -23
  563. package/src/vtab/memory/utils/logging.ts +0 -36
  564. package/src/vtab/memory/utils/primary-key.ts +0 -163
  565. package/src/vtab/module.ts +0 -162
  566. 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
- );