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