Skip to content

Commit ebcb3e5

Browse files
committed
add sql server test
1 parent 7760b75 commit ebcb3e5

File tree

3 files changed

+243
-2
lines changed

3 files changed

+243
-2
lines changed

tests/integ/datasource/test_jdbc.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,26 @@
2929
MYSQL_SECRET,
3030
MYSQL_URL,
3131
mysql_expected_data,
32+
SQL_SERVER_SECRET,
33+
SQL_SERVER_URL,
34+
sql_sever_expected_data,
3235
)
3336
from tests.resources.test_data_source_dir.test_mysql_data import (
3437
MYSQL_TEST_EXTERNAL_ACCESS_INTEGRATION,
3538
)
3639
from tests.resources.test_data_source_dir.test_postgres_data import (
3740
POSTGRES_TEST_EXTERNAL_ACCESS_INTEGRATION,
3841
)
42+
from tests.resources.test_data_source_dir.test_sql_server_data import (
43+
SQL_SERVER_TEST_EXTERNAL_ACCESS_INTEGRATION,
44+
)
3945
from tests.utils import RUNNING_ON_JENKINS
4046

4147
SELECT_QUERY = "SELECT ID, NUMBER_COL, BINARY_FLOAT_COL, BINARY_DOUBLE_COL, VARCHAR2_COL, CHAR_COL, CLOB_COL, NCHAR_COL, NVARCHAR2_COL, NCLOB_COL, DATE_COL, TIMESTAMP_COL, TIMESTAMP_TZ_COL, TIMESTAMP_LTZ_COL, RAW_COL, GUID_COL FROM ALL_TYPE_TABLE_JDBC"
4248
EMPTY_QUERY = "SELECT * FROM ALL_TYPE_TABLE_JDBC WHERE 1=0"
4349
POSTGRES_SELECT_QUERY = "select BIGINT_COL, BIGSERIAL_COL, BIT_COL, BIT_VARYING_COL, BOOLEAN_COL, BOX_COL, BYTEA_COL, CHAR_COL, VARCHAR_COL, CIDR_COL, CIRCLE_COL, DATE_COL, DOUBLE_PRECISION_COL, INET_COL, INTEGER_COL, INTERVAL_COL, JSON_COL, JSONB_COL, LINE_COL, LSEG_COL, MACADDR_COL, MACADDR8_COL, NUMERIC_COL, PATH_COL, PG_LSN_COL, PG_SNAPSHOT_COL, POINT_COL, POLYGON_COL, REAL_COL, SMALLINT_COL, SMALLSERIAL_COL, SERIAL_COL, TEXT_COL, TIME_COL, TIMESTAMP_COL, TIMESTAMPTZ_COL, TSQUERY_COL, TSVECTOR_COL, TXID_SNAPSHOT_COL, UUID_COL, XML_COL from test_schema.ALL_TYPE_TABLE"
4450
MYSQL_SELECT_QUERY = "select * from ALL_TYPES_TABLE"
51+
SQL_SERVER_QUERY = "SELECT ID, BIGINT_COL, INT_COL, SMALLINT_COL, TINYINT_COL, BIT_COL, DECIMAL_COL, NUMERIC_COL, MONEY_COL, SMALLMONEY_COL, FLOAT_COL, REAL_COL, DATE_COL, TIME_COL, DATETIME_COL, DATETIME2_COL, SMALLDATETIME_COL, CHAR_COL, VARCHAR_COL, VARCHAR_MAX_COL, TEXT_COL, NCHAR_COL, NVARCHAR_COL, NVARCHAR_MAX_COL, NTEXT_COL, BINARY_COL, VARBINARY_COL, VARBINARY_MAX_COL, IMAGE_COL, UNIQUEIDENTIFIER_COL, TIMESTAMP_COL FROM test_db.dbo.ALL_TYPE_TABLE"
4552
TABLE_NAME = "ALL_TYPE_TABLE_JDBC"
4653

