Skip to content

Commit 0aa26b5

Browse files
committed
Expand the scope and capability of column type conversion
Fixes Segfault-Incgh-133 Fixes Segfault-Incgh-149
1 parent 80ed212 commit 0aa26b5

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

python/multicorn/sqlalchemyfdw.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,10 @@
164164
from sqlalchemy import types as sqltypes
165165

166166
from sqlalchemy.schema import Table, Column, MetaData
167-
from sqlalchemy.dialects.oracle import base as oracle_dialect
168167
from sqlalchemy.dialects.mssql import base as mssql_dialect
168+
from sqlalchemy.dialects.oracle import base as oracle_dialect
169169
from sqlalchemy.dialects.postgresql.base import (
170-
ARRAY, ischema_names, PGDialect, NUMERIC, SMALLINT)
170+
ARRAY, ischema_names, PGDialect, NUMERIC, SMALLINT, VARCHAR, TIMESTAMP, BYTEA, BOOLEAN, TEXT)
171171
import re
172172
import operator
173173

@@ -217,9 +217,30 @@ def _parse_url_from_options(fdw_options):
217217
('<>', False): not_(sqlops.in_op)
218218
}
219219

220+
def basic_converter(new_type):
221+
def converter(c):
222+
old_args = c.type.__dict__
223+
c.type = new_type()
224+
c.type.__dict__.update(old_args)
225+
return converter
226+
227+
def length_stripper(new_type):
228+
first = basic_converter(new_type)
229+
def converter(c):
230+
first(c)
231+
c.type.__dict__['length'] = None
232+
return converter
233+
220234
CONVERSION_MAP = {
221-
oracle_dialect.NUMBER: NUMERIC,
222-
mssql_dialect.TINYINT: SMALLINT
235+
oracle_dialect.NUMBER: basic_converter(NUMERIC),
236+
237+
mssql_dialect.TINYINT: basic_converter(SMALLINT),
238+
mssql_dialect.NVARCHAR: basic_converter(VARCHAR),
239+
mssql_dialect.DATETIME: basic_converter(TIMESTAMP),
240+
mssql_dialect.VARBINARY: basic_converter(BYTEA),
241+
mssql_dialect.IMAGE: basic_converter(BYTEA),
242+
mssql_dialect.BIT: basic_converter(BOOLEAN),
243+
mssql_dialect.TEXT: length_stripper(TEXT)
223244
}
224245

225246
SORT_SUPPORT = {
@@ -490,10 +511,8 @@ def import_schema(self, schema, srv_options, options,
490511
# If the type is specialized, call the generic
491512
# superclass method
492513
if type(c.type) in CONVERSION_MAP:
493-
class_name = CONVERSION_MAP[type(c.type)]
494-
old_args = c.type.__dict__
495-
c.type = class_name()
496-
c.type.__dict__.update(old_args)
514+
converter = CONVERSION_MAP[type(c.type)]
515+
converter(c)
497516
if c.primary_key:
498517
ftable.options['primary_key'] = c.name
499518
ftable.columns.append(ColumnDefinition(

0 commit comments

Comments
 (0)