@quereus/quereus 4.9.0 → 4.11.0

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 (190) hide show
  1. package/dist/src/core/database.d.ts.map +1 -1
  2. package/dist/src/core/database.js +19 -4
  3. package/dist/src/core/database.js.map +1 -1
  4. package/dist/src/core/statement.d.ts.map +1 -1
  5. package/dist/src/core/statement.js +74 -15
  6. package/dist/src/core/statement.js.map +1 -1
  7. package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
  8. package/dist/src/func/builtins/aggregate.js +85 -33
  9. package/dist/src/func/builtins/aggregate.js.map +1 -1
  10. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  11. package/dist/src/func/builtins/explain.js +9 -2
  12. package/dist/src/func/builtins/explain.js.map +1 -1
  13. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  14. package/dist/src/func/builtins/scalar.js +4 -2
  15. package/dist/src/func/builtins/scalar.js.map +1 -1
  16. package/dist/src/func/registration.d.ts +6 -0
  17. package/dist/src/func/registration.d.ts.map +1 -1
  18. package/dist/src/func/registration.js +1 -0
  19. package/dist/src/func/registration.js.map +1 -1
  20. package/dist/src/index.d.ts +1 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +6 -0
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/planner/building/constraint-builder.d.ts +3 -2
  25. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  26. package/dist/src/planner/building/constraint-builder.js +15 -24
  27. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  28. package/dist/src/planner/building/delete.d.ts.map +1 -1
  29. package/dist/src/planner/building/delete.js +7 -24
  30. package/dist/src/planner/building/delete.js.map +1 -1
  31. package/dist/src/planner/building/foreign-key-builder.d.ts +3 -2
  32. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  33. package/dist/src/planner/building/foreign-key-builder.js +13 -17
  34. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  35. package/dist/src/planner/building/insert.d.ts.map +1 -1
  36. package/dist/src/planner/building/insert.js +16 -32
  37. package/dist/src/planner/building/insert.js.map +1 -1
  38. package/dist/src/planner/building/mutation-context.d.ts +63 -0
  39. package/dist/src/planner/building/mutation-context.d.ts.map +1 -0
  40. package/dist/src/planner/building/mutation-context.js +126 -0
  41. package/dist/src/planner/building/mutation-context.js.map +1 -0
  42. package/dist/src/planner/building/update.d.ts.map +1 -1
  43. package/dist/src/planner/building/update.js +7 -24
  44. package/dist/src/planner/building/update.js.map +1 -1
  45. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  46. package/dist/src/planner/nodes/scalar.js +13 -1
  47. package/dist/src/planner/nodes/scalar.js.map +1 -1
  48. package/dist/src/runtime/emission-context.d.ts +14 -1
  49. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  50. package/dist/src/runtime/emission-context.js +17 -5
  51. package/dist/src/runtime/emission-context.js.map +1 -1
  52. package/dist/src/runtime/emit/aggregate-setup.d.ts +44 -8
  53. package/dist/src/runtime/emit/aggregate-setup.d.ts.map +1 -1
  54. package/dist/src/runtime/emit/aggregate-setup.js +79 -15
  55. package/dist/src/runtime/emit/aggregate-setup.js.map +1 -1
  56. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  57. package/dist/src/runtime/emit/aggregate.js +21 -106
  58. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  59. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  60. package/dist/src/runtime/emit/alter-table.js +11 -2
  61. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  62. package/dist/src/runtime/emit/asof-scan.js +1 -1
  63. package/dist/src/runtime/emit/asof-scan.js.map +1 -1
  64. package/dist/src/runtime/emit/between.d.ts +2 -0
  65. package/dist/src/runtime/emit/between.d.ts.map +1 -1
  66. package/dist/src/runtime/emit/between.js +7 -8
  67. package/dist/src/runtime/emit/between.js.map +1 -1
  68. package/dist/src/runtime/emit/binary.d.ts +27 -5
  69. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  70. package/dist/src/runtime/emit/binary.js +266 -177
  71. package/dist/src/runtime/emit/binary.js.map +1 -1
  72. package/dist/src/runtime/emit/case.d.ts +34 -0
  73. package/dist/src/runtime/emit/case.d.ts.map +1 -1
  74. package/dist/src/runtime/emit/case.js +18 -11
  75. package/dist/src/runtime/emit/case.js.map +1 -1
  76. package/dist/src/runtime/emit/cast.d.ts +2 -0
  77. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  78. package/dist/src/runtime/emit/cast.js +7 -5
  79. package/dist/src/runtime/emit/cast.js.map +1 -1
  80. package/dist/src/runtime/emit/column-reference.d.ts +3 -1
  81. package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
  82. package/dist/src/runtime/emit/column-reference.js +6 -2
  83. package/dist/src/runtime/emit/column-reference.js.map +1 -1
  84. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  85. package/dist/src/runtime/emit/constraint-check.js +17 -7
  86. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  87. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  88. package/dist/src/runtime/emit/dml-executor.js +26 -1
  89. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  90. package/dist/src/runtime/emit/filter.d.ts +1 -1
  91. package/dist/src/runtime/emit/filter.js +1 -1
  92. package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
  93. package/dist/src/runtime/emit/hash-aggregate.js +18 -88
  94. package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
  95. package/dist/src/runtime/emit/literal.d.ts +14 -1
  96. package/dist/src/runtime/emit/literal.d.ts.map +1 -1
  97. package/dist/src/runtime/emit/literal.js +33 -7
  98. package/dist/src/runtime/emit/literal.js.map +1 -1
  99. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +7 -1
  100. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
  101. package/dist/src/runtime/emit/materialized-view-helpers.js +121 -32
  102. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
  103. package/dist/src/runtime/emit/parameter.d.ts +3 -1
  104. package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
  105. package/dist/src/runtime/emit/parameter.js +7 -2
  106. package/dist/src/runtime/emit/parameter.js.map +1 -1
  107. package/dist/src/runtime/emit/scalar-function.d.ts +29 -1
  108. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  109. package/dist/src/runtime/emit/scalar-function.js +66 -16
  110. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  111. package/dist/src/runtime/emit/scalar-op.d.ts +63 -0
  112. package/dist/src/runtime/emit/scalar-op.d.ts.map +1 -0
  113. package/dist/src/runtime/emit/scalar-op.js +37 -0
  114. package/dist/src/runtime/emit/scalar-op.js.map +1 -0
  115. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  116. package/dist/src/runtime/emit/scan.js +19 -1
  117. package/dist/src/runtime/emit/scan.js.map +1 -1
  118. package/dist/src/runtime/emit/temporal-arithmetic.d.ts +18 -8
  119. package/dist/src/runtime/emit/temporal-arithmetic.d.ts.map +1 -1
  120. package/dist/src/runtime/emit/temporal-arithmetic.js +29 -311
  121. package/dist/src/runtime/emit/temporal-arithmetic.js.map +1 -1
  122. package/dist/src/runtime/emit/unary.d.ts +2 -0
  123. package/dist/src/runtime/emit/unary.d.ts.map +1 -1
  124. package/dist/src/runtime/emit/unary.js +125 -53
  125. package/dist/src/runtime/emit/unary.js.map +1 -1
  126. package/dist/src/runtime/emitters.d.ts +22 -0
  127. package/dist/src/runtime/emitters.d.ts.map +1 -1
  128. package/dist/src/runtime/emitters.js +29 -0
  129. package/dist/src/runtime/emitters.js.map +1 -1
  130. package/dist/src/runtime/scalar-fusion.d.ts +47 -0
  131. package/dist/src/runtime/scalar-fusion.d.ts.map +1 -0
  132. package/dist/src/runtime/scalar-fusion.js +275 -0
  133. package/dist/src/runtime/scalar-fusion.js.map +1 -0
  134. package/dist/src/runtime/strict-flags.d.ts +9 -0
  135. package/dist/src/runtime/strict-flags.d.ts.map +1 -1
  136. package/dist/src/runtime/strict-flags.js +9 -0
  137. package/dist/src/runtime/strict-flags.js.map +1 -1
  138. package/dist/src/runtime/strict-fork.js +2 -2
  139. package/dist/src/runtime/strict-fork.js.map +1 -1
  140. package/dist/src/runtime/strict-representation.d.ts +78 -0
  141. package/dist/src/runtime/strict-representation.d.ts.map +1 -0
  142. package/dist/src/runtime/strict-representation.js +159 -0
  143. package/dist/src/runtime/strict-representation.js.map +1 -0
  144. package/dist/src/schema/catalog.d.ts +25 -2
  145. package/dist/src/schema/catalog.d.ts.map +1 -1
  146. package/dist/src/schema/catalog.js +35 -2
  147. package/dist/src/schema/catalog.js.map +1 -1
  148. package/dist/src/schema/constraint-builder.d.ts +15 -2
  149. package/dist/src/schema/constraint-builder.d.ts.map +1 -1
  150. package/dist/src/schema/constraint-builder.js +21 -5
  151. package/dist/src/schema/constraint-builder.js.map +1 -1
  152. package/dist/src/schema/function.d.ts +15 -0
  153. package/dist/src/schema/function.d.ts.map +1 -1
  154. package/dist/src/schema/function.js.map +1 -1
  155. package/dist/src/schema/manager.d.ts +13 -0
  156. package/dist/src/schema/manager.d.ts.map +1 -1
  157. package/dist/src/schema/manager.js +44 -11
  158. package/dist/src/schema/manager.js.map +1 -1
  159. package/dist/src/schema/table.d.ts +43 -0
  160. package/dist/src/schema/table.d.ts.map +1 -1
  161. package/dist/src/schema/table.js +80 -0
  162. package/dist/src/schema/table.js.map +1 -1
  163. package/dist/src/types/builtin-types.d.ts.map +1 -1
  164. package/dist/src/types/builtin-types.js +17 -8
  165. package/dist/src/types/builtin-types.js.map +1 -1
  166. package/dist/src/types/temporal-ops.d.ts +119 -0
  167. package/dist/src/types/temporal-ops.d.ts.map +1 -0
  168. package/dist/src/types/temporal-ops.js +348 -0
  169. package/dist/src/types/temporal-ops.js.map +1 -0
  170. package/dist/src/types/temporal-types.d.ts.map +1 -1
  171. package/dist/src/types/temporal-types.js +8 -3
  172. package/dist/src/types/temporal-types.js.map +1 -1
  173. package/dist/src/util/coercion.d.ts +22 -7
  174. package/dist/src/util/coercion.d.ts.map +1 -1
  175. package/dist/src/util/coercion.js +28 -15
  176. package/dist/src/util/coercion.js.map +1 -1
  177. package/dist/src/util/comparison.d.ts +25 -0
  178. package/dist/src/util/comparison.d.ts.map +1 -1
  179. package/dist/src/util/comparison.js +25 -0
  180. package/dist/src/util/comparison.js.map +1 -1
  181. package/dist/src/util/key-tuple-codec.d.ts +12 -3
  182. package/dist/src/util/key-tuple-codec.d.ts.map +1 -1
  183. package/dist/src/util/key-tuple-codec.js.map +1 -1
  184. package/dist/src/util/numeric-canonical.d.ts +26 -0
  185. package/dist/src/util/numeric-canonical.d.ts.map +1 -0
  186. package/dist/src/util/numeric-canonical.js +66 -0
  187. package/dist/src/util/numeric-canonical.js.map +1 -0
  188. package/dist/src/vtab/module.d.ts +25 -0
  189. package/dist/src/vtab/module.d.ts.map +1 -1
  190. package/package.json +4 -3
