Skip to content

Commit 50a8b4e

Browse files
authored
SNOW-638840: Version 1.4.0 breaks SnowflakeDialect._get_schema_columns function when column of type DATE exists in schema (#334)
1 parent ca9ed7f commit 50a8b4e

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

DESCRIPTION.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Source code is also available at:
1111

1212
- v1.4.1(Unreleased)
1313
- snowflake-sqlalchemy is now SQLAlchemy 2.0 compatible.
14+
- Fixed a bug that `DATE` should not be removed from `SnowflakeDialect.ischema_names`.
1415

1516
- v1.4.0(July 20, 2022)
1617

src/snowflake/sqlalchemy/snowdialect.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
BINARY,
2222
BOOLEAN,
2323
CHAR,
24+
DATE,
2425
DATETIME,
2526
DECIMAL,
2627
FLOAT,
@@ -79,6 +80,7 @@
7980
"BOOLEAN": BOOLEAN,
8081
"CHAR": CHAR,
8182
"CHARACTER": CHAR,
83+
"DATE": DATE,
8284
"DATETIME": DATETIME,
8385
"DEC": DECIMAL,
8486
"DECIMAL": DECIMAL,

tests/test_core.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from .conftest import create_engine_with_future_flag as create_engine
4141
from .conftest import get_engine
4242
from .parameters import CONNECTION_PARAMETERS
43-
from .util import random_string
43+
from .util import ischema_names_baseline, random_string
4444

4545
THIS_DIR = os.path.dirname(os.path.realpath(__file__))
4646

@@ -1604,3 +1604,29 @@ def test_empty_comments(engine_testaccount):
16041604
assert all([c["comment"] is None for c in columns])
16051605
finally:
16061606
conn.execute(text(f"drop table public.{table_name}"))
1607+
1608+
1609+
def test_column_type_schema(engine_testaccount):
1610+
with engine_testaccount.connect() as conn:
1611+
table_name = random_string(5)
1612+
conn.exec_driver_sql(
1613+
f"""\
1614+
CREATE TEMP TABLE {table_name} (
1615+
C1 BIGINT, C2 BINARY, C3 BOOLEAN, C4 CHAR, C5 CHARACTER, C6 DATE, C7 DATETIME, C8 DEC,
1616+
C9 DECIMAL, C10 DOUBLE,
1617+
-- C11 FIXED, # SQL compilation error: Unsupported data type 'FIXED'.
1618+
C12 FLOAT, C13 INT, C14 INTEGER, C15 NUMBER, C16 REAL, C17 BYTEINT, C18 SMALLINT,
1619+
C19 STRING, C20 TEXT, C21 TIME, C22 TIMESTAMP, C23 TIMESTAMP_TZ, C24 TIMESTAMP_LTZ,
1620+
C25 TIMESTAMP_NTZ, C26 TINYINT, C27 VARBINARY, C28 VARCHAR, C29 VARIANT,
1621+
C30 OBJECT, C31 ARRAY, C32 GEOGRAPHY
1622+
)
1623+
"""
1624+
)
1625+
1626+
table_reflected = Table(
1627+
table_name, MetaData(), autoload=True, autoload_with=conn
1628+
)
1629+
columns = table_reflected.columns
1630+
assert (
1631+
len(columns) == len(ischema_names_baseline) - 1
1632+
) # -1 because FIXED is not supported

tests/test_unit_types.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,21 @@
33
#
44

55
import snowflake.sqlalchemy
6+
from snowflake.sqlalchemy.snowdialect import SnowflakeDialect
7+
8+
from .util import ischema_names_baseline
69

710

811
def test_type_synonyms():
912
from snowflake.sqlalchemy.snowdialect import ischema_names
1013

1114
for k, _ in ischema_names.items():
1215
assert getattr(snowflake.sqlalchemy, k) is not None
16+
17+
18+
def test_type_baseline():
19+
assert set(SnowflakeDialect.ischema_names.keys()) == set(
20+
ischema_names_baseline.keys()
21+
)
22+
for k, v in SnowflakeDialect.ischema_names.items():
23+
assert issubclass(v, ischema_names_baseline[k])

tests/util.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,70 @@
88
import string
99
from typing import Sequence
1010

11+
from sqlalchemy.types import (
12+
BIGINT,
13+
BINARY,
14+
BOOLEAN,
15+
CHAR,
16+
DATE,
17+
DATETIME,
18+
DECIMAL,
19+
FLOAT,
20+
INTEGER,
21+
REAL,
22+
SMALLINT,
23+
TIME,
24+
TIMESTAMP,
25+
VARCHAR,
26+
)
27+
28+
from snowflake.sqlalchemy.custom_types import (
29+
ARRAY,
30+
GEOGRAPHY,
31+
OBJECT,
32+
TIMESTAMP_LTZ,
33+
TIMESTAMP_NTZ,
34+
TIMESTAMP_TZ,
35+
VARIANT,
36+
)
37+
38+
ischema_names_baseline = {
39+
"BIGINT": BIGINT,
40+
"BINARY": BINARY,
41+
# 'BIT': BIT,
42+
"BOOLEAN": BOOLEAN,
43+
"CHAR": CHAR,
44+
"CHARACTER": CHAR,
45+
"DATE": DATE,
46+
"DATETIME": DATETIME,
47+
"DEC": DECIMAL,
48+
"DECIMAL": DECIMAL,
49+
"DOUBLE": FLOAT,
50+
"FIXED": DECIMAL,
51+
"FLOAT": FLOAT,
52+
"INT": INTEGER,
53+
"INTEGER": INTEGER,
54+
"NUMBER": DECIMAL,
55+
# 'OBJECT': ?
56+
"REAL": REAL,
57+
"BYTEINT": SMALLINT,
58+
"SMALLINT": SMALLINT,
59+
"STRING": VARCHAR,
60+
"TEXT": VARCHAR,
61+
"TIME": TIME,
62+
"TIMESTAMP": TIMESTAMP,
63+
"TIMESTAMP_TZ": TIMESTAMP_TZ,
64+
"TIMESTAMP_LTZ": TIMESTAMP_LTZ,
65+
"TIMESTAMP_NTZ": TIMESTAMP_NTZ,
66+
"TINYINT": SMALLINT,
67+
"VARBINARY": BINARY,
68+
"VARCHAR": VARCHAR,
69+
"VARIANT": VARIANT,
70+
"OBJECT": OBJECT,
71+
"ARRAY": ARRAY,
72+
"GEOGRAPHY": GEOGRAPHY,
73+
}
74+
1175

1276
def random_string(
1377
length: int,

0 commit comments

Comments
 (0)