4754

@@ -75,6 +82,12 @@ def mysql_jar_path(session):
7582
return stage_name + "/mysql-connector-j-9.5.0.jar"
7683

7784

85+
@pytest.fixture(scope="module")
86+
def sql_server_jar_path(session):
87+
stage_name = session.get_session_stage()
88+
return stage_name + "/mssql-jdbc-13.2.1.jre11.jar"
89+
90+
7891
@pytest.fixture(scope="module")
7992
def postgres_udtf_configs(session, postgres_jar_path):
8093
return {
@@ -93,6 +106,18 @@ def mysql_udtf_configs(session, mysql_jar_path):
93106
}
94107

95108

109+
@pytest.fixture(scope="module")
110+
def sql_server_udtf_configs(session, sql_server_jar_path):
111+
return {
112+
"external_access_integration": SQL_SERVER_TEST_EXTERNAL_ACCESS_INTEGRATION[
113+
"external_access_integration"
114+
],
115+
"secret": SQL_SERVER_SECRET,
116+
"imports": [sql_server_jar_path],
117+
"java_version": 11,
118+
}
119+
120+
96121
@pytest.fixture(scope="module")
97122
def udtf_configs(session, jar_path):
98123
return {
@@ -114,6 +139,9 @@ def setup(session, resources_path):
114139
session.file.put(
115140
resources_path + "/test_data_source_dir/mysql-connector-j-9.5.0.jar", stage_name
116141
)
142+
session.file.put(
143+
resources_path + "/test_data_source_dir/mssql-jdbc-13.2.1.jre11.jar", stage_name
144+
)
117145
yield
118146

119147

@@ -376,8 +404,13 @@ def test_connect_mysql(session, mysql_udtf_configs):
376404
assert df.collect() == mysql_expected_data
377405

378406

379-
def test_sql_server(session):
380-
pass
407+
def test_connect_sql_server(session, sql_server_udtf_configs):
408+
df = session.read.jdbc(
409+
url=SQL_SERVER_URL,
410+
udtf_configs=sql_server_udtf_configs,
411+
query=SQL_SERVER_QUERY,
412+
).order_by("ID")
413+
assert df.collect() == sql_sever_expected_data
381414

382415

383416
def test_databricks(session):
Binary file not shown.

tests/resources/test_data_source_dir/test_jdbc_data.py

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
ORACLEDB_CONNECTION_PARAMETERS,
2020
POSTGRES_CONNECTION_PARAMETERS,
2121
MYSQL_CONNECTION_PARAMETERS,
22+
SQL_SERVER_CONNECTION_PARAMETERS,
2223
)
2324

2425
host = ORACLEDB_CONNECTION_PARAMETERS["host"]
@@ -37,6 +38,12 @@
3738
MYSQL_URL = f"jdbc:mysql://{mysql_host}:{mysql_port}/{mysql_dbname}"
3839
MYSQL_SECRET = "ADMIN.PUBLIC.SNOWPARK_DBAPI_MYSQL_TEST_CRED"
3940

