diff --git a/packages/malloy-db-duckdb/src/duckdb_wasm_connection.spec.ts b/packages/malloy-db-duckdb/src/duckdb_wasm_connection.spec.ts index 1598f2161..9ca59c3ca 100644 --- a/packages/malloy-db-duckdb/src/duckdb_wasm_connection.spec.ts +++ b/packages/malloy-db-duckdb/src/duckdb_wasm_connection.spec.ts @@ -105,4 +105,12 @@ FROM read_parquet("inventory_items2.parquet") {} ); }); + + // Test to check that DecimalBigNums are broken. + // Remove/update when fixed, and remove the work-around in + // sqlLiteralNumber() + it('DecimalBigNum is broken', async () => { + const result = await connection.runSQL('SELECT 1.234 AS n1'); + expect(result).toEqual({'rows': [{'n1': 1234}], 'totalRows': 1}); + }); }); diff --git a/packages/malloy/src/dialect/duckdb/duckdb.ts b/packages/malloy/src/dialect/duckdb/duckdb.ts index 044f2c366..cc81ccb98 100644 --- a/packages/malloy/src/dialect/duckdb/duckdb.ts +++ b/packages/malloy/src/dialect/duckdb/duckdb.ts @@ -105,6 +105,14 @@ export class DuckDBDialect extends Dialect { return `FIRST(${fieldName}) FILTER (WHERE ${fieldName} IS NOT NULL)`; } + // DuckDB WASM has an issue with returning invalid DecimalBigNum + // values unless we explicitly cast to DOUBLE + override sqlLiteralNumber(literal: string): string { + return literal.includes('.') + ? `${literal}::${this.defaultNumberType}` + : literal; + } + mapFields(fieldList: DialectFieldList): string { return fieldList.join(', '); } diff --git a/test/src/databases/duckdb/duckdb.spec.ts b/test/src/databases/duckdb/duckdb.spec.ts index 80c1a9501..c4fc354bd 100644 --- a/test/src/databases/duckdb/duckdb.spec.ts +++ b/test/src/databases/duckdb/duckdb.spec.ts @@ -90,6 +90,17 @@ describe.each(allDucks.runtimeList)('duckdb:%s', (dbName, runtime) => { ); }); + it('handles decimal literals', async () => { + const query = ` + run: duckdb.sql("select 1") -> { + select: + n1 is 1.234 + n2 is 1234.0 / 1000 + } + `; + await expect(query).malloyResultMatches(runtime, {n1: 1.234, n2: 1.234}); + }); + it('can open json files', async () => { await expect(` run: duckdb.table('test/data/duckdb/test.json') -> {