22
33``` ts
44const sql: {
5- bigint: SQLNumberMarker ;
5+ bigint: SQLNumberMarker & {
6+ __sql_type: " BIGINT" ;
7+ };
68 binary: SQLBinaryMarker ;
79 boolean: SQLBooleanMarker ;
810 date: SQLDateMarker ;
9- decimal: SQLNumberMarker ;
10- double: SQLNumberMarker ;
11- float: SQLNumberMarker ;
12- int: SQLNumberMarker ;
11+ double: SQLNumberMarker & {
12+ __sql_type: " DOUBLE" ;
13+ };
14+ float: SQLNumberMarker & {
15+ __sql_type: " FLOAT" ;
16+ };
17+ int: SQLNumberMarker & {
18+ __sql_type: " INT" ;
19+ };
1320 number: SQLNumberMarker ;
21+ numeric: SQLNumberMarker & {
22+ __sql_type: " NUMERIC" ;
23+ };
1424 string: SQLStringMarker ;
1525 timestamp: SQLTimestampMarker ;
1626};
@@ -23,12 +33,17 @@ SQL helper namespace
2333### bigint()
2434
2535``` ts
26- bigint (value : string | number | bigint ): SQLNumberMarker ;
36+ bigint (value : string | number | bigint ): SQLNumberMarker & {
37+ __sql_type : " BIGINT" ;
38+ };
2739```
2840
2941Creates a ` BIGINT ` (64-bit signed integer) parameter. Accepts JS
3042` bigint ` so callers can round-trip values outside ` Number.MAX_SAFE_INTEGER `
31- without precision loss.
43+ without precision loss; for ` number ` inputs, requires
44+ ` Number.isSafeInteger(value) ` .
45+
46+ Rejects values outside the signed 64-bit range ` [-2^63, 2^63 - 1] ` .
3247
3348#### Parameters
3449
@@ -38,7 +53,19 @@ without precision loss.
3853
3954#### Returns
4055
41- ` SQLNumberMarker `
56+ ` SQLNumberMarker ` & \{
57+ ` __sql_type ` : ` "BIGINT" ` ;
58+ \}
59+
60+ Marker pinned to ` BIGINT `
61+
62+ #### Example
63+
64+ ``` typescript
65+ sql .bigint (42 ); // { __sql_type: "BIGINT", value: "42" }
66+ sql .bigint (9007199254740993n ); // { __sql_type: "BIGINT", value: "9007199254740993" }
67+ sql .bigint (" 9007199254740993" ); // { __sql_type: "BIGINT", value: "9007199254740993" }
68+ ```
4269
4370### binary()
4471
@@ -159,52 +186,48 @@ const params = { startDate: sql.date("2024-01-01") };
159186params = { startDate: " 2024-01-01" }
160187```
161188
162- ### decimal ()
189+ ### double ()
163190
164191``` ts
165- decimal (value : string | number ): SQLNumberMarker ;
192+ double (value : string | number ): SQLNumberMarker & {
193+ __sql_type : " DOUBLE" ;
194+ };
166195```
167196
168- Creates a ` NUMERIC ` (fixed-point DECIMAL) parameter. Use when you need
169- exact decimal arithmetic (currency, percentages) — pass values as
170- strings to avoid JS-number precision loss.
197+ Creates a ` DOUBLE ` (double-precision, 64-bit) parameter. Same precision
198+ as a JS ` number ` , so ` sql.double(value) ` is exact for any JS number.
171199
172200#### Parameters
173201
174202| Parameter | Type | Description |
175203| ------ | ------ | ------ |
176- | ` value ` | ` string ` \| ` number ` | Number or numeric string (strings preferred for precision) |
204+ | ` value ` | ` string ` \| ` number ` | Number or numeric string |
177205
178206#### Returns
179207
180- ` SQLNumberMarker `
181-
182- ### double()
183-
184- ``` ts
185- double (value : string | number ): SQLNumberMarker ;
186- ```
187-
188- Creates a ` DOUBLE ` (double-precision) parameter. Same precision as a JS
189- ` number ` , so ` sql.double(value) ` is exact for any JS number.
190-
191- #### Parameters
208+ ` SQLNumberMarker ` & \{
209+ ` __sql_type ` : ` "DOUBLE" ` ;
210+ \}
192211
193- | Parameter | Type | Description |
194- | ------ | ------ | ------ |
195- | ` value ` | ` string ` \| ` number ` | Number or numeric string |
212+ Marker pinned to ` DOUBLE `
196213
197- #### Returns
214+ #### Example
198215
199- ` SQLNumberMarker `
216+ ``` typescript
217+ sql .double (3.14 ); // { __sql_type: "DOUBLE", value: "3.14" }
218+ ```
200219
201220### float()
202221
203222``` ts
204- float (value : string | number ): SQLNumberMarker ;
223+ float (value : string | number ): SQLNumberMarker & {
224+ __sql_type : " FLOAT" ;
225+ };
205226```
206227
207- Creates a ` FLOAT ` (single-precision) parameter.
228+ Creates a ` FLOAT ` (single-precision, 32-bit) parameter. Note that JS
229+ numbers are 64-bit doubles, so values may be rounded to fit FLOAT
230+ precision at bind time.
208231
209232#### Parameters
210233
@@ -214,18 +237,34 @@ Creates a `FLOAT` (single-precision) parameter.
214237
215238#### Returns
216239
217- ` SQLNumberMarker `
240+ ` SQLNumberMarker ` & \{
241+ ` __sql_type ` : ` "FLOAT" ` ;
242+ \}
243+
244+ Marker pinned to ` FLOAT `
245+
246+ #### Example
247+
248+ ``` typescript
249+ sql .float (3.14 ); // { __sql_type: "FLOAT", value: "3.14" }
250+ ```
218251
219252### int()
220253
221254``` ts
222- int (value : string | number ): SQLNumberMarker ;
255+ int (value : string | number ): SQLNumberMarker & {
256+ __sql_type : " INT" ;
257+ };
223258```
224259
225260Creates an ` INT ` (32-bit signed integer) parameter. Use when the column
226261or context requires ` INT ` specifically (e.g. legacy schemas, or to make
227262the wire type explicit).
228263
264+ Rejects non-integers, values outside ` Number.MAX_SAFE_INTEGER ` (for
265+ number inputs), and values outside the signed 32-bit range
266+ ` [-2^31, 2^31 - 1] ` .
267+
229268#### Parameters
230269
231270| Parameter | Type | Description |
@@ -234,7 +273,18 @@ the wire type explicit).
234273
235274#### Returns
236275
237- ` SQLNumberMarker `
276+ ` SQLNumberMarker ` & \{
277+ ` __sql_type ` : ` "INT" ` ;
278+ \}
279+
280+ Marker pinned to ` INT `
281+
282+ #### Example
283+
284+ ``` typescript
285+ sql .int (42 ); // { __sql_type: "INT", value: "42" }
286+ sql .int (" 42" ); // { __sql_type: "INT", value: "42" }
287+ ```
238288
239289### number()
240290
@@ -248,10 +298,14 @@ and `OFFSET` (which require integer types):
248298
249299- JS integer (` 10 ` ) → ` BIGINT `
250300- JS non-integer (` 3.14 ` ) → ` DOUBLE `
251- - numeric string (` "123.45" ` ) → ` NUMERIC ` (preserves caller's precision intent)
301+ - integer-shaped string (` "10" ` ) → ` BIGINT ` (common HTTP-input case;
302+ works with ` LIMIT :n ` / ` OFFSET :m ` )
303+ - decimal-shaped string (` "123.45" ` ) → ` NUMERIC ` (preserves precision)
252304
253- Reach for ` sql.int() ` , ` sql.bigint() ` , ` sql.float() ` , ` sql.double() ` , or
254- ` sql.decimal() ` if you need to override the inferred type.
305+ Throws on ` NaN ` , ` Infinity ` , JS integers outside ` Number.MAX_SAFE_INTEGER ` ,
306+ or non-numeric strings. Reach for ` sql.int() ` , ` sql.bigint() ` ,
307+ ` sql.float() ` , ` sql.double() ` , or ` sql.numeric() ` if you need to override
308+ the inferred type.
255309
256310#### Parameters
257311
@@ -268,9 +322,45 @@ Marker for a numeric SQL parameter
268322#### Example
269323
270324``` typescript
271- const params = { userId: sql .number (123 ) }; // BIGINT, value "123"
272- const params = { ratio: sql .number (0.5 ) }; // DOUBLE, value "0.5"
273- const params = { amount: sql .number (" 123.45" ) }; // NUMERIC, value "123.45"
325+ sql .number (123 ); // { __sql_type: "BIGINT", value: "123" }
326+ sql .number (0.5 ); // { __sql_type: "DOUBLE", value: "0.5" }
327+ sql .number (" 10" ); // { __sql_type: "BIGINT", value: "10" }
328+ sql .number (" 123.45" ); // { __sql_type: "NUMERIC", value: "123.45" }
329+ ```
330+
331+ ### numeric()
332+
333+ ``` ts
334+ numeric (value : string | number ): SQLNumberMarker & {
335+ __sql_type : " NUMERIC" ;
336+ };
337+ ```
338+
339+ Creates a ` NUMERIC ` (fixed-point DECIMAL) parameter. Use when you need
340+ exact decimal arithmetic (currency, percentages) — pass values as
341+ strings to avoid JS-number precision loss.
342+
343+ Note: passing a JS ` number ` is accepted but lossy for many values
344+ (e.g. ` 0.1 + 0.2 ` → ` "0.30000000000000004" ` ). Prefer strings.
345+
346+ #### Parameters
347+
348+ | Parameter | Type | Description |
349+ | ------ | ------ | ------ |
350+ | ` value ` | ` string ` \| ` number ` | Number or numeric string (strings preferred for precision) |
351+
352+ #### Returns
353+
354+ ` SQLNumberMarker ` & \{
355+ ` __sql_type ` : ` "NUMERIC" ` ;
356+ \}
357+
358+ Marker pinned to ` NUMERIC `
359+
360+ #### Example
361+
362+ ``` typescript
363+ sql .numeric (" 12345.6789" ); // { __sql_type: "NUMERIC", value: "12345.6789" }
274364```
275365
276366### string()
0 commit comments