From e2e70006ca7f8a92f3096c0fc1ba9c69d8c00b48 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Wed, 24 Sep 2025 17:11:33 +0200 Subject: [PATCH 01/15] Adding decimal to ilp --- .../reference/api/ilp/columnset-types.md | 117 +++++++++++++----- 1 file changed, 89 insertions(+), 28 deletions(-) diff --git a/documentation/reference/api/ilp/columnset-types.md b/documentation/reference/api/ilp/columnset-types.md index d3ef9c4b0..a4665adb0 100644 --- a/documentation/reference/api/ilp/columnset-types.md +++ b/documentation/reference/api/ilp/columnset-types.md @@ -2,7 +2,7 @@ title: InfluxDB Line Protocol Columnset Value Types sidebar_label: Columnset value types description: - Describes all support value types in InfluxDB Line Protocol columnset. + Describes all supported value types in InfluxDB Line Protocol columnset. --- This page lists the supported InfluxDB Line Protocol columnset value types and @@ -11,7 +11,7 @@ details about type casting. If a target column does not exist, QuestDB will create a column using the same type that the ILP client sends. -Type casts that cause data loss will cause entire line to be rejected. +Type casts that cause data loss will cause the entire line to be rejected. ## Integer @@ -34,16 +34,16 @@ The line above will be accepted and `96i` will be cast to `short`. ### Cast table -The following `cast` operations are supported when existing table column type is -not `long`: +The following `cast` operations are supported when the existing table column +type is not `long`: -| | `byte` | `short` | `int` | `long` | `float` | `double` | `date` | `timestamp` | -| :-------- | :----- | :------ | :---- | :------- | :------ | :------- | :----- | :---------- | -| `integer` | cast | cast | cast | `native` | cast | cast | cast | cast | +| | `byte` | `short` | `int` | `long` | `float` | `double` | `date` | `timestamp` | `decimal` | +| :-------- | :----- | :------ | :---- | :------- | :------ | :------- | :----- | :---------- | :-------- | +| `integer` | cast | cast | cast | `native` | cast | cast | cast | cast | cast | ## Long256 -Custom type, which correspond to QuestDB type `long256`. The values are hex +Custom type, which corresponds to QuestDB type `long256`. The values are hex encoded 256-bit unsigned integer values with `i` suffix. For example: ```shell @@ -69,16 +69,44 @@ conventional double value would. ### Cast table -The following `cast` operations are supported when existing table column type is -not `double`: +The following `cast` operations are supported when the existing table column +type is not `double`: -| | `float` | `double` | -| :------ | :------ | :------- | -| `float` | cast | `native` | +| | `float` | `double` | `decimal` | +| :------ | :------ | :------- | :-------- | +| `float` | cast | `native` | cast | + +## Decimal + +Decimal values, which correspond to QuestDB type `decimal`. The values are +required to have an `d` suffix. For example: + +```shell +trade,ticker=BTCUSD price=30000.50d 1638202821000000000\n +``` + +When the column does not exist, it will be created with the `decimal` type using +the default precision of 18 and scale of 3. To specify custom precision and +scale, create the table upfront: + +```questdb-sql +CREATE TABLE trade (ticker SYMBOL, price DECIMAL(18, 2)); +``` + +The line above will be accepted and `30000.50` will be stored as `decimal`. + +### Cast table + +The following `cast` operations are supported when the existing table column +type is not `decimal`: + +| | `decimal` | `float` | `double` | +| :-------- | :-------- | :------ | :------- | +| `decimal` | `native` | cast | cast | ## Boolean -These value correspond to QuestDB type `boolean`. In InfluxDB Line Protocol +These values correspond to QuestDB type `boolean`. In InfluxDB Line Protocol `boolean` values can be represented in any of the following ways: | Actual value | Single char lowercase | Single char uppercase | Full lowercase | Full camelcase | Full uppercase | @@ -94,8 +122,8 @@ sensors,location=south warning=false\n ### Cast table -The following `cast` operations are supported when existing table column type is -not `boolean`: +The following `cast` operations are supported when the existing table column +type is not `boolean`: | | `boolean` | `byte` | `short` | `int` | `float` | `long` | `double` | | :-------- | :-------- | :----- | :------ | :---- | :------ | :----- | :------- | @@ -105,7 +133,7 @@ When cast to numeric type, boolean `true` is `1` and `false` is `0` ## String -These value correspond to QuestDB type `varchar`. They must be enclosed in +These values correspond to QuestDB type `varchar`. They must be enclosed in quotes. The following characters in values must be escaped with a `\`: `"`, `\n`, `\r` and `\`. For example: @@ -127,17 +155,17 @@ String values must be UTF-8 encoded before sending. ### Cast table -The following `cast` operations are supported when existing table column type is -not `varchar`: +The following `cast` operations are supported when the existing table column +type is not `varchar`: -| | `varchar` | `char` | `string` | `geohash` | `symbol` | `uuid` | -|:---------|:----------|:-------|:---------|:----------|:---------|--------| -| `string` | `native` | cast | cast | cast | cast | cast | +| | `varchar` | `char` | `string` | `geohash` | `symbol` | `uuid` | `decimal` | +| :------- | :-------- | :----- | :------- | :-------- | :------- | ------ | :-------- | +| `string` | `native` | cast | cast | cast | cast | cast | cast | ### Cast to CHAR String value can be cast to `char` type if its length is less than 2 characters. -The following example are valid lines: +The following examples are valid lines: ```shell trade,ticker=BTCUSD status="A" 1638202821000000000\n @@ -151,8 +179,8 @@ The result: | 1638202821000000000 | BTCUSD | A | | 1638202821000000001 | BTCUSD | `null` | -Casting strings with 2 or more characters to `char` will cause entire line to be -rejected. +Casting strings with 2 or more characters to `char` will cause the entire line +to be rejected. ### Cast to GEOHASH @@ -271,9 +299,42 @@ The `uuid` column is populated with `uuid` values: When the `string` value is not a valid UUID, the entire line will be rejected. +### Cast to DECIMAL + +String values can be cast to the `decimal` type when all the following are true: + +- The destination column exists. +- The destination column type is `decimal`. +- The `string` values are valid IEEE-754 decimal values. + +```questdb-sql +CREATE TABLE trade ( + ticker SYMBOL, + price DECIMAL(18, 2), + timestamp TIMESTAMP +) TIMESTAMP(timestamp) PARTITION BY HOUR; +``` + +Send messages including decimal values as `string`: + +```shell +trade,ticker="BTCUSD" price="30000.50" 1638202821000000000\n +trade,ticker="BTCUSD" price="29999.99" 1638402821000000000\n +``` + +The `price` column is populated with `decimal` values: + +| timestamp | ticker | price | +| :-------------------------- | :----- | :------- | +| 2021-11-29T16:20:21.000000Z | BTCUSD | 30000.50 | +| 2021-12-01T23:53:41.000000Z | BTCUSD | 29999.99 | + +When the `string` value is not a valid IEEE-754 decimal value, the entire line +will be rejected. + ## Timestamp -These value correspond to QuestDB type `timestamp`. Timestamp values are epoch +These values correspond to QuestDB type `timestamp`. Timestamp values are epoch `microseconds` suffixed with `t`. In this example we're populating _non-designated_ timestamp field `ts1`: @@ -290,12 +351,12 @@ CREATE TABLE (loc SYMBOL, ts TIMESTAMP) TIMESTAMP(ts) PARTITION BY DAY; When we send: -```shell title="Sending mixed desginated timestamp values" +```shell title="Sending mixed designated timestamp values" tracking,loc=north ts=2000000000t 1000000000\n tracking,loc=south ts=3000000000t\n ``` -The result in `columnset` value always wins: +The `columnset` value always wins: | loc | ts | | :---- | :--------- | From 4c0e2d5f3e36b8700796d9face8a4893124ed36e Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Mon, 29 Sep 2025 16:35:06 +0200 Subject: [PATCH 02/15] typo: Fix typo in numeric documentation --- documentation/reference/function/numeric.md | 52 +++++++++------------ 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/documentation/reference/function/numeric.md b/documentation/reference/function/numeric.md index 4b3cf3b0c..435c95bc9 100644 --- a/documentation/reference/function/numeric.md +++ b/documentation/reference/function/numeric.md @@ -40,8 +40,8 @@ FROM long_sequence(3); ## ceil / ceiling -`ceil(value)` or `ceiling()` returns the smallest integer greater than, or equal -to, a specified numeric expression. +`ceil(value)` or `ceiling(value)` returns the smallest integer greater than, or +equal to, a specified numeric expression. **Arguments:** @@ -63,7 +63,7 @@ SELECT ceil(15.75) as RoundedUp; ## exp -`exp()` returns the exponential value of a specified numeric expression. +`exp(value)` returns the exponential value of a specified numeric expression. **Arguments:** @@ -85,8 +85,8 @@ SELECT exp(2) as Exponent; ## floor -`floor()` returns the largest integer less than or equal to a specified numeric -expression. +`floor(value)` returns the largest integer less than or equal to a specified +numeric expression. **Arguments:** @@ -102,14 +102,13 @@ Return value type is `double`. SELECT floor(15.75) as RoundedDown; ``` -| RoundedUp | -| --------- | -| 15 | - +| RoundedDown | +| ----------- | +| 15 | ## greatest -`greatest(args...)` returns the largest entry in a series of numbers. +`greatest(args...)` returns the largest entry in a series of numbers. `null` will be returned only if all of the arguments are `null`. @@ -128,16 +127,13 @@ SELECT greatest(11, 3, 8, 15) ``` | greatest | -|----------| +| -------- | | 15 | - - ## least `least(args...)` returns the smallest entry in a series of numbers. - `null` will be returned only if all of the arguments are `null`. **Arguments:** @@ -155,10 +151,9 @@ SELECT least(11, 3, 8, 15) ``` | least | -|-------| +| ----- | | 3 | - ## ln `ln(value)` return the natural logarithm (**log*e***) of a given number. @@ -181,7 +176,6 @@ SELECT ln(4.123) | -------------- | | 1.416581053724 | - ## log `log(value)` return the base 10 logarithm of a given number. @@ -200,14 +194,13 @@ Return value type is `double`. SELECT log(100) ``` -| log | -| ------------ | -| 2 | - -:::note -Some databases use `LOG` to refer to the natural logarithm and `LOG10` for the base 10 logarithm. QuestDB follows PostgreSQL conventions and uses `LOG` for base 10 and `LN` for natural logarithm. -::: +| log | +| --- | +| 2 | +:::note Some databases use `LOG` to refer to the natural logarithm and `LOG10` +for the base 10 logarithm. QuestDB follows PostgreSQL conventions and uses `LOG` +for base 10 and `LN` for natural logarithm. ::: ## power @@ -315,12 +308,12 @@ FROM dbl; | 0.069361448 | 0 | 0 | 0 | 0 | 0.06 | | 4.003627053 | 0 | 0 | 4 | 4 | 4 | | 86.91359825 | 0 | 80 | 86 | 86.9 | 86.91 | -| 376.3807766 | 400 | 370 | 376 | 376.3 | 376.38 | +| 376.3807766 | 300 | 370 | 376 | 376.3 | 376.38 | ## round_half_even `round_half_even(value, scale)` - returns the **closest** value in the specified -scale. It uses the "half up" tie-breaking method when the value is exactly +scale. It uses the "half even" tie-breaking method when the value is exactly halfway between the `round_up` and `round_down` values. **Arguments:** @@ -413,8 +406,9 @@ FROM dbl; ## sign `sign(value)` returns sign of the argument, that is: + - -1 for negative value -- 0 for zero +- 0 for zero - +1 for positive value **Arguments:** @@ -432,7 +426,7 @@ SELECT x-3 arg, sign(x-3) from long_sequence(5) ``` | arg | sign | -|-----|------| +| --- | ---- | | -2 | -1 | | -1 | -1 | | 0 | 0 | @@ -482,6 +476,6 @@ Return value type is `double`. SELECT sqrt(4000.32) ``` -| log | +| sqrt | | ---------------- | | 63.2480829749013 | From 0e90daa0e179302c76e51cdff06c1e2d34d4c512 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Mon, 29 Sep 2025 16:45:23 +0200 Subject: [PATCH 03/15] docs: add decimal to datatypes --- documentation/reference/sql/datatypes.md | 88 ++++++++++++------------ 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/documentation/reference/sql/datatypes.md b/documentation/reference/sql/datatypes.md index 744cf58af..6d64a760b 100644 --- a/documentation/reference/sql/datatypes.md +++ b/documentation/reference/sql/datatypes.md @@ -4,28 +4,29 @@ sidebar_label: Data types description: Data types reference documentation. --- -| Type Name | Storage bits | Nullable | Description | -|-------------------|-----------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `boolean` | `1` | No | Boolean `true` or `false`. | -| `ipv4` | `32` | Yes | `0.0.0.1` to `255.255.255.255` | -| `byte` | `8` | No | Signed integer, `-128` to `127`. | -| `short` | `16` | No | Signed integer, `-32,768` to `32,767`. | -| `char` | `16` | Yes | `unicode` character. | -| `int` | `32` | Yes | Signed integer, `-2,147,483,648` to `2,147,483,647`. | -| `float` | `32` | Yes | Single precision IEEE 754 floating point value. | -| `symbol` | `32` | Yes | A symbol, stored as a 32-bit signed index into the symbol table. Each index corresponds to a `string` value. The index is transparently translated to the string value. Symbol table is stored separately from the column data. | -| `varchar` | `128 + utf8Len` | Yes | Length-prefixed sequence of UTF-8 encoded characters, stored using a 128-bit header and UTF-8 encoded data. Sequences shorter than 9 bytes are fully inlined within the header and do not occupy any additional data space. | -| `string` | `96+n*16` | Yes | Length-prefixed sequence of UTF-16 encoded characters whose length is stored as signed 32-bit integer with maximum value of `0x7fffffff`. | -| `long` | `64` | Yes | Signed integer, `-9,223,372,036,854,775,808` to `9,223,372,036,854,775,807`. | -| `date` | `64` | Yes | Signed offset in **milliseconds** from [Unix Epoch](https://en.wikipedia.org/wiki/Unix_time). | -| `timestamp` | `64` | Yes | Signed offset in **microseconds** from [Unix Epoch](https://en.wikipedia.org/wiki/Unix_time). | -| `double` | `64` | Yes | Double precision IEEE 754 floating point value. | -| `uuid` | `128` | Yes | [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) values. See also [the UUID type](#the-uuid-type). | -| `binary` | `64+n*8` | Yes | Length-prefixed sequence of bytes whose length is stored as signed 64-bit integer with maximum value of `0x7fffffffffffffffL`. | -| `long256` | `256` | Yes | Unsigned 256-bit integer. Does not support arithmetic operations, only equality checks. Suitable for storing a hash code, such as crypto public addresses. | -| `geohash()` | `8`-`64` | Yes | Geohash with precision specified as a number followed by `b` for bits, `c` for chars. See [the geohashes documentation](/docs/concept/geohashes/) for details on use and storage. | -| `array` | See description | Yes | Header: 20 + 4 \* `nDims` bytes. Payload: dense array of values. Example: `DOUBLE[3][4]`: header 28 bytes, payload 3\*4\*8 = 96 bytes. | -| `interval` | `128` | Yes | Pair of timestamps representing a time interval. Not a persisted type: you can use it in expressions, but can't have a database column of this type. | +| Type Name | Storage bits | Nullable | Description | +| ------------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `boolean` | `1` | No | Boolean `true` or `false`. | +| `ipv4` | `32` | Yes | `0.0.0.1` to `255.255.255.255` | +| `byte` | `8` | No | Signed integer, `-128` to `127`. | +| `short` | `16` | No | Signed integer, `-32,768` to `32,767`. | +| `char` | `16` | Yes | `unicode` character. | +| `int` | `32` | Yes | Signed integer, `-2,147,483,648` to `2,147,483,647`. | +| `float` | `32` | Yes | Single precision IEEE 754 floating point value. | +| `symbol` | `32` | Yes | A symbol, stored as a 32-bit signed index into the symbol table. Each index corresponds to a `string` value. The index is transparently translated to the string value. Symbol table is stored separately from the column data. | +| `varchar` | `128 + utf8Len` | Yes | Length-prefixed sequence of UTF-8 encoded characters, stored using a 128-bit header and UTF-8 encoded data. Sequences shorter than 9 bytes are fully inlined within the header and do not occupy any additional data space. | +| `string` | `96+n*16` | Yes | Length-prefixed sequence of UTF-16 encoded characters whose length is stored as signed 32-bit integer with maximum value of `0x7fffffff`. | +| `long` | `64` | Yes | Signed integer, `-9,223,372,036,854,775,808` to `9,223,372,036,854,775,807`. | +| `date` | `64` | Yes | Signed offset in **milliseconds** from [Unix Epoch](https://en.wikipedia.org/wiki/Unix_time). | +| `timestamp` | `64` | Yes | Signed offset in **microseconds** from [Unix Epoch](https://en.wikipedia.org/wiki/Unix_time). | +| `double` | `64` | Yes | Double precision IEEE 754 floating point value. | +| `uuid` | `128` | Yes | [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) values. See also [the UUID type](#the-uuid-type). | +| `binary` | `64+n*8` | Yes | Length-prefixed sequence of bytes whose length is stored as signed 64-bit integer with maximum value of `0x7fffffffffffffffL`. | +| `long256` | `256` | Yes | Unsigned 256-bit integer. Does not support arithmetic operations, only equality checks. Suitable for storing a hash code, such as crypto public addresses. | +| `geohash()` | `8`-`64` | Yes | Geohash with precision specified as a number followed by `b` for bits, `c` for chars. See [the geohashes documentation](/docs/concept/geohashes/) for details on use and storage. | +| `array` | See description | Yes | Header: 20 + 4 \* `nDims` bytes. Payload: dense array of values. Example: `DOUBLE[3][4]`: header 28 bytes, payload 3\*4\*8 = 96 bytes. | +| `interval` | `128` | Yes | Pair of timestamps representing a time interval. Not a persisted type: you can use it in expressions, but can't have a database column of this type. | +| `decimal(, )` | `8`-`256` | Yes | Decimal floating point with user-specified precision and scale | ## N-dimensional array @@ -75,27 +76,28 @@ enforce is configurable via `cairo.max.array.element.count`, with the default of Many nullable types reserve a value that marks them `NULL`: -| Type Name | Null value | Description | -| ---------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | -| `float` | `NaN`, `+Infinity`, `-Infinity` | As defined by IEEE 754 (`java.lang.Float.NaN` etc.) | -| `double` | `NaN`, `+Infinity`, `-Infinity` | As defined by IEEE 754 (`java.lang.Double.NaN`, etc.) | -| `long256` | `0x8000000000000000800000000000000080000000000000008000000000000000` | The value equals four consecutive `long` null literals. | -| `long` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | -| `date` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | -| `timestamp` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | -| `int` | `0x80000000` | Minimum possible value an `int` can take, -2^31. | -| `uuid` | `80000000-0000-0000-8000-000000000000` | Both 64 highest bits and 64 lowest bits set to -2^63. | -| `char` | `0x0000` | The zero char (`NUL` in ASCII). | -| `geohash(byte)` | `0xff` | Valid for geohashes of 1 to 7 bits (inclusive). | -| `geohash(short)` | `0xffff` | Valid for geohashes of 8 to 15 bits (inclusive). | -| `geohash(int)` | `0xffffffff` | Valid for geohashes of 16 to 31 bits (inclusive). | -| `geohash(long)` | `0xffffffffffffffff` | Valid for geohashes of 32 to 60 bits (inclusive). | -| `symbol` | `0x80000000` | Symbol is stored as an `int` offset into a lookup file. The value `-1` marks it `NULL`. | -| `ipv4` | `0.0.0.0` (`0x00000000`) | IPv4 address is stored as a 32-bit integer and the zero value represents `NULL`. | -| `varchar` | `N/A` | Varchar column has an explicit `NULL` marker in the header. | -| `string` | `N/A` | String column is length-prefixed, the length is an `int` and `-1` marks it `NULL`. | -| `binary` | `N/A` | Binary column is length prefixed, the length is a `long` and `-1` marks it `NULL`. | -| `array` | `N/A` | Array column marks a `NULL` value with a zero in the `size` field of the header. | +| Type Name | Null value | Description | +| ---------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `float` | `NaN`, `+Infinity`, `-Infinity` | As defined by IEEE 754 (`java.lang.Float.NaN` etc.) | +| `double` | `NaN`, `+Infinity`, `-Infinity` | As defined by IEEE 754 (`java.lang.Double.NaN`, etc.) | +| `long256` | `0x8000000000000000800000000000000080000000000000008000000000000000` | The value equals four consecutive `long` null literals. | +| `long` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | +| `date` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | +| `timestamp` | `0x8000000000000000L` | Minimum possible value a `long` can take, -2^63. | +| `int` | `0x80000000` | Minimum possible value an `int` can take, -2^31. | +| `uuid` | `80000000-0000-0000-8000-000000000000` | Both 64 highest bits and 64 lowest bits set to -2^63. | +| `char` | `0x0000` | The zero char (`NUL` in ASCII). | +| `geohash(byte)` | `0xff` | Valid for geohashes of 1 to 7 bits (inclusive). | +| `geohash(short)` | `0xffff` | Valid for geohashes of 8 to 15 bits (inclusive). | +| `geohash(int)` | `0xffffffff` | Valid for geohashes of 16 to 31 bits (inclusive). | +| `geohash(long)` | `0xffffffffffffffff` | Valid for geohashes of 32 to 60 bits (inclusive). | +| `symbol` | `0x80000000` | Symbol is stored as an `int` offset into a lookup file. The value `-1` marks it `NULL`. | +| `ipv4` | `0.0.0.0` (`0x00000000`) | IPv4 address is stored as a 32-bit integer and the zero value represents `NULL`. | +| `varchar` | `N/A` | Varchar column has an explicit `NULL` marker in the header. | +| `string` | `N/A` | String column is length-prefixed, the length is an `int` and `-1` marks it `NULL`. | +| `binary` | `N/A` | Binary column is length prefixed, the length is a `long` and `-1` marks it `NULL`. | +| `array` | `N/A` | Array column marks a `NULL` value with a zero in the `size` field of the header. | +| `decimal` | `N/A` | Minimal value of the underlying decimal type, impossible to reach through arithmetic as it is always out-of-range. | To filter columns that contain, or don't contain, `NULL` values use a filter like: From cc9a8cf78bc2197afa266e427c72035783fe715e Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Wed, 1 Oct 2025 11:37:19 +0200 Subject: [PATCH 04/15] docs: Adding decimal concept page --- documentation/concept/decimal.md | 392 +++++++++++++++++++++++++++++++ documentation/sidebars.js | 1 + 2 files changed, 393 insertions(+) create mode 100644 documentation/concept/decimal.md diff --git a/documentation/concept/decimal.md b/documentation/concept/decimal.md new file mode 100644 index 000000000..5e8541ba6 --- /dev/null +++ b/documentation/concept/decimal.md @@ -0,0 +1,392 @@ +--- +title: Decimal +description: + This document describes how to work with the decimal data type in QuestDB, + including precision and scale, literal syntax, arithmetic operations, and best + practices for financial and scientific calculations. +--- + +QuestDB provides a `decimal` data type for exact numeric calculations, essential +for financial computations, scientific measurements, and any scenario where +precision matters. This page explains how to use decimals effectively, including +syntax, operations, and performance considerations. + +## What are decimals? + +Decimals are fixed-point numbers that maintain exact precision during arithmetic +operations. Unlike floating-point types (`float` and `double`), decimals avoid +rounding errors by storing numbers as scaled integers internally. This makes +them ideal for monetary calculations where accuracy is critical. + +### Key characteristics + +- **Exact arithmetic**: No rounding errors during addition, subtraction, and + multiplication +- **Fixed precision**: Numbers are stored with a defined number of total digits +- **Fixed scale**: A specific number of digits after the decimal point +- **Variable storage**: Automatically optimized from 1 to 32 bytes based on + precision + +## Decimal type in QuestDB + +QuestDB implements decimals with the syntax `DECIMAL(precision, scale)`: + +- **Precision**: Total number of significant digits (1-76) +- **Scale**: Number of digits after the decimal point (0-precision) + +For example, `DECIMAL(10, 2)` can store values from -99,999,999.99 to +99,999,999.99. + +### Storage optimization + +QuestDB automatically selects the optimal storage size based on precision: + +| Precision | Storage Size | Internal Type | +| ------------ | ------------ | ------------- | +| 1-2 digits | 1 byte | DECIMAL8 | +| 3-4 digits | 2 bytes | DECIMAL16 | +| 5-9 digits | 4 bytes | DECIMAL32 | +| 10-18 digits | 8 bytes | DECIMAL64 | +| 19-38 digits | 16 bytes | DECIMAL128 | +| 39-76 digits | 32 bytes | DECIMAL256 | + +## Decimal literals + +QuestDB requires the `m` suffix to distinguish decimal literals from +floating-point numbers: + +```questdb-sql +-- Decimal literals use the 'm' suffix +SELECT 123.45m; -- Decimal value 123.45 +SELECT 0.001m; -- Decimal value 0.001 +SELECT 1000000.00m; -- Decimal value 1,000,000.00 + +-- Without 'm' suffix, numbers are treated as double +SELECT 123.45; -- Double value (floating-point) +``` + +:::important + +Always use the `m` suffix for decimal literals. QuestDB does not implicitly +convert doubles to decimals to prevent unintended precision loss. + +::: + +## Creating tables with decimals + +Define decimal columns by specifying precision and scale: + +```questdb-sql +CREATE TABLE transactions ( + id LONG, + amount DECIMAL(15, 2), -- Up to 999,999,999,999.99 + tax_rate DECIMAL(5, 4), -- Up to 9.9999 (e.g., 0.0875 for 8.75%) + quantity DECIMAL(10, 3), -- Up to 9,999,999.999 + timestamp TIMESTAMP +) timestamp(timestamp); +``` + +## Working with decimals + +### Basic arithmetic + +Decimal arithmetic maintains precision automatically: + +```questdb-sql +-- Insert transaction data +INSERT INTO transactions VALUES + (1, 99.99m, 0.0875m, 2.500m, now()), + (2, 150.00m, 0.0625m, 1.750m, now()), + (3, 1250.50m, 0.0875m, 10.000m, now()); + +-- Arithmetic operations maintain precision +SELECT + amount, + amount * tax_rate AS tax_amount, + amount + (amount * tax_rate) AS total, + amount * quantity AS extended_amount +FROM transactions; +``` + +### Precision and scale in operations + +QuestDB automatically determines the result precision and scale for decimal +operations based on the operands: + +#### Addition and subtraction + +- **Scale**: Maximum scale of the operands +- **Precision**: Maximum precision of the operands (scaled) + 1 + +```questdb-sql +-- Addition with different scales +SELECT 10.5m + 1.234m; -- scale: max(1, 3) = 3, Result: 11.734 + +-- Adding DECIMAL(10,2) + DECIMAL(8,2) → DECIMAL(11,2) +SELECT 99999999.99m + 999999.99m; -- Result has precision 11, scale 2 +``` + +The additional precision digit allows the result to accommodate potential +overflow (e.g., 99.9 + 99.9 = 199.8 requires 4 digits instead of 3). + +#### Multiplication + +- **Scale**: Sum of the scales of both operands +- **Precision**: Sum of the precision of both operands + +```questdb-sql +-- Multiplication adds scales +SELECT 10.50m * 1.25m; -- scale: 2 + 2 = 4, Result: 13.1250 + +-- DECIMAL(5,2) * DECIMAL(4,2) → DECIMAL(9,4) +SELECT 100.50m * 12.34m; -- Result: 1240.1700 +``` + +#### Division + +- **Scale**: Maximum scale of the operands + +```questdb-sql +-- Division uses maximum scale +SELECT 10.50m / 2.0m; -- scale: max(2, 1) = 2, Result: 5.25 + +-- Division may truncate beyond the scale +SELECT 10.00m / 3.00m; -- Result: 3.33 (limited to scale 2) +``` + +### Comparison operations + +Decimals support all standard comparison operators: + +```questdb-sql +-- Find high-value transactions +SELECT * FROM transactions WHERE amount > 1000.00m; + +-- Find specific tax rates +SELECT * FROM transactions WHERE tax_rate = 0.0875m; + +-- Range queries +SELECT * FROM transactions WHERE amount BETWEEN 100.00m AND 500.00m; +``` + +## Type casting + +### Explicit casting + +Convert between numeric types using `CAST`: + +```questdb-sql +-- From integer to decimal +SELECT CAST(100 AS DECIMAL(10, 2)); -- Result: 100.00 + +-- From double to decimal (use with caution - may lose precision) +SELECT CAST(123.456789 AS DECIMAL(8, 3)); -- Result: 123.457 + +-- From decimal to other types +SELECT CAST(99.99m AS INT); -- Result: 99 (truncate) +SELECT CAST(99.99m AS DOUBLE); -- Result: 99.99 (as floating-point) +``` + +### Important casting rules + +- **No implicit conversion from double/float**: Must use explicit `CAST` or + decimal literals +- **Integer to decimal**: Safe, no precision loss +- **Double to decimal**: May lose precision due to floating-point representation +- **Between decimal types**: Automatic when precision/scale allows + +## Performance considerations + +### Advantages + +- **Exact results**: Perfect for financial calculations and accounting +- **Predictable behavior**: No surprising rounding errors +- **Regulatory compliance**: Meets requirements for exact monetary calculations + +### Trade-offs + +- **Slower than floating-point**: Typically slower than `double` operations +- **More storage**: May use more space than `float` for equivalent range +- **Complex operations**: Division and advanced math functions have overhead + +### Performance tips + +1. **Use appropriate precision**: Don't over-specify precision beyond your needs +2. **Keep precision ≤ 18 when possible**: DECIMAL64 operations are faster than + DECIMAL128/256 +3. **Pre-calculate when possible**: Store commonly used calculations +4. **Consider doubles for analysis**: Use decimals for storage, doubles for + complex analytics + +## Common use cases + +### Financial calculations + +```questdb-sql +-- Portfolio valuation with exact arithmetic +CREATE TABLE portfolio ( + symbol SYMBOL, + shares DECIMAL(12, 4), -- Fractional shares supported + price DECIMAL(10, 2), -- Stock price + commission DECIMAL(7, 2), -- Trading fees + timestamp TIMESTAMP +) timestamp(timestamp); + +-- Calculate exact portfolio value +SELECT + symbol, + shares, + price, + shares * price AS position_value, + shares * price - commission AS net_value, + sum(shares * price) OVER () AS total_portfolio_value +FROM portfolio +WHERE timestamp = now(); +``` + +### Cryptocurrency trading + +```questdb-sql +-- ETH trading with high precision (18 decimals like wei) +CREATE TABLE crypto_trades ( + trade_id LONG, + pair SYMBOL, + eth_amount DECIMAL(28, 18), -- ETH with full wei precision + usdt_price DECIMAL(12, 2), -- USDT price per ETH + fee_rate DECIMAL(5, 4), -- Trading fee (e.g., 0.001 for 0.1%) + gas_fee_eth DECIMAL(18, 18), -- Gas fee in ETH + timestamp TIMESTAMP +) timestamp(timestamp); + +-- Calculate trade values with exact precision +SELECT + trade_id, + eth_amount, + usdt_price, + eth_amount * usdt_price AS trade_value_usdt, + eth_amount * usdt_price * fee_rate AS fee_usdt, + eth_amount * usdt_price * (1.0m - fee_rate) AS net_value_usdt, + eth_amount - gas_fee_eth AS net_eth_received +FROM crypto_trades; +``` + +### Scientific measurements + +```questdb-sql +-- High-precision sensor data +CREATE TABLE sensor_readings ( + sensor_id SYMBOL, + measurement DECIMAL(20, 10), -- 10 decimal places of precision + calibration_factor DECIMAL(6, 5), + timestamp TIMESTAMP +) timestamp(timestamp); + +-- Apply calibration with exact arithmetic +SELECT + sensor_id, + measurement, + measurement * calibration_factor AS calibrated_value, + avg(measurement) OVER (PARTITION BY sensor_id) AS avg_reading +FROM sensor_readings +SAMPLE BY 1h; +``` + +## Best practices + +### When to use decimals + +✅ **Use decimals for:** + +- Financial data (prices, amounts, exchange rates) +- Accounting calculations +- Scientific measurements requiring exact precision +- Regulatory compliance scenarios +- Any calculation where rounding errors are unacceptable + +❌ **Avoid decimals for:** + +- Scientific calculations requiring extensive math functions +- Performance-critical analytics on large datasets +- Approximate values where precision isn't critical +- Coordinates or measurements where float precision suffices + +### Design guidelines + +1. **Choose appropriate precision and scale** + + ```questdb-sql + -- Good: Matches business requirements + CREATE TABLE prices ( + amount DECIMAL(10, 2) -- Cents precision for USD + ); + + -- Avoid: Excessive precision + CREATE TABLE prices ( + amount DECIMAL(30, 15) -- Unnecessary for most use cases + ); + ``` + +2. **Use the 'm' suffix consistently** + + ```questdb-sql + -- Good: Clear decimal literals + INSERT INTO prices VALUES (99.99m); + + -- Error: Missing 'm' suffix + INSERT INTO prices VALUES (99.99); -- Treated as double, will fail + ``` + +3. **Explicit casting when mixing types** + + ```questdb-sql + -- Good: Explicit cast + SELECT amount + CAST(10 AS DECIMAL(10, 2)) FROM prices; + + -- Good: Use decimal literal + SELECT amount + 10.00m FROM prices; + ``` + +## Differences from doubles + +| Aspect | Decimal | Double | +| ------------------- | ------------------------- | --------------------- | +| **Precision** | Exact | Approximate | +| **Rounding errors** | None for basic operations | Can accumulate | +| **Performance** | Slower | Faster | +| **Storage** | Variable (1-32 bytes) | Fixed (8 bytes) | +| **Use case** | Money, exact values | Scientific, analytics | +| **Literal syntax** | Requires 'm' suffix | Standard notation | + +## Example: Financial reporting + +Here's a complete example showing decimals in a financial reporting scenario: + +```questdb-sql +-- Create financial tables +CREATE TABLE account_transactions ( + account_id SYMBOL, + transaction_type SYMBOL, + amount DECIMAL(15, 2), + balance DECIMAL(15, 2), + timestamp TIMESTAMP +) timestamp(timestamp); + +-- Insert sample transactions +INSERT INTO account_transactions VALUES + ('ACC001', 'DEPOSIT', 1000.00m, 1000.00m, '2024-01-01'), + ('ACC001', 'WITHDRAWAL', 150.50m, 849.50m, '2024-01-02'), + ('ACC001', 'INTEREST', 2.12m, 851.62m, '2024-01-03'), + ('ACC002', 'DEPOSIT', 5000.00m, 5000.00m, '2024-01-01'), + ('ACC002', 'TRANSFER', 500.00m, 4500.00m, '2024-01-02'); + +-- Financial summary with exact calculations +SELECT + account_id, + sum(CASE WHEN transaction_type = 'DEPOSIT' THEN amount ELSE 0.00m END) AS total_deposits, + sum(CASE WHEN transaction_type = 'WITHDRAWAL' THEN amount ELSE 0.00m END) AS total_withdrawals, + last(balance) AS current_balance, + count(*) AS transaction_count +FROM account_transactions +WHERE timestamp >= '2024-01-01' +GROUP BY account_id; +``` diff --git a/documentation/sidebars.js b/documentation/sidebars.js index 4f2521eb7..4bfbe8486 100644 --- a/documentation/sidebars.js +++ b/documentation/sidebars.js @@ -553,6 +553,7 @@ module.exports = { "concept/designated-timestamp", "concept/geohashes", "concept/array", + "concept/decimal", "concept/indexes", "concept/interval-scan", "concept/jit-compiler", From 2532d57420f087ebbb3c3da4fc52b281232d9b66 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Wed, 1 Oct 2025 12:15:39 +0200 Subject: [PATCH 05/15] docs: Adding decimal documentation to random value generator --- .../function/random-value-generator.md | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/documentation/reference/function/random-value-generator.md b/documentation/reference/function/random-value-generator.md index c8d178607..a03f5bd69 100644 --- a/documentation/reference/function/random-value-generator.md +++ b/documentation/reference/function/random-value-generator.md @@ -34,6 +34,7 @@ QuestDB supports the following random generation functions: - [rnd_uuid4](#rnd_uuid4) - [rnd_ipv4](#rnd_ipv4) - [rnd_double_array](#rnd_double_array) +- [rnd_decimal](#rnd_decimal) ## Usage @@ -659,14 +660,14 @@ rnd_ipv4('22.43.200.9/16', 0) Generates a `DOUBLE` array with random elements. There are two main forms: -1. `rnd_double_array(nDims, [ nanRate, [ maxDimLength ] ])` — generates an array with - the specified dimensionality and random dimension lengths, as well as random - elements. `nanRate` and `maxDimLength` are optional parameters. The default - `nanRate` is zero and the default `maxDimLength` is 16. +1. `rnd_double_array(nDims, [ nanRate, [ maxDimLength ] ])` — generates an array + with the specified dimensionality and random dimension lengths, as well as + random elements. `nanRate` and `maxDimLength` are optional parameters. The + default `nanRate` is zero and the default `maxDimLength` is 16. 2. `rnd_double_array(nDims, nanRate, 0, dim1Len, dim2Len, dim3Len, ...)` — - generates an array of fixed size with random elements. Note the dummy argument 0, - its is needed to disambiguate from other forms. + generates an array of fixed size with random elements. Note the dummy + argument 0, its is needed to disambiguate from other forms. **Examples:** @@ -695,3 +696,32 @@ SELECT rnd_double_array(2, 0, 0, 2, 5); [0.2928431722534959, 0.4269209916086062, 0.08520276767101154, 0.5371988206397026, 0.5786689751730609] ] ``` + +## rnd_decimal + +- `rnd_decimal(precision, scale, nanRate)` - generates a random **positive** + `decimal` between 0 and the maximum value representable by the given precision + and scale. + +**Arguments:** + +- `nanRate` is an `int` defining the frequency of occurrence of `NaN` values: +- `0`: No `NaN` will be returned. +- `1`: Will only return `NaN`. +- `N > 1`: On average, one in N generated values will be `NaN`. + +**Return value:** + +Return value type is `decimal`. + +**Examples:** + +```questdb-sql title="Random decimal" +SELECT rnd_decimal(8, 2, 0) FROM long_sequence(5); +SELECT rnd_decimal(8, 2, 4) FROM long_sequence(5); +``` + +``` +6618.97 5037.02 7118.16 9024.15 537.05 +null 734.74 787.93 null 789.92 +``` From 6730d6b3f882f381f15314625e41b5004e807049 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Wed, 1 Oct 2025 12:15:58 +0200 Subject: [PATCH 06/15] docs: Added decimal documentation to numeric --- documentation/reference/function/numeric.md | 30 ++++++++++++--------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/documentation/reference/function/numeric.md b/documentation/reference/function/numeric.md index 435c95bc9..cb79d867e 100644 --- a/documentation/reference/function/numeric.md +++ b/documentation/reference/function/numeric.md @@ -49,7 +49,7 @@ equal to, a specified numeric expression. **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** @@ -94,7 +94,7 @@ numeric expression. **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** @@ -114,11 +114,11 @@ SELECT floor(15.75) as RoundedDown; **Arguments:** -- `args...` is a variable-size list of `long` or `double` values. +- `args...` is a variable-size list of `long`, `double` or `decimal` values. **Return value:** -Return value type is `double` or `long`. +Return value type is `double`, `long` or `decimal`. **Examples:** @@ -138,11 +138,11 @@ SELECT greatest(11, 3, 8, 15) **Arguments:** -- `args...` is a variable-size list of `long` or `double` values. +- `args...` is a variable-size list of `long`, `double` or `decimal` values. **Return value:** -Return value type is `double` or `long`. +Return value type is `double`, `long` or `decimal`. **Examples:** @@ -198,9 +198,13 @@ SELECT log(100) | --- | | 2 | -:::note Some databases use `LOG` to refer to the natural logarithm and `LOG10` -for the base 10 logarithm. QuestDB follows PostgreSQL conventions and uses `LOG` -for base 10 and `LN` for natural logarithm. ::: +:::note + +Some databases use `LOG` to refer to the natural logarithm and `LOG10` for the +base 10 logarithm. QuestDB follows PostgreSQL conventions and uses `LOG` for +base 10 and `LN` for natural logarithm. + +::: ## power @@ -244,7 +248,7 @@ the `round_up` and `round_down` values. **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** @@ -284,7 +288,7 @@ FROM dbl; **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** @@ -326,7 +330,7 @@ halfway between the `round_up` and `round_down` values. **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** @@ -377,7 +381,7 @@ FROM dbl; **Return value:** -Return value type is `double`. +Returns `double`, or `decimal` if the operand is `decimal`. **Examples:** From 835499d42bd8ac113e1851bccf245c1c388e1420 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 09:22:31 +0200 Subject: [PATCH 07/15] typos --- documentation/concept/decimal.md | 3 +++ documentation/reference/sql/datatypes.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/documentation/concept/decimal.md b/documentation/concept/decimal.md index 5e8541ba6..c583e3987 100644 --- a/documentation/concept/decimal.md +++ b/documentation/concept/decimal.md @@ -37,6 +37,9 @@ QuestDB implements decimals with the syntax `DECIMAL(precision, scale)`: For example, `DECIMAL(10, 2)` can store values from -99,999,999.99 to 99,999,999.99. +If neither the precision and scale are provided, the type defaults to a +precision of 18 and a scale of 3. + ### Storage optimization QuestDB automatically selects the optimal storage size based on precision: diff --git a/documentation/reference/sql/datatypes.md b/documentation/reference/sql/datatypes.md index 6d64a760b..e6ce995e7 100644 --- a/documentation/reference/sql/datatypes.md +++ b/documentation/reference/sql/datatypes.md @@ -26,7 +26,7 @@ description: Data types reference documentation. | `geohash()` | `8`-`64` | Yes | Geohash with precision specified as a number followed by `b` for bits, `c` for chars. See [the geohashes documentation](/docs/concept/geohashes/) for details on use and storage. | | `array` | See description | Yes | Header: 20 + 4 \* `nDims` bytes. Payload: dense array of values. Example: `DOUBLE[3][4]`: header 28 bytes, payload 3\*4\*8 = 96 bytes. | | `interval` | `128` | Yes | Pair of timestamps representing a time interval. Not a persisted type: you can use it in expressions, but can't have a database column of this type. | -| `decimal(, )` | `8`-`256` | Yes | Decimal floating point with user-specified precision and scale | +| `decimal(, )` | `8`-`256` | Yes | Decimal floating point with user-specified precision and scale. | ## N-dimensional array From c05f26f42cdc8890cad102031d576c4347a96dd8 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 09:44:03 +0200 Subject: [PATCH 08/15] docs: Document decimal in change column type --- .../sql/alter-table-change-column-type.md | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/documentation/reference/sql/alter-table-change-column-type.md b/documentation/reference/sql/alter-table-change-column-type.md index 5d4cd9f39..312582d61 100644 --- a/documentation/reference/sql/alter-table-change-column-type.md +++ b/documentation/reference/sql/alter-table-change-column-type.md @@ -65,15 +65,15 @@ result in data loss marked with `L`. Numeric types support a wide range of conversions, but many of them can result in the data / precision loss. -| From \ To | boolean | byte | short | int | float | long | double | date | timestamp | -| --------- | ------- | ---- | ----- | --- | ----- | ---- | ------ | ---- | --------- | -| boolean | | X | X | X | X | X | X | X | X | -| byte | L | | X | X | X | X | X | X | X | -| short | L | L | | X | X | X | X | X | X | -| int | L | L | L | | L | X | X | X | X | -| float | L | L | L | L | | L | X | L | L | -| long | L | L | L | L | L | | L | X | X | -| double | L | L | L | L | X | L | | L | L | +| From \ To | boolean | byte | short | int | float | long | double | date | timestamp | decimal | +| --------- | ------- | ---- | ----- | --- | ----- | ---- | ------ | ---- | --------- | ------- | +| boolean | | X | X | X | X | X | X | X | X | | +| byte | L | | X | X | X | X | X | X | X | X | +| short | L | L | | X | X | X | X | X | X | X | +| int | L | L | L | | L | X | X | X | X | X | +| float | L | L | L | L | | L | X | L | L | L | +| long | L | L | L | L | L | | L | X | X | X | +| double | L | L | L | L | X | L | | L | L | L | Conversions between `TIMESTAMP` and `DATE` types and numeric types are fully supported. Timestamp values are represented in microseconds since the EPOCH, @@ -84,10 +84,10 @@ Additionally, when converting from `BOOLEAN` values to numerics, `false` is represented as `0`, and `true` is represented as `1`. On the way back `0` and `NULL` are converted to `false` and all other values converted to `true`. -| From \ To | boolean | byte | short | int | float | long | double | date | timestamp | -| --------- | ------- | ---- | ----- | --- | ----- | ---- | ------ | ---- | --------- | -| date | L | L | L | L | L | X | X | | X | -| timestamp | L | L | L | L | L | X | X | L | | +| From \ To | boolean | byte | short | int | float | long | double | date | timestamp | decimal | +| --------- | ------- | ---- | ----- | --- | ----- | ---- | ------ | ---- | --------- | ------- | +| date | L | L | L | L | L | X | X | | X | | +| timestamp | L | L | L | L | L | X | X | L | | | Conversions to `SYMBOL`, `STRING` and `VARCHAR` are supported from most of the data types. @@ -103,6 +103,7 @@ data types. | date | X | X | X | | timestamp | X | X | X | | double | X | X | X | +| decimal | | X | X | | ipv4 | X | X | X | | char | X | X | X | | uuid | X | X | X | @@ -113,11 +114,11 @@ data types. However conversion from `SYMBOL`, `STRING` and `VARCHAR` to other types can result in `NULL` values for inconvertable string values. -| From \ To | boolean | byte | short | char | int | float | long | date | timestamp | double | uuid | -| --------- | ------- | ---- | ----- | ---- | --- | ----- | ---- | ---- | --------- | ------ | ---- | -| string | L | L | L | L | L | L | L | L | L | L | L | -| varchar | L | L | L | L | L | L | L | L | L | L | L | -| symbol | L | L | L | L | L | L | L | L | L | L | L | +| From \ To | boolean | byte | short | char | int | float | long | date | timestamp | double | uuid | decimal | +| --------- | ------- | ---- | ----- | ---- | --- | ----- | ---- | ---- | --------- | ------ | ---- | ------- | +| string | L | L | L | L | L | L | L | L | L | L | L | L | +| varchar | L | L | L | L | L | L | L | L | L | L | L | L | +| symbol | L | L | L | L | L | L | L | L | L | L | L | | When column type change results into range overflow or precision loss, the same rules as explicit [CAST](/docs/reference/sql/cast/) apply. From 102402502983f5e581e3040401df6c2cb2eab951 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 09:44:19 +0200 Subject: [PATCH 09/15] docs: Document decimal in latest on --- documentation/reference/sql/latest-on.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/reference/sql/latest-on.md b/documentation/reference/sql/latest-on.md index ed5206844..4b24128df 100644 --- a/documentation/reference/sql/latest-on.md +++ b/documentation/reference/sql/latest-on.md @@ -19,7 +19,7 @@ where: column. - `columnName` list used in the `PARTITION BY` part of the clause is a list of columns of one of the following types: `SYMBOL`, `STRING`, `BOOLEAN`, `SHORT`, - `INT`, `LONG`, `LONG256`, `CHAR`. + `INT`, `LONG`, `LONG256`, `CHAR`, `DECIMAL`. ## Description From fc52160dfe7808f01c59f6cf604a08177df6e7e1 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 09:44:31 +0200 Subject: [PATCH 10/15] Update railroad type def to add Decimal --- documentation/reference/sql/create-table.md | 5 +- static/images/docs/diagrams/.railroad | 2 +- static/images/docs/diagrams/columnTypeDef.svg | 1 - .../images/docs/diagrams/createTableDef.svg | 279 +++++++++--------- static/images/docs/diagrams/declare.svg | 104 +++---- static/images/docs/diagrams/fromTo.svg | 101 ++----- static/images/docs/diagrams/innerLeftJoin.svg | 80 +++++ static/images/docs/diagrams/insertInto.svg | 124 ++++---- static/images/docs/diagrams/typeDef.svg | 7 +- static/images/docs/diagrams/update.svg | 70 +++-- static/images/docs/diagrams/withAsInsert.svg | 228 +++++--------- 11 files changed, 477 insertions(+), 524 deletions(-) delete mode 100644 static/images/docs/diagrams/columnTypeDef.svg create mode 100644 static/images/docs/diagrams/innerLeftJoin.svg diff --git a/documentation/reference/sql/create-table.md b/documentation/reference/sql/create-table.md index 623611a62..a2ba72210 100644 --- a/documentation/reference/sql/create-table.md +++ b/documentation/reference/sql/create-table.md @@ -297,7 +297,7 @@ When specifying a column, a name and [type definition](/docs/reference/sql/datatypes/) must be provided. The `symbol` type may have additional optional parameters applied. -![Flow chart showing the syntax of the different column types](/images/docs/diagrams/columnTypeDef.svg) +![Flow chart showing the syntax of the different column types](/images/docs/diagrams/typeDef.svg) ### Symbols @@ -375,8 +375,7 @@ CREATE TABLE trades ( [**symbol capacity**](/docs/concept/symbol/#usage-of-symbols) are different settings. - The index capacity value should not be changed, unless a user is aware of all - the implications. -::: + the implications. ::: See the [Index concept](/docs/concept/indexes/#how-indexes-work) for more information about indexes. diff --git a/static/images/docs/diagrams/.railroad b/static/images/docs/diagrams/.railroad index 6f011c785..ae0ee44b0 100644 --- a/static/images/docs/diagrams/.railroad +++ b/static/images/docs/diagrams/.railroad @@ -99,7 +99,7 @@ typeDef ::= ( 'boolean' | 'byte' | 'short' | 'char' | 'int' | 'float' | ('symbol' (('CAPACITY' distinctValueEstimate) ('CACHE' | 'NOCACHE')?)? inlineIndexDef?) | - 'varchar' | 'string' | 'long' | 'date' | 'timestamp' | 'double' | 'binary' | 'long256' | 'geohash()' + 'varchar' | 'string' | 'long' | 'date' | 'timestamp' | 'double' | 'binary' | 'long256' | 'geohash()' | 'decimal(, )' ) indexDef diff --git a/static/images/docs/diagrams/columnTypeDef.svg b/static/images/docs/diagrams/columnTypeDef.svg deleted file mode 100644 index 056784c3a..000000000 --- a/static/images/docs/diagrams/columnTypeDef.svg +++ /dev/null @@ -1 +0,0 @@ -booleanbyteshortcharintfloatsymbolCAPACITYdistinctValueEstimateCACHENOCACHEinlineIndexDefstringlongdatetimestampdoublebinarylong256geohash(<size>) \ No newline at end of file diff --git a/static/images/docs/diagrams/createTableDef.svg b/static/images/docs/diagrams/createTableDef.svg index 16d59812b..a17e6a669 100644 --- a/static/images/docs/diagrams/createTableDef.svg +++ b/static/images/docs/diagrams/createTableDef.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/static/images/docs/diagrams/declare.svg b/static/images/docs/diagrams/declare.svg index 367699a4c..86040c80d 100644 --- a/static/images/docs/diagrams/declare.svg +++ b/static/images/docs/diagrams/declare.svg @@ -1,91 +1,55 @@ - - - - - - DECLARE - - - @variable - - - := - - - - expression - - - - , - - - - withExpr - - - - - selectExpr - - - - - + + + + + DECLARE + + + @variable + + + := + + + expression + + , + + + withExpr + + + selectExpr + + + \ No newline at end of file diff --git a/static/images/docs/diagrams/fromTo.svg b/static/images/docs/diagrams/fromTo.svg index d55ce75e1..8c18e63fc 100644 --- a/static/images/docs/diagrams/fromTo.svg +++ b/static/images/docs/diagrams/fromTo.svg @@ -1,90 +1,53 @@ - - - - - - - someSampleBySelectQuery... - - - - FROM - - - - lowerBound - - - - TO - - - - upperBound - - - - TO - - - - upperBound - - - - - + + + + + someSampleBySelectQuery... + + FROM + + + lowerBound + + TO + + + upperBound + + TO + + + upperBound + + + \ No newline at end of file diff --git a/static/images/docs/diagrams/innerLeftJoin.svg b/static/images/docs/diagrams/innerLeftJoin.svg new file mode 100644 index 000000000..fd169f467 --- /dev/null +++ b/static/images/docs/diagrams/innerLeftJoin.svg @@ -0,0 +1,80 @@ + + + + + + + + + INNER + + + LEFT + + + JOIN + + + table + + ( + + + sub-query + + ) + + + ON + + + column + + + operator + + + anotherColumn + + AND + + + ( + + + column + + , + + + ) + + + + \ No newline at end of file diff --git a/static/images/docs/diagrams/insertInto.svg b/static/images/docs/diagrams/insertInto.svg index 9e634f9c5..69cefeeb8 100644 --- a/static/images/docs/diagrams/insertInto.svg +++ b/static/images/docs/diagrams/insertInto.svg @@ -1,4 +1,4 @@ - + - - - - - INSERT - - - batch - - - batchCount - - INTO - - - tableName - - ( - - - columnName - - , - - - ) - - - VALUES - - - ( - - - value - - , - - - ) - - - , - - - SELECT - - - queryDef - - - mainQuery - - ; - - - + + + + + INSERT + + + ATOMIC + + + BATCH + + + number + + o3MaxLag + + + numberWithUnit + + INTO + + + tableName + + ( + + + columnName + + , + + + ) + + + VALUES + + + ( + + + value + + , + + + ) + + + , + + + SELECT + + + queryDef + + + mainQuery + + ; + + + \ No newline at end of file diff --git a/static/images/docs/diagrams/typeDef.svg b/static/images/docs/diagrams/typeDef.svg index c0301dd23..c1ddb869d 100644 --- a/static/images/docs/diagrams/typeDef.svg +++ b/static/images/docs/diagrams/typeDef.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/static/images/docs/diagrams/update.svg b/static/images/docs/diagrams/update.svg index abfbff034..1b550106f 100644 --- a/static/images/docs/diagrams/update.svg +++ b/static/images/docs/diagrams/update.svg @@ -1,4 +1,4 @@ - + - - - - - UPDATE - - tableName - - - SET - - - columnName - - = - - - expression - - - , - - - + + + + + UPDATE + + tableName + + + SET + + + columnName + + = + + + expression + + + , + + + FROM + + joinTable1 + + + JOIN + + joinTable2 + + + ON + + joinCondition2 + + + WHERE + + filter + + + \ No newline at end of file diff --git a/static/images/docs/diagrams/withAsInsert.svg b/static/images/docs/diagrams/withAsInsert.svg index ff4e54201..cba7937de 100644 --- a/static/images/docs/diagrams/withAsInsert.svg +++ b/static/images/docs/diagrams/withAsInsert.svg @@ -1,183 +1,87 @@ - - - - - - WITH - - - - subQueryName - - - - AS - - - ( - - - - subQuery - - - - ) - - - , - - - INSERT - - - ATOMIC - - - BATCH - - - - number - - - - o3MaxLag - - - - numberWithUnit - - - - INTO - - - - tableName - - - - SELECT - - - - queryDef - - - - - subQueryName - - - - ; - - - - + + + + + WITH + + + subQueryName + + AS + + + ( + + + subQuery + + ) + + + , + + + INSERT + + + ATOMIC + + + BATCH + + + number + + o3MaxLag + + + numberWithUnit + + INTO + + + tableName + + SELECT + + + queryDef + + + subQueryName + + ; + + + + \ No newline at end of file From e4f28f9b7121156de6fe477d9df0d9d003c792a0 Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 15:45:59 +0200 Subject: [PATCH 11/15] docs: Adding decimal to castmap --- documentation/reference/sql/cast.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/documentation/reference/sql/cast.md b/documentation/reference/sql/cast.md index d66421fc9..6def77546 100644 --- a/documentation/reference/sql/cast.md +++ b/documentation/reference/sql/cast.md @@ -88,9 +88,35 @@ Implicit casting also prevents data loss. When an operation involves multiple types, the resulting type will be the smallest possible type so that no data is lost. +## Casting table + The below chart illustrates the explicit and implicit cast available in QuestDB: -![Table showing the different possibilities the cast function supports, those are defined by an input and output types](/images/docs/castmap.jpg) +| From \ To | String | Boolean | Char | Byte | Short | Int | Long | Long256 | Float | Double | Decimal | Date | Timestamp | Symbol | Binary | +| --------- | ------ | ------- | ----- | ----- | ----- | ----- | ----- | ------- | ----- | ------ | ------- | ----- | --------- | ------ | ------ | +| String | | `E` | `E*` | `E` | `E` | `I` | `I` | `I` | `I` | `I` | `E` | `I` | `I` | `I` | `N/A` | +| Boolean | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | +| Char | `I` | `N/A` | | `E*` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | +| Byte | `I` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Short | `I` | `E*` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Int | `E` | `E*` | `E*` | `E*` | `E*` | | `I` | `I` | `I*` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Long | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | | `I` | `E*` | `I*` | `I` | `I` | `I` | `E` | `N/A` | +| Long256 | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `E*` | | `E*` | `E*` | `N/A` | `E*` | `E*` | `E*` | `N/A` | +| Float | `E` | `N/A` | `E*` | `E*` | `E*` | `I*` | `I*` | `I*` | | `I` | `E*` | `I*` | `I*` | `I` | `N/A` | +| Double | `E` | `N/A` | `E*` | `E*` | `E*` | `E*` | `I*` | `I*` | `E*` | | `E*` | `I*` | `I*` | `E` | `N/A` | +| Decimal | `E` | `N/A` | `N/A` | `E!` | `E!` | `E!` | `E!` | `N/A` | `E*` | `E*` | | `N/A` | `N/A` | `N/A` | `N/A` | +| Date | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | | `I` | `E` | `N/A` | +| Timestamp | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | `I*` | | `E` | `N/A` | +| Symbol | `I` | `E` | `E` | `E` | `E` | `E` | `I` | `I` | `E` | `I` | `N/A` | `I` | `I` | | `N/A` | +| Binary | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | + +#### Legend + +- `E`: Explicit cast (using the `cast` function or `::` operator) +- `I`: Implicit cast +- `*`: The cast operation might lead to precision loss +- `!`: The cast operation throws an error when if it would lead to precision + loss ```questdb-sql title="Queries" SELECT From dca6a83657deadd2d99a5e46063a9653b91485ae Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Thu, 2 Oct 2025 15:51:48 +0200 Subject: [PATCH 12/15] docs: Improve decimal concept page --- documentation/concept/decimal.md | 79 +++++--------------------------- 1 file changed, 12 insertions(+), 67 deletions(-) diff --git a/documentation/concept/decimal.md b/documentation/concept/decimal.md index c583e3987..bf15b266a 100644 --- a/documentation/concept/decimal.md +++ b/documentation/concept/decimal.md @@ -6,7 +6,7 @@ description: practices for financial and scientific calculations. --- -QuestDB provides a `decimal` data type for exact numeric calculations, essential +QuestDB provides a `decimal` data type for exact numeric calculations, useful for financial computations, scientific measurements, and any scenario where precision matters. This page explains how to use decimals effectively, including syntax, operations, and performance considerations. @@ -18,15 +18,6 @@ operations. Unlike floating-point types (`float` and `double`), decimals avoid rounding errors by storing numbers as scaled integers internally. This makes them ideal for monetary calculations where accuracy is critical. -### Key characteristics - -- **Exact arithmetic**: No rounding errors during addition, subtraction, and - multiplication -- **Fixed precision**: Numbers are stored with a defined number of total digits -- **Fixed scale**: A specific number of digits after the decimal point -- **Variable storage**: Automatically optimized from 1 to 32 bytes based on - precision - ## Decimal type in QuestDB QuestDB implements decimals with the syntax `DECIMAL(precision, scale)`: @@ -40,9 +31,10 @@ For example, `DECIMAL(10, 2)` can store values from -99,999,999.99 to If neither the precision and scale are provided, the type defaults to a precision of 18 and a scale of 3. -### Storage optimization +### Storage -QuestDB automatically selects the optimal storage size based on precision: +QuestDB automatically selects the optimal storage size based on the decimal's +precision: | Precision | Storage Size | Internal Type | | ------------ | ------------ | ------------- | @@ -194,7 +186,8 @@ SELECT CAST(99.99m AS DOUBLE); -- Result: 99.99 (as floating-point) - **No implicit conversion from double/float**: Must use explicit `CAST` or decimal literals -- **Integer to decimal**: Safe, no precision loss +- **Integer to decimal**: Safe, no precision loss, the decimals have a scale of + 0 - **Double to decimal**: May lose precision due to floating-point representation - **Between decimal types**: Automatic when precision/scale allows @@ -210,16 +203,13 @@ SELECT CAST(99.99m AS DOUBLE); -- Result: 99.99 (as floating-point) - **Slower than floating-point**: Typically slower than `double` operations - **More storage**: May use more space than `float` for equivalent range -- **Complex operations**: Division and advanced math functions have overhead +- **Complex operations**: Division have overhead ### Performance tips -1. **Use appropriate precision**: Don't over-specify precision beyond your needs -2. **Keep precision ≤ 18 when possible**: DECIMAL64 operations are faster than - DECIMAL128/256 -3. **Pre-calculate when possible**: Store commonly used calculations -4. **Consider doubles for analysis**: Use decimals for storage, doubles for - complex analytics +- **Use appropriate precision**: Don't over-specify precision beyond your needs +- **Keep precision ≤ 18 when possible**: DECIMAL64 operations are faster than + DECIMAL128/256 ## Common use cases @@ -298,7 +288,7 @@ SAMPLE BY 1h; ### When to use decimals -✅ **Use decimals for:** +**Use decimals for:** - Financial data (prices, amounts, exchange rates) - Accounting calculations @@ -306,7 +296,7 @@ SAMPLE BY 1h; - Regulatory compliance scenarios - Any calculation where rounding errors are unacceptable -❌ **Avoid decimals for:** +**Avoid decimals for:** - Scientific calculations requiring extensive math functions - Performance-critical analytics on large datasets @@ -348,48 +338,3 @@ SAMPLE BY 1h; -- Good: Use decimal literal SELECT amount + 10.00m FROM prices; ``` - -## Differences from doubles - -| Aspect | Decimal | Double | -| ------------------- | ------------------------- | --------------------- | -| **Precision** | Exact | Approximate | -| **Rounding errors** | None for basic operations | Can accumulate | -| **Performance** | Slower | Faster | -| **Storage** | Variable (1-32 bytes) | Fixed (8 bytes) | -| **Use case** | Money, exact values | Scientific, analytics | -| **Literal syntax** | Requires 'm' suffix | Standard notation | - -## Example: Financial reporting - -Here's a complete example showing decimals in a financial reporting scenario: - -```questdb-sql --- Create financial tables -CREATE TABLE account_transactions ( - account_id SYMBOL, - transaction_type SYMBOL, - amount DECIMAL(15, 2), - balance DECIMAL(15, 2), - timestamp TIMESTAMP -) timestamp(timestamp); - --- Insert sample transactions -INSERT INTO account_transactions VALUES - ('ACC001', 'DEPOSIT', 1000.00m, 1000.00m, '2024-01-01'), - ('ACC001', 'WITHDRAWAL', 150.50m, 849.50m, '2024-01-02'), - ('ACC001', 'INTEREST', 2.12m, 851.62m, '2024-01-03'), - ('ACC002', 'DEPOSIT', 5000.00m, 5000.00m, '2024-01-01'), - ('ACC002', 'TRANSFER', 500.00m, 4500.00m, '2024-01-02'); - --- Financial summary with exact calculations -SELECT - account_id, - sum(CASE WHEN transaction_type = 'DEPOSIT' THEN amount ELSE 0.00m END) AS total_deposits, - sum(CASE WHEN transaction_type = 'WITHDRAWAL' THEN amount ELSE 0.00m END) AS total_withdrawals, - last(balance) AS current_balance, - count(*) AS transaction_count -FROM account_transactions -WHERE timestamp >= '2024-01-01' -GROUP BY account_id; -``` From 76fa34cd94f558b9d03f3ec0deaefc737d7b42ec Mon Sep 17 00:00:00 2001 From: javier Date: Thu, 2 Oct 2025 16:53:17 +0200 Subject: [PATCH 13/15] script to generate type cast chart --- documentation/reference/sql/cast.md | 28 +------- scripts/generate_type_cast_chart.py | 98 ++++++++++++++++++++++++++++ static/images/docs/castmap.jpg | Bin 47783 -> 187026 bytes 3 files changed, 101 insertions(+), 25 deletions(-) create mode 100644 scripts/generate_type_cast_chart.py diff --git a/documentation/reference/sql/cast.md b/documentation/reference/sql/cast.md index 6def77546..25bab46f0 100644 --- a/documentation/reference/sql/cast.md +++ b/documentation/reference/sql/cast.md @@ -91,32 +91,10 @@ smallest possible type so that no data is lost. ## Casting table The below chart illustrates the explicit and implicit cast available in QuestDB: + + +![Table showing the different possibilities the cast function supports, those are defined by an input and output types](/images/docs/castmap.jpg) -| From \ To | String | Boolean | Char | Byte | Short | Int | Long | Long256 | Float | Double | Decimal | Date | Timestamp | Symbol | Binary | -| --------- | ------ | ------- | ----- | ----- | ----- | ----- | ----- | ------- | ----- | ------ | ------- | ----- | --------- | ------ | ------ | -| String | | `E` | `E*` | `E` | `E` | `I` | `I` | `I` | `I` | `I` | `E` | `I` | `I` | `I` | `N/A` | -| Boolean | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | -| Char | `I` | `N/A` | | `E*` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | -| Byte | `I` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | -| Short | `I` | `E*` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | -| Int | `E` | `E*` | `E*` | `E*` | `E*` | | `I` | `I` | `I*` | `I` | `I` | `I` | `I` | `I` | `N/A` | -| Long | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | | `I` | `E*` | `I*` | `I` | `I` | `I` | `E` | `N/A` | -| Long256 | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `E*` | | `E*` | `E*` | `N/A` | `E*` | `E*` | `E*` | `N/A` | -| Float | `E` | `N/A` | `E*` | `E*` | `E*` | `I*` | `I*` | `I*` | | `I` | `E*` | `I*` | `I*` | `I` | `N/A` | -| Double | `E` | `N/A` | `E*` | `E*` | `E*` | `E*` | `I*` | `I*` | `E*` | | `E*` | `I*` | `I*` | `E` | `N/A` | -| Decimal | `E` | `N/A` | `N/A` | `E!` | `E!` | `E!` | `E!` | `N/A` | `E*` | `E*` | | `N/A` | `N/A` | `N/A` | `N/A` | -| Date | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | | `I` | `E` | `N/A` | -| Timestamp | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | `I*` | | `E` | `N/A` | -| Symbol | `I` | `E` | `E` | `E` | `E` | `E` | `I` | `I` | `E` | `I` | `N/A` | `I` | `I` | | `N/A` | -| Binary | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | - -#### Legend - -- `E`: Explicit cast (using the `cast` function or `::` operator) -- `I`: Implicit cast -- `*`: The cast operation might lead to precision loss -- `!`: The cast operation throws an error when if it would lead to precision - loss ```questdb-sql title="Queries" SELECT diff --git a/scripts/generate_type_cast_chart.py b/scripts/generate_type_cast_chart.py new file mode 100644 index 000000000..43b745a07 --- /dev/null +++ b/scripts/generate_type_cast_chart.py @@ -0,0 +1,98 @@ +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + + +markdown_table = """ +| From \\ To | String | Boolean | Char | Byte | Short | Int | Long | Long256 | Float | Double | Decimal | Date | Timestamp | Symbol | Binary | +| --------- | ------ | ------- | ----- | ----- | ----- | ----- | ----- | ------- | ----- | ------ | ------- | ----- | --------- | ------ | ------ | +| String | | `E` | `E*` | `E` | `E` | `I` | `I` | `I` | `I` | `I` | `E` | `I` | `I` | `I` | `N/A` | +| Boolean | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | +| Char | `I` | `N/A` | | `E*` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | `I` | `I` | `I` | `N/A` | +| Byte | `I` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Short | `I` | `E*` | `E*` | `I` | | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Int | `E` | `E*` | `E*` | `E*` | `E*` | | `I` | `I` | `I*` | `I` | `I` | `I` | `I` | `I` | `N/A` | +| Long | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | | `I` | `E*` | `I*` | `I` | `I` | `I` | `E` | `N/A` | +| Long256 | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `E*` | | `E*` | `E*` | `N/A` | `E*` | `E*` | `E*` | `N/A` | +| Float | `E` | `N/A` | `E*` | `E*` | `E*` | `I*` | `I*` | `I*` | | `I` | `E*` | `I*` | `I*` | `I` | `N/A` | +| Double | `E` | `N/A` | `E*` | `E*` | `E*` | `E*` | `I*` | `I*` | `E*` | | `E*` | `I*` | `I*` | `E` | `N/A` | +| Decimal | `E` | `N/A` | `N/A` | `E!` | `E!` | `E!` | `E!` | `N/A` | `E*` | `E*` | | `N/A` | `N/A` | `N/A` | `N/A` | +| Date | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | | `I` | `E` | `N/A` | +| Timestamp | `E` | `E*` | `E*` | `E*` | `E*` | `E*` | `I` | `I` | `E*` | `I*` | `N/A` | `I*` | | `E` | `N/A` | +| Symbol | `I` | `E` | `E` | `E` | `E` | `E` | `I` | `I` | `E` | `I` | `N/A` | `I` | `I` | | `N/A` | +| Binary | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | `N/A` | +""" + +# --- Parse Markdown into matrix --- +lines = [line.strip() for line in markdown_table.strip().split("\n") if line.strip()] +header = [h.strip() for h in lines[0].split("|")[1:-1]] # remove leading/trailing pipe +rows = [] + +matrix = {} +for line in lines[2:]: # skip header + separator + parts = [p.strip().strip("`") for p in line.split("|")[1:-1]] + row_name, values = parts[0], parts[1:] + matrix[row_name] = dict(zip(header[1:], values)) # map To-cols to values + rows.append(row_name) + +cols = header[1:] + +# --- Color mapping --- +color_map = { + "": "white", + "I": "#a6d96a", # implicit + "E": "#fdae61", # explicit + "I*": "#313695", # implicit precision loss + "E*": "#d73027", # explicit precision loss + "E!": "#e08214", # explicit warning + "N/A": "#7f7f7f" # grey +} + +# --- Plot --- +fig, ax = plt.subplots(figsize=(5, 4)) + +for i, row in enumerate(rows): + for j, col in enumerate(cols): + val = matrix[row].get(col, "") + ax.add_patch(plt.Rectangle( + (j, i), 1, 1, + facecolor=color_map.get(val, "white"), + edgecolor="black", linewidth=0.5 + )) + +# Configure ticks +ax.set_xticks([i + 0.5 for i in range(len(cols))]) +ax.set_yticks([i + 0.5 for i in range(len(rows))]) +ax.set_xticklabels(cols, rotation=90) +ax.set_yticklabels(rows) + +# Put X axis labels at the top +ax.xaxis.tick_top() + +ax.set_xlim(0, len(cols)) +ax.set_ylim(0, len(rows)) +ax.invert_yaxis() +ax.set_aspect("equal") + +# Axis labels +ax.set_xlabel("TO", labelpad=20) +ax.xaxis.set_label_position("top") + +ax.set_ylabel("FROM", labelpad=20) +ax.yaxis.set_label_position("left") + +# Legend centered at bottom +legend_elements = [ + mpatches.Patch(facecolor="#a6d96a", edgecolor="black", label="Implicit"), + mpatches.Patch(facecolor="#fdae61", edgecolor="black", label="Explicit"), + mpatches.Patch(facecolor="#313695", edgecolor="black", label="Implicit (precision loss)"), + mpatches.Patch(facecolor="#d73027", edgecolor="black", label="Explicit (precision loss)"), + mpatches.Patch(facecolor="#7f7f7f", edgecolor="black", label="N/A") +] +ax.legend(handles=legend_elements, + bbox_to_anchor=(0.5, -0.05), loc="upper center", ncol=3, frameon=False) + +# Save directly to file +path = "../static/images/docs/castmap.jpg" +plt.savefig(path, dpi=300, bbox_inches="tight") +plt.close() +print("file written to: " + path) diff --git a/static/images/docs/castmap.jpg b/static/images/docs/castmap.jpg index 920118f31c14cb541f9d35e089a297d3377915ac..a96ad001fd00e6ac17f88e7c954ee4b8162df029 100644 GIT binary patch literal 187026 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%0D;L}>lvZX*Z6orJ*FgLGSu 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 literal 47783 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 From b7f8f39e0005eb06f3437500d2b2f0e751455d4d Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Fri, 3 Oct 2025 12:51:10 +0200 Subject: [PATCH 14/15] docs: Add disclaimer for decimal parameters sent as double --- documentation/pgwire/pgwire-intro.md | 90 ++++++++++++++++++---------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/documentation/pgwire/pgwire-intro.md b/documentation/pgwire/pgwire-intro.md index 0152c5e02..f5a374d0d 100644 --- a/documentation/pgwire/pgwire-intro.md +++ b/documentation/pgwire/pgwire-intro.md @@ -7,54 +7,84 @@ description: import { Clients } from "../../src/components/Clients" -QuestDB implements the PostgreSQL wire protocol (PGWire) to allow clients to connect to QuestDB using PostgreSQL client -libraries. This is a great way to get started with QuestDB, as it allows you to use existing PostgreSQL clients and +QuestDB implements the PostgreSQL wire protocol (PGWire) to allow clients to +connect to QuestDB using PostgreSQL client libraries. This is a great way to get +started with QuestDB, as it allows you to use existing PostgreSQL clients and libraries. - + -When using PGWire with QuestDB, there are a few important things to know and the rest of this document will cover them -in more detail. +When using PGWire with QuestDB, there are a few important things to know and the +rest of this document will cover them in more detail. ### Querying vs. Ingestion -The PGWire interface is primarily recommended for querying data from -QuestDB. For data ingestion, especially for high-throughput scenarios, QuestDB recommends using its clients that -support the [InfluxDB Line Protocol (ILP)](/docs/ingestion-overview/). These are optimized for fast data insertion. +The PGWire interface is primarily recommended for querying data from QuestDB. +For data ingestion, especially for high-throughput scenarios, QuestDB recommends +using its clients that support the +[InfluxDB Line Protocol (ILP)](/docs/ingestion-overview/). These are optimized +for fast data insertion. ### Timestamp Handling -QuestDB stores all timestamps internally in [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time). -However, when transmitting timestamps over the PGWire protocol, QuestDB represents them as `TIMESTAMP WITHOUT TIMEZONE`. -This can lead to client -libraries interpreting these timestamps in their local timezone by default, potentially causing confusion or incorrect -data representation. Our language-specific guides provide detailed examples on how to configure your client to correctly -interpret these timestamps as UTC. +QuestDB stores all timestamps internally in +[UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time). However, when +transmitting timestamps over the PGWire protocol, QuestDB represents them as +`TIMESTAMP WITHOUT TIMEZONE`. This can lead to client libraries interpreting +these timestamps in their local timezone by default, potentially causing +confusion or incorrect data representation. Our language-specific guides provide +detailed examples on how to configure your client to correctly interpret these +timestamps as UTC. -We realize the current behavior is not ideal and we are actively working on improving it. In the meantime, we -recommend that you set the timezone in your client library to UTC to ensure consistent handling of timestamps. +We realize the current behavior is not ideal and we are actively working on +improving it. In the meantime, we recommend that you set the timezone in your +client library to UTC to ensure consistent handling of timestamps. ### PGWire vs. SQL Semantics -While QuestDB supports the PGWire protocol for communication, its SQL dialect and feature -set are not identical to PostgreSQL. QuestDB is a specialized time-series database and does not support all SQL -features, functions, or data types that a standard PostgreSQL server does. Always refer to the QuestDB SQL +While QuestDB supports the PGWire protocol for communication, its SQL dialect +and feature set are not identical to PostgreSQL. QuestDB is a specialized +time-series database and does not support all SQL features, functions, or data +types that a standard PostgreSQL server does. Always refer to the QuestDB SQL documentation for supported operations. ### Forward-only Cursors -QuestDB's cursors are forward-only, differing from PostgreSQL's support for scrollable cursors (which allow -bidirectional navigation and arbitrary row access). With QuestDB, you can iterate through query results sequentially -from start to finish, but you cannot move backward or jump to specific rows. Explicit DECLARE CURSOR statements for -scrollable types, or operations like fetching in reverse (e.g., Workspace BACKWARD), are not supported. +QuestDB's cursors are forward-only, differing from PostgreSQL's support for +scrollable cursors (which allow bidirectional navigation and arbitrary row +access). With QuestDB, you can iterate through query results sequentially from +start to finish, but you cannot move backward or jump to specific rows. Explicit +DECLARE CURSOR statements for scrollable types, or operations like fetching in +reverse (e.g., Workspace BACKWARD), are not supported. -This limitation can impact client libraries that rely on scrollable cursor features. For example, Python's psycopg2 -driver might encounter issues if attempting such operations. For optimal compatibility, choose drivers or configure -existing ones to use forward-only cursors, such as Python's asyncpg driver. +This limitation can impact client libraries that rely on scrollable cursor +features. For example, Python's psycopg2 driver might encounter issues if +attempting such operations. For optimal compatibility, choose drivers or +configure existing ones to use forward-only cursors, such as Python's asyncpg +driver. ### Protocol Flavors and Encoding -The PostgreSQL wire protocol has different implementations and options. When your -client library allows, prefer the Extended Query Protocol over the Simple Query Protocol. Additionally, for optimal -performance and type fidelity, choose clients that support BINARY encoding for data transfer over TEXT encoding -whenever possible. The specifics of how to configure this will vary by client library. +The PostgreSQL wire protocol has different implementations and options. When +your client library allows, prefer the Extended Query Protocol over the Simple +Query Protocol. Additionally, for optimal performance and type fidelity, choose +clients that support BINARY encoding for data transfer over TEXT encoding +whenever possible. The specifics of how to configure this will vary by client +library. + +### Decimal + +To insert `decimal` values via PGWire, you must either use the `m` suffix to +indicate that the value is a decimal literal or cast the value to `decimal`. For +example: + +```questdb-sql +INSERT INTO my_table (decimal_column) VALUES (123.45m); -- Using 'm' suffix +INSERT INTO my_table (decimal_column) VALUES (CAST($1 AS DECIMAL(18, 3))); -- Using CAST over bind parameter +``` + +In the text format, PostgreSQL clients send decimal values as strings. +Currently, QuestDB parses these strings as `double` values and doesn't +implicitly convert them to `decimal` to avoid unintended precision loss. So you +must explicitly cast `double` values to `decimal` in your SQL queries when +inserting into `decimal` columns. From a29cc6f68d98ab18aef8206b6e3c0a604117588e Mon Sep 17 00:00:00 2001 From: Raphael DALMON Date: Fri, 10 Oct 2025 10:06:00 +0200 Subject: [PATCH 15/15] docs: fixing a few quirks --- documentation/concept/decimal.md | 4 ++-- documentation/reference/api/ilp/columnset-types.md | 2 +- documentation/reference/function/numeric.md | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/documentation/concept/decimal.md b/documentation/concept/decimal.md index bf15b266a..a5412b6b5 100644 --- a/documentation/concept/decimal.md +++ b/documentation/concept/decimal.md @@ -74,7 +74,7 @@ Define decimal columns by specifying precision and scale: ```questdb-sql CREATE TABLE transactions ( id LONG, - amount DECIMAL(15, 2), -- Up to 999,999,999,999.99 + amount DECIMAL(14, 2), -- Up to 999,999,999,999.99 tax_rate DECIMAL(5, 4), -- Up to 9.9999 (e.g., 0.0875 for 8.75%) quantity DECIMAL(10, 3), -- Up to 9,999,999.999 timestamp TIMESTAMP @@ -191,7 +191,7 @@ SELECT CAST(99.99m AS DOUBLE); -- Result: 99.99 (as floating-point) - **Double to decimal**: May lose precision due to floating-point representation - **Between decimal types**: Automatic when precision/scale allows -## Performance considerations +## Considerations ### Advantages diff --git a/documentation/reference/api/ilp/columnset-types.md b/documentation/reference/api/ilp/columnset-types.md index a4665adb0..a40a0904c 100644 --- a/documentation/reference/api/ilp/columnset-types.md +++ b/documentation/reference/api/ilp/columnset-types.md @@ -79,7 +79,7 @@ type is not `double`: ## Decimal Decimal values, which correspond to QuestDB type `decimal`. The values are -required to have an `d` suffix. For example: +required to have a `d` suffix. For example: ```shell trade,ticker=BTCUSD price=30000.50d 1638202821000000000\n diff --git a/documentation/reference/function/numeric.md b/documentation/reference/function/numeric.md index cb79d867e..05ee9f29c 100644 --- a/documentation/reference/function/numeric.md +++ b/documentation/reference/function/numeric.md @@ -67,7 +67,7 @@ SELECT ceil(15.75) as RoundedUp; **Arguments:** -- `value` is any numeric value. +- `value` is any numeric value, except `decimal`. **Return value:** @@ -160,7 +160,7 @@ SELECT least(11, 3, 8, 15) **Arguments:** -- `value` is any numeric value. +- `value` is any numeric value, except `decimal`. **Return value:** @@ -182,7 +182,7 @@ SELECT ln(4.123) **Arguments:** -- `value` is any numeric value. +- `value` is any numeric value, except `decimal`. **Return value:** @@ -213,8 +213,8 @@ defined by `exponent`. **Arguments:** -- `base` is any numeric value. -- `exponent` is any numeric value. +- `base` is any numeric value, except `decimal`. +- `exponent` is any numeric value, except `decimal`. **Return value:** @@ -468,7 +468,7 @@ SELECT size_pretty(400032); **Arguments:** -- `value` is any numeric value. +- `value` is any numeric value, except `decimal`. **Return value:**