@@ -1,323 +1,29 @@
1
- import { StatusCode } from "../../common/types.js";
2
- import { QuereusError } from "../../common/errors.js";
3
- import { asRun } from "../types.js";
4
- import { emitPlanNode } from "../emitters.js";
5
- import { Temporal } from 'temporal-polyfill';
6
1
  import { TIMESPAN_TYPE } from "../../types/temporal-types.js";
7
- /**
8
- * Check if a value is a date string (YYYY-MM-DD format)
9
- */
10
- function isDateValue(v) {
11
- if (typeof v !== 'string')
12
- return false;
13
- // Simple check for ISO 8601 date format
14
- return /^\d{4}-\d{2}-\d{2}$/.test(v);
15
- }
16
- /**
17
- * Check if a value is a time string (HH:MM:SS format)
18
- */
19
- function isTimeValue(v) {
20
- if (typeof v !== 'string')
21
- return false;
22
- // Simple check for ISO 8601 time format
23
- return /^\d{2}:\d{2}:\d{2}/.test(v);
24
- }
25
- /**
26
- * Check if a value is a datetime string (ISO 8601 format)
27
- */
28
- function isDateTimeValue(v) {
29
- if (typeof v !== 'string')
30
- return false;
31
- // Check for ISO 8601 datetime format (with T separator)
32
- return v.includes('T') && /^\d{4}-\d{2}-\d{2}T/.test(v);
33
- }
34
- /**
35
- * Check if a value is a timespan/duration string (ISO 8601 duration format)
36
- */
37
- function isTimespanValue(v) {
38
- if (typeof v !== 'string')
39
- return false;
40
- // ISO 8601 duration starts with P (or -P for negative)
41
- return v.startsWith('P') || v.startsWith('-P');
42
- }
43
- /**
44
- * Check if a Temporal.Duration contains calendar units (years, months, weeks)
45
- * that cannot be converted to a single time unit without a relativeTo reference.
46
- */
47
- function hasCalendarUnits(d) {
48
- return d.years !== 0 || d.months !== 0 || d.weeks !== 0;
49
- }
50
- /**
51
- * Scale each field of a duration by a factor.
52
- * Works for both calendar and non-calendar durations.
53
- */
54
- function scaleDuration(d, factor) {
55
- return Temporal.Duration.from({
56
- years: d.years * factor,
57
- months: d.months * factor,
58
- weeks: d.weeks * factor,
59
- days: d.days * factor,
60
- hours: d.hours * factor,
61
- minutes: d.minutes * factor,
62
- seconds: d.seconds * factor,
63
- milliseconds: d.milliseconds * factor,
64
- microseconds: d.microseconds * factor,
65
- nanoseconds: d.nanoseconds * factor,
66
- });
67
- }
68
- /**
69
- * Divide a duration's fields by a divisor, cascading remainders to smaller units.
70
- * Cascade chain: years→months(×12), weeks→days(×7), days→hours(×24),
71
- * hours→minutes(×60), minutes→seconds(×60), seconds→ms(×1000),
72
- * ms→μs(×1000), μs→ns(×1000).
73
- * Note: months cannot cascade to days (variable month length).
74
- */
75
- function divideDuration(d, divisor) {
76
- // Cascade pairs: [field, next-field, conversion-factor]
77
- const cascade = [
78
- ['years', 'months', 12],
79
- // months→days gap: no fixed conversion
80
- ['weeks', 'days', 7],
81
- ['days', 'hours', 24],
82
- ['hours', 'minutes', 60],
83
- ['minutes', 'seconds', 60],
84
- ['seconds', 'milliseconds', 1000],
85
- ['milliseconds', 'microseconds', 1000],
86
- ['microseconds', 'nanoseconds', 1000],
87
- ];
88
- // Build a mutable map of field values
89
- const fields = {
90
- years: d.years, months: d.months, weeks: d.weeks,
91
- days: d.days, hours: d.hours, minutes: d.minutes,
92
- seconds: d.seconds, milliseconds: d.milliseconds,
93
- microseconds: d.microseconds, nanoseconds: d.nanoseconds,
94
- };
95
- for (const [field, nextField, factor] of cascade) {
96
- const value = fields[field];
97
- const quotient = Math.trunc(value / divisor);
98
- const remainder = value - quotient * divisor;
99
- fields[field] = quotient;
100
- fields[nextField] += remainder * factor;
101
- }
102
- // Final field (nanoseconds) — just divide, truncate to integer
103
- fields['nanoseconds'] = Math.trunc(fields['nanoseconds'] / divisor);
104
- // Handle months independently (not part of cascade chain above for months→days)
105
- // months was already accumulated from years cascade; now divide it
106
- const monthQuotient = Math.trunc(fields['months'] / divisor);
107
- const monthRemainder = fields['months'] - monthQuotient * divisor;
108
- fields['months'] = monthQuotient;
109
- // Fractional months can't be converted to days; truncate
110
- if (monthRemainder !== 0) {
111
- // Best-effort: drop sub-month remainder since we can't convert to days
112
- }
113
- return Temporal.Duration.from({
114
- years: fields['years'],
115
- months: fields['months'],
116
- weeks: fields['weeks'],
117
- days: fields['days'],
118
- hours: fields['hours'],
119
- minutes: fields['minutes'],
120
- seconds: fields['seconds'],
121
- milliseconds: fields['milliseconds'],
122
- microseconds: fields['microseconds'],
123
- nanoseconds: fields['nanoseconds'],
124
- });
125
- }
2
+ import { isTemporalKind, runTemporalCase, temporalKindOfValue, temporalOpCase, unsupportedTemporalOp, } from "../../types/temporal-ops.js";
126
3
  /**
127
4
  * Try to perform temporal arithmetic on two values.
128
5
  * Returns the result if successful, or undefined if the values are not temporal types.
129
6
  * Throws QuereusError if the operation is invalid.
7
+ *
8
+ * Which combinations exist, what each produces, and what each announces as its result
9
+ * type all live in one table (`types/temporal-ops.ts`) that the planner reads too. This
10
+ * function is the *value-sniffed* entry into that table: it derives both operand kinds
11
+ * from the runtime values, which is the defined behavior whenever the declared types
12
+ * cannot settle the case (a TEXT column holding a duration string, for instance).
130
13
  */
