From 0a3c1efdd4bec958c06586d92d0bcc7936cda1c5 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Fri, 5 Dec 2025 13:13:08 +0100 Subject: [PATCH 1/6] Add support for parsing bigint and decimal types in PostgreSQL driver --- plugins/dbgate-plugin-postgres/src/backend/drivers.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/dbgate-plugin-postgres/src/backend/drivers.js b/plugins/dbgate-plugin-postgres/src/backend/drivers.js index 7cc58e45f..bd16ca953 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/drivers.js +++ b/plugins/dbgate-plugin-postgres/src/backend/drivers.js @@ -26,8 +26,11 @@ pg.types.setTypeParser(1184, 'text', val => val); // timestamp pg.types.setTypeParser(20, 'text', val => { const parsed = parseInt(val); if (Number.isSafeInteger(parsed)) return parsed; - return BigInt(val); + return { $bigint: val }; }); // timestamp +pg.types.setTypeParser(1700, 'text', val => { + return { $decimal: val }; +}); // numeric function extractGeographyDate(value) { try { From bbbd291065f3c6ed9001c5f84251aa5fada0911a Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Fri, 5 Dec 2025 13:13:29 +0100 Subject: [PATCH 2/6] Formatting decimal values in stringifyCellValue function --- packages/tools/src/stringTools.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts index 0c12ac9ea..bd3ba983b 100644 --- a/packages/tools/src/stringTools.ts +++ b/packages/tools/src/stringTools.ts @@ -272,6 +272,13 @@ export function stringifyCellValue( }; } + if (value?.$decimal) { + return { + value: formatCellNumber(value.$decimal, gridFormattingOptions), + gridStyle: 'valueCellStyle', + }; + } + if (editorTypes?.parseHexAsBuffer) { // if (value?.type == 'Buffer' && _isArray(value.data)) { // return { value: '0x' + arrayToHexString(value.data), gridStyle: 'valueCellStyle' }; From c1672ebc8e9e2d1d12ba6af5077e07cf47965ff4 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Fri, 5 Dec 2025 13:13:56 +0100 Subject: [PATCH 3/6] Handling decimal values in putValue method --- packages/tools/src/SqlDumper.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tools/src/SqlDumper.ts b/packages/tools/src/SqlDumper.ts index 9302fa368..dc767c325 100644 --- a/packages/tools/src/SqlDumper.ts +++ b/packages/tools/src/SqlDumper.ts @@ -87,6 +87,7 @@ export class SqlDumper implements AlterProcessor { this.putByteArrayValue(bytes); } else if (value?.$bigint) this.putRaw(value?.$bigint); + else if (value?.$decimal) this.putRaw(value?.$decimal); else if (_isPlainObject(value) || _isArray(value)) this.putStringValue(JSON.stringify(value)); else this.put('^null'); } From 2baf9758477b549d9eb5ea4dc4971f7eddae1eb7 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Fri, 5 Dec 2025 13:14:14 +0100 Subject: [PATCH 4/6] Added PostgreSQL decimal type in DataGridCell component --- packages/web/src/datagrid/DataGridCell.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/datagrid/DataGridCell.svelte b/packages/web/src/datagrid/DataGridCell.svelte index 585a4c081..02f7e08b2 100644 --- a/packages/web/src/datagrid/DataGridCell.svelte +++ b/packages/web/src/datagrid/DataGridCell.svelte @@ -57,7 +57,7 @@ $: style = computeStyle(maxWidth, col); $: isJson = - _.isPlainObject(value) && !(value?.type == 'Buffer' && _.isArray(value.data)) && !value.$oid && !value.$bigint; + _.isPlainObject(value) && !(value?.type == 'Buffer' && _.isArray(value.data)) && !value.$oid && !value.$bigint && !value.$decimal; // don't parse JSON for explicit data types $: jsonParsedValue = !editorTypes?.explicitDataType && isJsonLikeLongString(value) ? safeJsonParse(value) : null; From e67ee4ffdb463736efa5e9446d7cd985db849fca Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 8 Dec 2025 12:52:47 +0100 Subject: [PATCH 5/6] Add support for PostgreSQL decimal type in filter and grid utilities --- packages/filterparser/src/filterTool.ts | 1 + packages/sqltree/src/evaluateCondition.ts | 1 + packages/tools/src/stringTools.ts | 3 +++ packages/web/src/datagrid/gridutil.ts | 1 + 4 files changed, 6 insertions(+) diff --git a/packages/filterparser/src/filterTool.ts b/packages/filterparser/src/filterTool.ts index efab31696..3455262df 100644 --- a/packages/filterparser/src/filterTool.ts +++ b/packages/filterparser/src/filterTool.ts @@ -21,6 +21,7 @@ export function getFilterValueExpression(value, dataType?) { if (value === false) return 'FALSE'; if (value.$oid) return `ObjectId("${value.$oid}")`; if (value.$bigint) return value.$bigint; + if (value.$decimal) return value.$decimal; if (value.type == 'Buffer' && Array.isArray(value.data)) { return '0x' + arrayToHexString(value.data); } diff --git a/packages/sqltree/src/evaluateCondition.ts b/packages/sqltree/src/evaluateCondition.ts index ec5bbd2f7..f15be8053 100644 --- a/packages/sqltree/src/evaluateCondition.ts +++ b/packages/sqltree/src/evaluateCondition.ts @@ -19,6 +19,7 @@ function isLike(value, test) { function extractRawValue(value) { if (value?.$bigint) return value.$bigint; if (value?.$oid) return value.$oid; + if (value?.$decimal) return value.$decimal; return value; } diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts index bd3ba983b..7f2cd87d8 100644 --- a/packages/tools/src/stringTools.ts +++ b/packages/tools/src/stringTools.ts @@ -472,6 +472,9 @@ export function shouldOpenMultilineDialog(value) { if (value?.$bigint) { return false; } + if (value?.$decimal) { + return false; + } if (_isPlainObject(value) || _isArray(value)) { return true; } diff --git a/packages/web/src/datagrid/gridutil.ts b/packages/web/src/datagrid/gridutil.ts index 6aa179509..224429767 100644 --- a/packages/web/src/datagrid/gridutil.ts +++ b/packages/web/src/datagrid/gridutil.ts @@ -73,6 +73,7 @@ export function countColumnSizes(grider: Grider, columns, containerWidth, displa if (_.isArray(value)) text = `[${value.length} items]`; else if (value?.$oid) text = `ObjectId("${value.$oid}")`; else if (value?.$bigint) text = value.$bigint; + else if (value?.$decimal) text = value.$decimal; else if (isJsonLikeLongString(value) && safeJsonParse(value)) text = '(JSON)'; const width = context.measureText(typeof text == 'string' ? text.slice(0, MAX_GRID_TEXT_LENGTH) : text).width + 8; // console.log('colName', colName, text, width); From c6d3fc06a335d43f67741287a61f51af7e81b979 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 8 Dec 2025 13:57:10 +0100 Subject: [PATCH 6/6] Add support for deserializing decimal type --- packages/tools/src/stringTools.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts index 7f2cd87d8..c5f24f690 100644 --- a/packages/tools/src/stringTools.ts +++ b/packages/tools/src/stringTools.ts @@ -725,6 +725,9 @@ export function deserializeJsTypesFromJsonParse(obj) { if (value?.$bigint) { return BigInt(value.$bigint); } + if (value?.$decimal) { + return value.$decimal; + } }); } @@ -739,6 +742,9 @@ export function deserializeJsTypesReviver(key, value) { if (value?.$bigint) { return BigInt(value.$bigint); } + if (value?.$decimal) { + return value.$decimal; + } return value; }