41+
sql_server_host = SQL_SERVER_CONNECTION_PARAMETERS["SERVER"]
42+
SQL_SERVER_URL = (
43+
f"jdbc:sqlserver://{sql_server_host};encrypt=true;trustServerCertificate=true;"
44+
)
45+
SQL_SERVER_SECRET = "ADMIN.PUBLIC.SNOWPARK_DBAPI_SQL_SERVER_TEST_CRED"
46+
4047
URL = f"jdbc:oracle:thin:@//{host}:{port}/{service_name}"
4148
EXTERNAL_ACCESS_INTEGRATION = "SNOWPARK_DBAPI_ORACLEDB_TEST_INTEGRATION"
4249
SECRET = "ADMIN.PUBLIC.SNOWPARK_DBAPI_ORACLEDB_TEST_CRED"
@@ -882,3 +889,204 @@
882889
JSONCOL=None,
883890
),
884891
]
892+
893+
sql_sever_expected_data = [
894+
Row(
895+
ID=1,
896+
BIGINT_COL=9223372036854775807,
897+
INT_COL=2147483647,
898+
SMALLINT_COL=32767,
899+
TINYINT_COL=255,
900+
BIT_COL="1",
901+
DECIMAL_COL=Decimal("123456.7890"),
902+
NUMERIC_COL=Decimal("9999.99"),
903+
MONEY_COL=Decimal("922337203685477.5000"),
904+
SMALLMONEY_COL=Decimal("214748.3600"),
905+
FLOAT_COL=1.79e100,
906+
REAL_COL=3.4e20,
907+
DATE_COL=datetime.date(2023, 1, 15),
908+
TIME_COL=datetime.time(14, 30, 25),
909+
DATETIME_COL=datetime.datetime(2023, 1, 15, 14, 30, 25, 123000),
910+
DATETIME2_COL=datetime.datetime(2023, 1, 15, 14, 30, 25),
911+
SMALLDATETIME_COL=datetime.datetime(2023, 1, 15, 14, 30),
912+
CHAR_COL="Sample1 ",
913+
VARCHAR_COL="Sample VARCHAR 1",
914+
VARCHAR_MAX_COL="This is a long VARCHAR(MAX) sample text for row 1",
915+
TEXT_COL="Sample TEXT 1",
916+
NCHAR_COL="Unicode1 ",
917+
NVARCHAR_COL="Unicode VARCHAR 1",
918+
NVARCHAR_MAX_COL="This is a long NVARCHAR(MAX) unicode text for row 1",
919+
NTEXT_COL="Unicode TEXT 1",
920+
BINARY_COL="0123456789ABCDEF",
921+
VARBINARY_COL="0123456789ABCDEF",
922+
VARBINARY_MAX_COL="0123456789ABCDEF0123456789ABCDEF",
923+
IMAGE_COL="0123456789ABCDEF",
924+
UNIQUEIDENTIFIER_COL="3AE71804-5408-450E-B393-4EA521D7F425",
925+
TIMESTAMP_COL="000000000000086B",
926+
),
927+
Row(
928+
ID=2,
929+
BIGINT_COL=-9223372036854775808,
930+
INT_COL=-2147483648,
931+
SMALLINT_COL=-32768,
932+
TINYINT_COL=0,
933+
BIT_COL="0",
934+
DECIMAL_COL=Decimal("-123456.7890"),
935+
NUMERIC_COL=Decimal("-9999.99"),
936+
MONEY_COL=Decimal("-922337203685477.5000"),
937+
SMALLMONEY_COL=Decimal("-214748.3600"),
938+
FLOAT_COL=2.23e-100,
939+
REAL_COL=1.18e-20,
940+
DATE_COL=datetime.date(2023, 2, 20),
941+
TIME_COL=datetime.time(9, 15, 45),
942+
DATETIME_COL=datetime.datetime(2023, 2, 20, 9, 15, 45, 457000),
943+
DATETIME2_COL=datetime.datetime(2023, 2, 20, 9, 15, 45),
944+
SMALLDATETIME_COL=datetime.datetime(2023, 2, 20, 9, 16),
945+
CHAR_COL="Test2 ",
946+
VARCHAR_COL="Test VARCHAR 2",
947+
VARCHAR_MAX_COL="Another long VARCHAR(MAX) sample text for row 2",
948+
TEXT_COL="Test TEXT 2",
949+
NCHAR_COL="测试2 ",
950+
NVARCHAR_COL="测试 VARCHAR 2",
951+
NVARCHAR_MAX_COL="Another long NVARCHAR(MAX) unicode text for row 2 with Chinese characters",
952+
NTEXT_COL="测试 TEXT 2",
953+
BINARY_COL="FEDCBA9876543210",
954+
VARBINARY_COL="FEDCBA9876543210",
955+
VARBINARY_MAX_COL="FEDCBA9876543210FEDCBA9876543210",
956+
IMAGE_COL="FEDCBA9876543210",
957+
UNIQUEIDENTIFIER_COL="9043B413-B91E-4F24-A82E-58D10E1CB1EF",
958+
TIMESTAMP_COL="000000000000086F",
959+
),
960+
Row(
961+
ID=3,
962+
BIGINT_COL=1000000000000000,
963+
INT_COL=1000000,
964+
SMALLINT_COL=1000,
965+
TINYINT_COL=128,
966+
BIT_COL="1",
967+
DECIMAL_COL=Decimal("0.0001"),
968+
NUMERIC_COL=Decimal("0.01"),
969+
MONEY_COL=Decimal("100.5000"),
970+
SMALLMONEY_COL=Decimal("50.2500"),
971+
FLOAT_COL=3.14159265,
972+
REAL_COL=2.71828,
973+
DATE_COL=datetime.date(2023, 3, 10),
974+
TIME_COL=datetime.time(18, 45, 30),
975+
DATETIME_COL=datetime.datetime(2023, 3, 10, 18, 45, 30, 790000),
976+
DATETIME2_COL=datetime.datetime(2023, 3, 10, 18, 45, 30),
977+
SMALLDATETIME_COL=datetime.datetime(2023, 3, 10, 18, 45),
978+
CHAR_COL="Data3 ",
979+
VARCHAR_COL="Data VARCHAR 3",
980+
VARCHAR_MAX_COL="Third VARCHAR(MAX) sample with special chars: !@#$%^&*()",
981+
TEXT_COL="Data TEXT 3",
982+
NCHAR_COL="データ3 ",
983+
NVARCHAR_COL="データ VARCHAR 3",
984+
NVARCHAR_MAX_COL="Third NVARCHAR(MAX) with Japanese: こんにちは世界",
985+
NTEXT_COL="データ TEXT 3",
986+
BINARY_COL="1111111111111111",
987+
VARBINARY_COL="2222222222222222",
988+
VARBINARY_MAX_COL="33333333333333334444444444444444",
989+
IMAGE_COL="5555555555555555",
990+
UNIQUEIDENTIFIER_COL="C7F28568-6F34-41B1-97E4-3CF55C57D43C",
991+
TIMESTAMP_COL="0000000000000873",
992+
),
993+
Row(
994+
ID=4,
995+
BIGINT_COL=-500000000000000,
996+
INT_COL=-500000,
997+
SMALLINT_COL=-500,
998+
TINYINT_COL=64,
999+
BIT_COL="0",
1000+
DECIMAL_COL=Decimal("999.9999"),
1001+
NUMERIC_COL=Decimal("999.99"),
1002+
MONEY_COL=Decimal("1000000.0000"),
1003+
SMALLMONEY_COL=Decimal("10000.0000"),
1004+
FLOAT_COL=1.23e50,
1005+
REAL_COL=98700001000.0,
1006+
DATE_COL=datetime.date(2023, 4, 25),
1007+
TIME_COL=datetime.time(12, 0),
1008+
DATETIME_COL=datetime.datetime(2023, 4, 25, 12, 0),
1009+
DATETIME2_COL=datetime.datetime(2023, 4, 25, 12, 0),
1010+
SMALLDATETIME_COL=datetime.datetime(2023, 4, 25, 12, 0),
1011+
CHAR_COL="Record4 ",
1012+
VARCHAR_COL="Record VARCHAR 4",
1013+
VARCHAR_MAX_COL="Fourth record with emojis",
1014+
TEXT_COL="Record TEXT 4",
1015+
NCHAR_COL="Запись4 ",
1016+
NVARCHAR_COL="Запись VARCHAR 4",
1017+
NVARCHAR_MAX_COL="Fourth record with Cyrillic: Привет мир!",
1018+
NTEXT_COL="Запись TEXT 4",
1019+
BINARY_COL="AAAAAAAAAAAAAAAA",
1020+
VARBINARY_COL="BBBBBBBBBBBBBBBB",
1021+
VARBINARY_MAX_COL="CCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDD",
1022+
IMAGE_COL="EEEEEEEEEEEEEEEE",
1023+
UNIQUEIDENTIFIER_COL="32E648D8-BFBE-4419-A478-07C7AE897FC4",
1024+
TIMESTAMP_COL="0000000000000877",
1025+
),
1026+
Row(
1027+
ID=5,
1028+
BIGINT_COL=7777777777777777,
1029+
INT_COL=777777,
1030+
SMALLINT_COL=7777,
1031+
TINYINT_COL=200,
1032+
BIT_COL="1",
1033+
DECIMAL_COL=Decimal("0.0000"),
1034+
NUMERIC_COL=Decimal("0.00"),
1035+
MONEY_COL=Decimal("-50.7500"),
1036+
SMALLMONEY_COL=Decimal("-25.2500"),
1037+
FLOAT_COL=0.0,
1038+
REAL_COL=0.0,
1039+
DATE_COL=datetime.date(2023, 5, 30),
1040+
TIME_COL=datetime.time(23, 59, 59),
1041+
DATETIME_COL=datetime.datetime(2023, 5, 31, 0, 0),
1042+
DATETIME2_COL=datetime.datetime(2023, 5, 30, 23, 59, 59),
1043+
SMALLDATETIME_COL=datetime.datetime(2023, 5, 30, 23, 59),
1044+
CHAR_COL="Final5 ",
1045+
VARCHAR_COL="Final VARCHAR 5",
1046+
VARCHAR_MAX_COL="Last record with symbols",
1047+
TEXT_COL="Final TEXT 5",
1048+
NCHAR_COL="最終5 ",
1049+
NVARCHAR_COL="最終 VARCHAR 5",
1050+
NVARCHAR_MAX_COL="Last record with mixed scripts",
1051+
NTEXT_COL="最終 TEXT 5",
1052+
BINARY_COL="0000000000000000",
1053+
VARBINARY_COL="FFFFFFFFFFFFFFFF",
1054+
VARBINARY_MAX_COL="0F0F0F0F0F0F0F0F1E1E1E1E1E1E1E1E",
1055+
IMAGE_COL="9999999999999999",
1056+
UNIQUEIDENTIFIER_COL="384A86A8-5DF5-4AEC-8688-4C9BCBA26592",
1057+
TIMESTAMP_COL="000000000000087B",
1058+
),
1059+
Row(
1060+
ID=6,
1061+
BIGINT_COL=None,
1062+
INT_COL=None,
1063+
SMALLINT_COL=None,
1064+
TINYINT_COL=None,
1065+
BIT_COL=None,
1066+
DECIMAL_COL=None,
1067+
NUMERIC_COL=None,
1068+
MONEY_COL=None,
1069+
SMALLMONEY_COL=None,
1070+
FLOAT_COL=None,
1071+
REAL_COL=None,
1072+
DATE_COL=None,
1073+
TIME_COL=None,
1074+
DATETIME_COL=None,
1075+
DATETIME2_COL=None,
1076+
SMALLDATETIME_COL=None,
1077+
CHAR_COL=None,
1078+
VARCHAR_COL=None,
1079+
VARCHAR_MAX_COL=None,
1080+
TEXT_COL=None,
1081+
NCHAR_COL=None,
1082+
NVARCHAR_COL=None,
1083+
NVARCHAR_MAX_COL=None,
1084+
NTEXT_COL=None,
1085+
BINARY_COL=None,
1086+
VARBINARY_COL=None,
1087+
VARBINARY_MAX_COL=None,
1088+
IMAGE_COL=None,
1089+
UNIQUEIDENTIFIER_COL=None,
1090+
TIMESTAMP_COL="000000000000087F",
1091+
),
1092+
]

0 commit comments

Comments
 (0)