131
14
  export function tryTemporalArithmetic(operator, v1, v2) {
132
15
  if (v1 === null || v2 === null)
133
16
  return null;
134
- // Detect types at runtime
135
- const isV1Date = isDateValue(v1);
136
- const isV1Time = isTimeValue(v1);
137
- const isV1DateTime = isDateTimeValue(v1);
138
- const isV1Timespan = isTimespanValue(v1);
139
- const isV2Date = isDateValue(v2);
140
- const isV2Time = isTimeValue(v2);
141
- const isV2DateTime = isDateTimeValue(v2);
142
- const isV2Timespan = isTimespanValue(v2);
143
- // If neither operand is temporal, return undefined to signal non-temporal operation
144
- const isV1Temporal = isV1Date || isV1Time || isV1DateTime || isV1Timespan;
145
- const isV2Temporal = isV2Date || isV2Time || isV2DateTime || isV2Timespan;
146
- if (!isV1Temporal && !isV2Temporal) {
17
+ const lk = temporalKindOfValue(v1);
18
+ const rk = temporalKindOfValue(v2);
19
+ // Neither operand looks temporal — signal "not a temporal operation" so the caller
20
+ // falls through to numeric arithmetic. ('number' is a kind, but not a temporal one.)
21
+ if (!isTemporalKind(lk) && !isTemporalKind(rk))
147
22
  return undefined;
148
- }
149
- try {
150
- // DATE/DATETIME - DATE/DATETIME → TIMESPAN
151
- if (operator === '-' &&
152
- (isV1Date || isV1DateTime) &&
153
- (isV2Date || isV2DateTime)) {
154
- // Parse both values as dates
155
- const date1 = isV1DateTime
156
- ? Temporal.PlainDateTime.from(v1).toPlainDate()
157
- : Temporal.PlainDate.from(v1);
158
- const date2 = isV2DateTime
159
- ? Temporal.PlainDateTime.from(v2).toPlainDate()
160
- : Temporal.PlainDate.from(v2);
161
- const duration = date1.since(date2);
162
- return duration.toString();
163
- }
164
- // TIME - TIME → TIMESPAN
165
- if (operator === '-' && isV1Time && isV2Time) {
166
- const time1 = Temporal.PlainTime.from(v1);
167
- const time2 = Temporal.PlainTime.from(v2);
168
- const duration = time1.since(time2);
169
- return duration.toString();
170
- }
171
- // DATE + TIMESPAN → DATE
172
- if (operator === '+' && isV1Date && isV2Timespan) {
173
- const date = Temporal.PlainDate.from(v1);
174
- const duration = Temporal.Duration.from(v2);
175
- const result = date.add(duration);
176
- return result.toString();
177
- }
178
- // TIMESPAN + DATE → DATE (commutative)
179
- if (operator === '+' && isV1Timespan && isV2Date) {
180
- const duration = Temporal.Duration.from(v1);
181
- const date = Temporal.PlainDate.from(v2);
182
- const result = date.add(duration);
183
- return result.toString();
184
- }
185
- // DATE - TIMESPAN → DATE
186
- if (operator === '-' && isV1Date && isV2Timespan) {
187
- const date = Temporal.PlainDate.from(v1);
188
- const duration = Temporal.Duration.from(v2);
189
- const result = date.subtract(duration);
190
- return result.toString();
191
- }
192
- // DATETIME + TIMESPAN → DATETIME
193
- if (operator === '+' && isV1DateTime && isV2Timespan) {
194
- const dt = Temporal.PlainDateTime.from(v1);
195
- const duration = Temporal.Duration.from(v2);
196
- const result = dt.add(duration);
197
- return result.toString();
198
- }
199
- // TIMESPAN + DATETIME → DATETIME (commutative)
200
- if (operator === '+' && isV1Timespan && isV2DateTime) {
201
- const duration = Temporal.Duration.from(v1);
202
- const dt = Temporal.PlainDateTime.from(v2);
203
- const result = dt.add(duration);
204
- return result.toString();
205
- }
206
- // DATETIME - TIMESPAN → DATETIME
207
- if (operator === '-' && isV1DateTime && isV2Timespan) {
208
- const dt = Temporal.PlainDateTime.from(v1);
209
- const duration = Temporal.Duration.from(v2);
210
- const result = dt.subtract(duration);
211
- return result.toString();
212
- }
213
- // TIME + TIMESPAN → TIME
214
- if (operator === '+' && isV1Time && isV2Timespan) {
215
- const time = Temporal.PlainTime.from(v1);
216
- const duration = Temporal.Duration.from(v2);
217
- const result = time.add(duration);
218
- return result.toString();
219
- }
220
- // TIMESPAN + TIME → TIME (commutative)
221
- if (operator === '+' && isV1Timespan && isV2Time) {
222
- const duration = Temporal.Duration.from(v1);
223
- const time = Temporal.PlainTime.from(v2);
224
- const result = time.add(duration);
225
- return result.toString();
226
- }
227
- // TIME - TIMESPAN → TIME
228
- if (operator === '-' && isV1Time && isV2Timespan) {
229
- const time = Temporal.PlainTime.from(v1);
230
- const duration = Temporal.Duration.from(v2);
231
- const result = time.subtract(duration);
232
- return result.toString();
233
- }
234
- // TIMESPAN + TIMESPAN → TIMESPAN
235
- if (operator === '+' && isV1Timespan && isV2Timespan) {
236
- const d1 = Temporal.Duration.from(v1);
237
- const d2 = Temporal.Duration.from(v2);
238
- const result = d1.add(d2);
239
- return result.toString();
240
- }
241
- // TIMESPAN - TIMESPAN → TIMESPAN
242
- if (operator === '-' && isV1Timespan && isV2Timespan) {
243
- const d1 = Temporal.Duration.from(v1);
244
- const d2 = Temporal.Duration.from(v2);
245
- const result = d1.subtract(d2);
246
- return result.toString();
247
- }
248
- // TIMESPAN * NUMBER → TIMESPAN
249
- if (operator === '*' && isV1Timespan && typeof v2 === 'number') {
250
- const duration = Temporal.Duration.from(v1);
251
- if (hasCalendarUnits(duration)) {
252
- return scaleDuration(duration, v2).toString();
253
- }
254
- const totalSeconds = duration.total({ unit: 'seconds' });
255
- const newDuration = Temporal.Duration.from({ seconds: totalSeconds * v2 });
256
- return newDuration.toString();
257
- }
258
- // NUMBER * TIMESPAN → TIMESPAN (commutative)
259
- if (operator === '*' && typeof v1 === 'number' && isV2Timespan) {
260
- const duration = Temporal.Duration.from(v2);
261
- if (hasCalendarUnits(duration)) {
262
- return scaleDuration(duration, v1).toString();
263
- }
264
- const totalSeconds = duration.total({ unit: 'seconds' });
265
- const newDuration = Temporal.Duration.from({ seconds: totalSeconds * v1 });
266
- return newDuration.toString();
267
- }
268
- // TIMESPAN / NUMBER → TIMESPAN
269
- if (operator === '/' && isV1Timespan && typeof v2 === 'number') {
270
- if (v2 === 0)
271
- return null;
272
- const duration = Temporal.Duration.from(v1);
273
- if (hasCalendarUnits(duration)) {
274
- return divideDuration(duration, v2).toString();
275
- }
276
- const totalSeconds = duration.total({ unit: 'seconds' });
277
- const newDuration = Temporal.Duration.from({ seconds: totalSeconds / v2 });
278
- return newDuration.toString();
279
- }
280
- // TIMESPAN / TIMESPAN → NUMBER (ratio)
281
- if (operator === '/' && isV1Timespan && isV2Timespan) {
282
- const d1 = Temporal.Duration.from(v1);
283
- const d2 = Temporal.Duration.from(v2);
284
- if (hasCalendarUnits(d1) || hasCalendarUnits(d2)) {
285
- // Cannot compute a numeric ratio when calendar units are involved
286
- // (months/years have variable lengths without a reference date)
287
- return null;
288
- }
289
- const total1 = d1.total({ unit: 'seconds' });
290
- const total2 = d2.total({ unit: 'seconds' });
291
- if (total2 === 0)
292
- return null;
293
- return total1 / total2;
294
- }
295
- // If we get here, the operation is not supported
296
- throw new QuereusError(`Unsupported temporal operation`, StatusCode.UNSUPPORTED);
297
- }
298
- catch (e) {
299
- // Invalid temporal operation - return null
300
- if (e instanceof QuereusError)
301
- throw e;
302
- return null;
303
- }
304
- }
305
- /**
306
- * Emit temporal arithmetic operations
307
- * Handles operations between temporal types (DATE, TIME, DATETIME, TIMESPAN)
308
- */
309
- export function emitTemporalArithmetic(plan, ctx) {
310
- const operator = plan.expression.operator;
311
- function run(ctx, v1, v2) {
312
- return tryTemporalArithmetic(operator, v1, v2) ?? null;
313
- }
314
- const leftExpr = emitPlanNode(plan.left, ctx);
315
- const rightExpr = emitPlanNode(plan.right, ctx);
316
- return {
317
- params: [leftExpr, rightExpr],
318
- run: asRun(run),
319
- note: `${operator}(temporal)`
320
- };
23
+ const entry = lk && rk ? temporalOpCase(operator, lk, rk) : undefined;
24
+ if (!entry)
25
+ unsupportedTemporalOp();
26
+ return runTemporalCase(entry, v1, v2);
321
27
  }
