tomnewton opened a new issue, #39840:
URL: https://github.com/apache/beam/issues/39840

   ### What would you like to happen?
   
   ### Problem
   
   ClickHouseIO has no notion of ClickHouse's fixed-point `Decimal` family — 
`Decimal(P, S)`,
   `Decimal(P)`, bare `Decimal`, and the width aliases `Decimal32(S)`, 
`Decimal64(S)`,
   `Decimal128(S)`, `Decimal256(S)`. The column-type parser rejects these type 
strings, so
   `ClickHouseIO.getTableSchema()` throws on the `DESCRIBE TABLE` output and 
pipelines cannot
   write to any table containing a Decimal column — a blocker for monetary and 
other
   fixed-point data.
   
   ### Proposed solution
   
   1. **Schema model**
      - Add `TypeName.DECIMAL`.
      - Extend `ColumnType` with a `scale` field alongside the existing 
`precision` field
        (introduced for `DateTime64`), plus a validated factory
        `ColumnType.decimal(int precision, int scale)` (P in [1, 76], S in [0, 
P]).
   
   2. **Parser**
      - Grammar rules for `Decimal[(P[, S])]` (bare `Decimal` = `Decimal(10, 
0)`,
        `Decimal(P)` = `Decimal(P, 0)`, matching ClickHouse) and the width 
aliases
        `Decimal32/64/128/256(S)` (precisions 9/18/38/76), reachable through
        `Nullable(...)` and `Array(...)`.
   
   3. **Beam field type mapping**
      - `Decimal(P, S)` maps to the `FixedPrecisionNumeric.of(P, S)` logical 
type
        (base type `DECIMAL`, values are `BigDecimal`), preserving the declared
        precision/scale through `getEquivalentSchema` — the same logical type 
JdbcIO
        uses for NUMERIC columns.
   
   4. **Writer**
      - Serialize as ClickHouse's RowBinary representation: the unscaled value 
as a
        little-endian signed integer whose width (32/64/128/256 bits) is chosen 
from the
        declared precision, exactly per ClickHouse's `Decimal(P, S)` → 
`Decimal32/64/128/256`
        synonym rule.
   
   5. **Defaults**
      - Support `DEFAULT <literal>` on Decimal columns in
        `ColumnType.parseDefaultExpression` — without it, schema fetch fails 
for any table
        with a defaulted Decimal column.
   
   6. **Tests**
      - Parser/mapping unit tests, byte-level writer tests, and round-trip 
tests against the
        ClickHouse test container for all four width buckets, 
`Nullable(Decimal)`,
        `Array(Decimal)`, DEFAULT handling, and `getTableSchema` on the 
server's canonicalized
        `DESCRIBE` output.
   
   
   ### Issue Priority
   
   Priority: 2 (default / most feature requests should be filed as P2)
   
   ### Issue Components
   
   - [ ] Component: Python SDK
   - [ ] Component: Java SDK
   - [ ] Component: Go SDK
   - [ ] Component: Typescript SDK
   - [x] Component: IO connector
   - [ ] Component: Beam YAML
   - [ ] Component: Beam examples
   - [ ] Component: Beam playground
   - [ ] Component: Beam katas
   - [ ] Component: Website
   - [ ] Component: Infrastructure
   - [ ] Component: Spark Runner
   - [ ] Component: Flink Runner
   - [ ] Component: Prism Runner
   - [ ] Component: Twister2 Runner
   - [ ] Component: Hazelcast Jet Runner
   - [ ] Component: Google Cloud Dataflow Runner


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to