Skip to content

Commit fba02d2

Browse files
authored
Support bigDecimal type in python client (#117)
1 parent 0250092 commit fba02d2

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

pinotdb/sqlalchemy.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ def get_type(data_type, field_size):
368368
"long": types.BigInteger,
369369
"float": types.Float,
370370
"double": types.Numeric,
371+
"big_decimal": types.Numeric,
371372
# BOOLEAN, is added after release 0.7.1.
372373
# In release 0.7.1 and older releases, BOOLEAN is equivalent to STRING.
373374
"boolean": types.Boolean,

tests/unit/test_sqlalchemy.py

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
"""
1212

1313
from unittest import TestCase
14+
import json
1415

1516
import responses
1617
from sqlalchemy import (
1718
BigInteger, Column, Integer, MetaData, String, Table,
18-
column, select,
19+
column, select, types,
1920
)
2021
from sqlalchemy.engine import make_url
2122

@@ -215,6 +216,31 @@ def test_gets_columns_with_different_default_values(self):
215216
},
216217
])
217218

219+
@responses.activate
220+
def test_gets_columns_with_big_decimal_type(self):
221+
table_name = 'some-table'
222+
url = f'{self.dialect._controller}/tables/{table_name}/schema'
223+
responses.get(url, json={
224+
'tables': [table_name],
225+
'timeFieldSpec': {},
226+
'dimensionFieldSpecs': [{
227+
'name': 'price',
228+
'dataType': 'BIG_DECIMAL',
229+
'defaultNullValue': '0.00',
230+
}],
231+
})
232+
233+
columns = self.dialect.get_columns('conn', table_name)
234+
235+
self.assertEqual(columns, [
236+
{
237+
'default': '0.00',
238+
'name': 'price',
239+
'nullable': True,
240+
'type': types.Numeric,
241+
},
242+
])
243+
218244
@responses.activate
219245
def test_gets_columns_with_time_spec(self):
220246
table_name = 'some-table'
@@ -269,18 +295,29 @@ def test_gets_unique_constraints(self):
269295

270296
self.assertEqual(result, [])
271297

272-
def test_gets_view_definition(self):
273-
self.assertIsNone(self.dialect.get_view_definition('conn', 'table'))
274-
275-
def test_cannot_rollback(self):
276-
self.assertIsNone(self.dialect.do_rollback('conn'))
277-
278298
def test_checks_unicode_returns(self):
279299
self.assertTrue(self.dialect._check_unicode_returns('conn'))
280300

281301
def test_checks_unicode_description(self):
282302
self.assertTrue(self.dialect._check_unicode_description('conn'))
283303

304+
def test_json_deserializer(self):
305+
# Test with string input
306+
self.assertEqual(self.dialect._json_deserializer('{"key": "value"}'), {"key": "value"})
307+
# Test with bytes input
308+
self.assertEqual(self.dialect._json_deserializer(b'{"key": "value"}'), {"key": "value"})
309+
# Test with already parsed JSON
310+
self.assertEqual(self.dialect._json_deserializer({"key": "value"}), {"key": "value"})
311+
# Test with non-JSON string - should raise JSONDecodeError
312+
with self.assertRaises(json.JSONDecodeError):
313+
self.dialect._json_deserializer("not json")
314+
315+
def test_get_view_definition(self):
316+
self.assertIsNone(self.dialect.get_view_definition('conn', 'view_name'))
317+
318+
def test_do_rollback(self):
319+
self.assertIsNone(self.dialect.do_rollback('conn'))
320+
284321

285322
class PinotMultiStageDialectTest(PinotTestCase):
286323
def setUp(self) -> None:

0 commit comments

Comments
 (0)