322
28
  /**
323
29
  * Attempts to perform temporal comparison. Returns undefined if not a temporal comparison.
@@ -330,6 +36,18 @@ export function emitTemporalArithmetic(plan, ctx) {
330
36
  * Note: DATE, TIME, and DATETIME use ISO 8601 format which compares correctly lexicographically,
331
37
  * so they don't need special handling here.
332
38
  *
39
+ * NOTE: deliberately NOT given the emit-time specialization `buildNumericOpSpec`'s temporal
40
+ * arm got. The shapes look alike, but the economics do not:
41
+ * - the per-row cost here is one `startsWith` per operand, not four regexes — TIMESPAN is
42
+ * the only temporal type whose text order differs from its semantic order, so it is the
43
+ * only one {@link tryTemporalCompare} probes for;
44
+ * - `buildComparisonOpSpec` already bypasses this function for the hot case: two operands
45
+ * of the same semantic-ordering type take the `sharedSemanticType` path
46
+ * (`=(compare-typed)`) and never reach the generic comparison run;
47
+ * - what is left is the mixed TIMESPAN-vs-TEXT/ANY shape, where runtime sniffing is the
48
+ * defined semantics and cannot be resolved from the declared types anyway.
49
+ * Revisit only if a profile shows the generic comparison run hot on temporal operands.
50
+ *
333
51
  * @param operator The comparison operator (=, !=, <, <=, >, >=)
334
52
  * @param v1 First value
335
53
  * @param v2 Second value
@@ -367,7 +85,7 @@ export function tryTemporalComparison(operator, v1, v2) {
367
85
  export function tryTemporalCompare(v1, v2) {
368
86
  // Timespans are the only temporal type that needs special comparison logic
369
87
  // because ISO 8601 duration strings don't compare correctly lexicographically
370
- if (!isTimespanValue(v1) || !isTimespanValue(v2))
88
+ if (temporalKindOfValue(v1) !== 'timespan' || temporalKindOfValue(v2) !== 'timespan')
371
89
  return undefined;
372
90
  return TIMESPAN_TYPE.compare(v1, v2);
373
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"temporal-arithmetic.js","sourceRoot":"","sources":["../../../../src/runtime/emit/temporal-arithmetic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"temporal-arithmetic.js","sourceRoot":"","sources":["../../../../src/runtime/emit/temporal-arithmetic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACN,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACrB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,EAAY,EAAE,EAAY;IACjF,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAEnC,mFAAmF;IACnF,qFAAqF;IACrF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,IAAI,CAAC,KAAK;QAAE,qBAAqB,EAAE,CAAC;IACpC,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,EAAY,EAAE,EAAY;IACjF,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAExC,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,GAAG,CAAC;QACT,KAAK,IAAI;YACR,OAAO,GAAG,KAAK,CAAC,CAAC;QAClB,KAAK,IAAI,CAAC;QACV,KAAK,IAAI;YACR,OAAO,GAAG,KAAK,CAAC,CAAC;QAClB,KAAK,GAAG;YACP,OAAO,GAAG,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI;YACR,OAAO,GAAG,IAAI,CAAC,CAAC;QACjB,KAAK,GAAG;YACP,OAAO,GAAG,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI;YACR,OAAO,GAAG,IAAI,CAAC,CAAC;QACjB;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAY,EAAE,EAAY;IAC5D,2EAA2E;IAC3E,8EAA8E;IAC9E,IAAI,mBAAmB,CAAC,EAAE,CAAC,KAAK,UAAU,IAAI,mBAAmB,CAAC,EAAE,CAAC,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACvG,OAAO,aAAa,CAAC,OAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { Instruction } from "../types.js";
2
2
  import type { UnaryOpNode } from "../../planner/nodes/scalar.js";
3
3
  import type { EmissionContext } from "../emission-context.js";
4
+ import { type ScalarOpSpec } from "./scalar-op.js";
5
+ export declare function buildUnaryOpSpec(plan: UnaryOpNode): ScalarOpSpec;
4
6
  export declare function emitUnaryOp(plan: UnaryOpNode, ctx: EmissionContext): Instruction;
5
7
  //# sourceMappingURL=unary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unary.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/unary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CA0HhF"}
1
+ {"version":3,"file":"unary.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/unary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyBjE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAoKhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAEhF"}
@@ -1,15 +1,37 @@
1
1
  import { StatusCode } from "../../common/types.js";
2
2
  import { quereusError } from "../../common/errors.js";
3
- import { asRun } from "../types.js";
4
- import { emitPlanNode } from "../emitters.js";
3
+ import { emitScalarOp } from "./scalar-op.js";
5
4
  import { isTruthy } from "../../util/comparison.js";
5
+ import { canonicalizeInteger } from "../../util/numeric-canonical.js";
6
6
  import { Temporal } from 'temporal-polyfill';
7
- export function emitUnaryOp(plan, ctx) {
7
+ import { TIMESPAN_TYPE } from "../../types/temporal-types.js";
8
+ /**
9
+ * `~v = -v - 1` over the engine's arbitrary-precision integer domain.
10
+ *
11
+ * JS's `~` operator coerces through ToInt32 first, so it is only correct below 2^31:
12
+ * `~3000000000` evaluates to 1294967295 instead of -3000000001. Complement
13
+ * arithmetically instead and canonicalize the result (R1, util/numeric-canonical.ts) —
14
+ * `~(2^53 - 1)` leaves the safe range and must widen, `~(-2^53)` re-enters it and must
15
+ * narrow.
16
+ *
17
+ * A non-finite operand keeps the historical `~ToInt32(x)` result of -1; see the NaN
18
+ * note at the numeric-fast call site.
19
+ */
20
+ function bitwiseNot(operand) {
21
+ const truncated = typeof operand === 'bigint' ? operand : Math.trunc(operand);
22
+ if (typeof truncated === 'number' && !Number.isFinite(truncated))
23
+ return -1;
24
+ const exact = canonicalizeInteger(truncated);
25
+ return canonicalizeInteger(typeof exact === 'bigint' ? -exact - 1n : -exact - 1);
26
+ }
27
+ export function buildUnaryOpSpec(plan) {
8
28
  // Select the operation function at emit time
9
29
  let run;
10
30
  let note;
11
31
  // Normalize operator to uppercase for case-insensitive matching
12
32
  const operator = plan.expression.operator.toUpperCase();
33
+ // Plan-time operand type — drives the specialized arithmetic paths below.
34
+ const operandLogical = plan.operand.getType().logicalType;
13
35
  switch (operator) {
14
36
  case 'NOT':
15
37
  run = (_ctx, operand) => {
@@ -60,65 +82,115 @@ export function emitUnaryOp(plan, ctx) {
60
82
  };
61
83
  note = 'IS NOT FALSE';
62
84
  break;
63
- case '-':
64
- run = (_ctx, operand) => {
65
- if (operand === null)
66
- return null;
67
- // Check if it's a timespan (ISO 8601 duration string)
68
- if (typeof operand === 'string' && (operand.startsWith('P') || operand.startsWith('-P'))) {
69
- try {
70
- const duration = Temporal.Duration.from(operand);
71
- return duration.negated().toString();
85
+ case '-': {
86
+ // Use plan-time type info to select a specialized run function, mirroring
87
+ // the binary arithmetic emitter's numeric-fast / temporal split.
88
+ if (operandLogical.isNumeric) {
89
+ run = (_ctx, operand) => {
90
+ if (operand === null)
91
+ return null;
92
+ // Bigint arm narrows the result back to number when it fits (R1);
93
+ // on canonical input negation preserves magnitude, so this only
94
+ // fires for a non-canonical bigint from a vtab/UDF.
95
+ return typeof operand === 'bigint' ? canonicalizeInteger(-operand) : -operand;
96
+ };
97
+ note = '-(numeric-fast)';
98
+ }
99
+ else if (operandLogical === TIMESPAN_TYPE) {
100
+ run = (_ctx, operand) => {
101
+ if (operand === null)
102
+ return null;
103
+ return Temporal.Duration.from(operand).negated().toString();
104
+ };
105
+ note = '-(timespan)';
106
+ }
107
+ else {
108
+ run = (_ctx, operand) => {
109
+ if (operand === null)
110
+ return null;
111
+ // Check if it's a timespan (ISO 8601 duration string)
112
+ if (typeof operand === 'string' && (operand.startsWith('P') || operand.startsWith('-P'))) {
113
+ try {
114
+ const duration = Temporal.Duration.from(operand);
115
+ return duration.negated().toString();
116
+ }
117
+ catch {
118
+ // Not a valid duration, fall through to numeric handling
119
+ }
72
120
  }
73
- catch {
74
- // Not a valid duration, fall through to numeric handling
75
- }
76
- }
77
- // Numeric negation
78
- if (typeof operand === 'number')
79
- return -operand;
80
- if (typeof operand === 'bigint')
81
- return -operand;
82
- // Try to convert to number
83
- const num = Number(operand);
84
- return isNaN(num) ? null : -num;
85
- };
86
- note = 'unary -';
121
+ // Numeric negation
122
+ if (typeof operand === 'number')
123
+ return -operand;
124
+ if (typeof operand === 'bigint')
125
+ return canonicalizeInteger(-operand);
126
+ // Try to convert to number
127
+ const num = Number(operand);
128
+ return isNaN(num) ? null : -num;
129
+ };
130
+ note = 'unary -';
131
+ }
87
132
  break;
88
- case '+':
89
- run = (_ctx, operand) => {
90
- // Unary plus - convert to number if possible
91
- if (operand === null)
92
- return null;
93
- if (typeof operand === 'number' || typeof operand === 'bigint')
94
- return operand;
95
- const plusNum = Number(operand);
96
- return isNaN(plusNum) ? null : plusNum;
97
- };
98
- note = 'unary +';
133
+ }
134
+ case '+': {
135
+ if (operandLogical.isNumeric) {
136
+ // Already number/bigint — unary plus is the identity.
137
+ run = (_ctx, operand) => operand;
138
+ note = '+(numeric-fast)';
139
+ }
140
+ else {
141
+ run = (_ctx, operand) => {
142
+ // Unary plus - convert to number if possible
143
+ if (operand === null)
144
+ return null;
145
+ if (typeof operand === 'number' || typeof operand === 'bigint')
146
+ return operand;
147
+ const plusNum = Number(operand);
148
+ return isNaN(plusNum) ? null : plusNum;
149
+ };
150
+ note = 'unary +';
151
+ }
99
152
  break;
100
- case '~':
101
- run = (_ctx, operand) => {
102
- if (operand === null)
103
- return null;
104
- if (typeof operand === 'bigint')
105
- return ~operand;
106
- // Convert to integer and apply bitwise NOT
107
- const num = Number(operand);
108
- if (isNaN(num))
109
- return null;
110
- return ~Math.trunc(num);
111
- };
112
- note = 'bitwise ~';
153
+ }
154
+ case '~': {
155
+ if (operandLogical.isNumeric) {
156
+ // Already number/bigint — skip the Number() conversion attempt.
157
+ // NOTE: a NaN operand yields -1 here where the generic path below yields
158
+ // null. No numeric-typed expression can produce NaN today (arithmetic
159
+ // nulls out non-finite results, and REAL_TYPE.parse rejects 'NaN'); if a
160
+ // path ever admits NaN into a numeric-typed value, restore an isNaN check.
161
+ run = (_ctx, operand) => {
162
+ if (operand === null)
163
+ return null;
164
+ return bitwiseNot(operand);
165
+ };
166
+ note = '~(numeric-fast)';
167
+ }
168
+ else {
169
+ run = (_ctx, operand) => {
170
+ if (operand === null)
171
+ return null;
172
+ if (typeof operand === 'bigint')
173
+ return bitwiseNot(operand);
174
+ // Convert to integer and apply bitwise NOT
175
+ const num = Number(operand);
176
+ if (isNaN(num))
177
+ return null;
178
+ return bitwiseNot(num);
179
+ };
180
+ note = 'bitwise ~';
181
+ }
113
182
  break;
183
+ }
114
184
  default:
115
185
  quereusError(`Unsupported unary operator: ${plan.expression.operator}`, StatusCode.UNSUPPORTED, undefined, plan.expression);
116
186
  }
117
- const operandExpr = emitPlanNode(plan.operand, ctx);
118
187
  return {
119
- params: [operandExpr],
120
- run: asRun(run),
188
+ operands: [plan.operand],
189
+ run,
121
190
  note
122
191
  };
123
192
  }
193
+ export function emitUnaryOp(plan, ctx) {
194
+ return emitScalarOp(buildUnaryOpSpec(plan), ctx);
195
+ }
124
196
  //# sourceMappingURL=unary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unary.js","sourceRoot":"","sources":["../../../../src/runtime/emit/unary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unary.js","sourceRoot":"","sources":["../../../../src/runtime/emit/unary.ts"],"names":[],"mappings":"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"}