Skip to content

Commit b59b981

Browse files
authored
Merge pull request #304 from Ryuk-me/sybase-query-schema-query-fix
fix: Sybase and mssql numeric_scale and numeric_precision query
2 parents 3e1cad5 + e33d6f0 commit b59b981

2 files changed

Lines changed: 13 additions & 7 deletions

File tree

dcs_core/integrations/databases/mssql.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,11 @@ def query_get_table_columns(
173173
"""
174174
schema = schema or self.schema_name
175175
database = self.quote_database(self.database)
176-
query = f"SELECT column_name, data_type, datetime_precision, numeric_precision, numeric_scale, collation_name, character_maximum_length FROM {database}.information_schema.columns WHERE table_name = '{table}' AND table_schema = '{schema}'"
177-
176+
query = (
177+
"SELECT column_name, data_type, ISNULL(datetime_precision, 0) AS datetime_precision, ISNULL(numeric_precision, 0) AS numeric_precision, ISNULL(numeric_scale, 0) AS numeric_scale, collation_name, ISNULL(character_maximum_length, 0) AS character_maximum_length "
178+
f"FROM {database}.information_schema.columns"
179+
f"WHERE table_name = '{table}' AND table_schema = '{schema}'"
180+
)
178181
rows = self.fetchall(query)
179182
if not rows:
180183
raise RuntimeError(

dcs_core/integrations/databases/sybase.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ def query_get_table_columns(
251251
if self.sybase_driver_type.is_iq:
252252
query = (
253253
f"SELECT c.column_name, d.domain_name AS data_type, "
254-
f"CASE WHEN d.domain_name IN ('DECIMAL', 'NUMERIC') THEN c.scale ELSE NULL END AS numeric_scale, "
255-
f"CASE WHEN d.domain_name IN ('DECIMAL', 'NUMERIC') THEN c.width ELSE NULL END AS numeric_precision, "
256254
f"CASE WHEN d.domain_name IN ('DATE', 'TIME', 'TIMESTAMP') THEN c.scale ELSE NULL END AS datetime_precision, "
255+
f"CASE WHEN t.name IN ('float') THEN 15 WHEN t.name IN ('real') THEN 7 ELSE c.prec END AS numeric_precision, "
256+
f"CASE WHEN t.name IN ('float', 'real') THEN NULL ELSE c.scale END AS numeric_scale, "
257257
f"NULL AS collation_name, c.width AS character_maximum_length "
258258
f"FROM {database}.SYS.SYSTABLE t "
259259
f"JOIN {database}.SYS.SYSCOLUMN c ON t.table_id = c.table_id "
@@ -266,8 +266,9 @@ def query_get_table_columns(
266266
elif self.sybase_driver_type.is_ase:
267267
query = (
268268
f"SELECT c.name AS column_name, t.name AS data_type, "
269-
f"c.prec AS numeric_precision, c.scale AS numeric_scale, "
270269
f"CASE WHEN c.type IN (61, 111) THEN c.prec ELSE NULL END AS datetime_precision, "
270+
f"CASE WHEN t.name IN ('float') THEN 15 WHEN t.name IN ('real') THEN 7 ELSE c.prec END AS numeric_precision, "
271+
f"CASE WHEN t.name IN ('float', 'real') THEN NULL ELSE c.scale END AS numeric_scale, "
271272
f"NULL AS collation_name, c.length AS character_maximum_length "
272273
f"FROM {database}..sysobjects o "
273274
f"JOIN {database}..syscolumns c ON o.id = c.id "
@@ -280,8 +281,9 @@ def query_get_table_columns(
280281
try:
281282
ase_query = (
282283
f"SELECT c.name AS column_name, t.name AS data_type, "
283-
f"c.prec AS numeric_precision, c.scale AS numeric_scale, "
284284
f"CASE WHEN c.type IN (61, 111) THEN c.prec ELSE NULL END AS datetime_precision, "
285+
f"CASE WHEN t.name IN ('float') THEN 15 WHEN t.name IN ('real') THEN 7 ELSE c.prec END AS numeric_precision, "
286+
f"CASE WHEN t.name IN ('float', 'real') THEN NULL ELSE c.scale END AS numeric_scale, "
285287
f"NULL AS collation_name, c.length AS character_maximum_length "
286288
f"FROM {database}..sysobjects o "
287289
f"JOIN {database}..syscolumns c ON o.id = c.id "
@@ -295,8 +297,9 @@ def query_get_table_columns(
295297
except Exception as _:
296298
iq_query = (
297299
f"SELECT c.name AS column_name, t.name AS data_type, "
298-
f"c.prec AS numeric_precision, c.scale AS numeric_scale, "
299300
f"CASE WHEN c.type IN (61, 111) THEN c.prec ELSE NULL END AS datetime_precision, "
301+
f"CASE WHEN t.name IN ('float') THEN 15 WHEN t.name IN ('real') THEN 7 ELSE c.prec END AS numeric_precision, "
302+
f"CASE WHEN t.name IN ('float', 'real') THEN NULL ELSE c.scale END AS numeric_scale, "
300303
f"NULL AS collation_name, c.length AS character_maximum_length "
301304
f"FROM {database}.dbo.sysobjects o "
302305
f"JOIN {database}.dbo.syscolumns c ON o.id = c.id "

0 commit comments

Comments
 (0)