Skip to content

Commit ae2e997

Browse files
author
Theekshna Kotian
committed
Merged PR 5244: Add tests for diff data types in DDBCSQLExecute API
Add tests for diff data types in DDBCSQLExecute API Related work items: #33298
1 parent 57e5e15 commit ae2e997

1 file changed

Lines changed: 123 additions & 8 deletions

File tree

mssql_python/testing_ddbc_bindings.py

Lines changed: 123 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ctypes
2+
import datetime
23
import ddbc_bindings
34
import os
45

@@ -68,6 +69,7 @@ def fetch_data_all(stmt_handle):
6869
def fetch_data(stmt_handle):
6970
rows = []
7071
column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle.value)
72+
print("Number of columns = " + str(column_count))
7173
while True:
7274
result = ddbc_bindings.DDBCSQLFetch(stmt_handle.value)
7375
if result == SQL_NO_DATA:
@@ -98,6 +100,97 @@ def connect_to_db(dbc_handle, connection_string):
98100
print("Error:", ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result))
99101
raise RuntimeError(f"SQLDriverConnect failed. Error code: {result}")
100102

103+
def add_string_param(params, paramInfos, data_string):
104+
params.append(data_string)
105+
paramInfo = ddbc_bindings.ParamInfo()
106+
paramInfo.paramCType = 1 # SQL_C_CHAR
107+
paramInfo.paramSQLType = 12 # SQL_VARCHAR
108+
paramInfo.columnSize = len(data_string)
109+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
110+
paramInfos.append(paramInfo)
111+
112+
def add_wstring_param(params, paramInfos, wide_string):
113+
params.append(wide_string)
114+
paramInfo = ddbc_bindings.ParamInfo()
115+
paramInfo.paramCType = -8 # SQL_C_WCHAR
116+
paramInfo.paramSQLType = -9 # SQL_WVARCHAR
117+
paramInfo.columnSize = len(wide_string)
118+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
119+
paramInfos.append(paramInfo)
120+
121+
def add_date_param(params, paramInfos):
122+
date_obj = datetime.date(2025, 1, 28) # 28th Jan 2025
123+
params.append(date_obj)
124+
paramInfo = ddbc_bindings.ParamInfo()
125+
paramInfo.paramCType = 91 # SQL_C_TYPE_DATE
126+
paramInfo.paramSQLType = 91 # SQL_TYPE_DATE
127+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
128+
paramInfos.append(paramInfo)
129+
130+
def add_time_param(params, paramInfos):
131+
time_obj = datetime.time(5, 15, 30) # 5:15 AM + 30 secs
132+
params.append(time_obj)
133+
paramInfo = ddbc_bindings.ParamInfo()
134+
paramInfo.paramCType = 92 # SQL_C_TYPE_TIME
135+
paramInfo.paramSQLType = 92 # SQL_TYPE_TIME
136+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
137+
paramInfos.append(paramInfo)
138+
139+
def add_datetime_param(params, paramInfos, addNone):
140+
paramInfo = ddbc_bindings.ParamInfo()
141+
if addNone:
142+
params.append(None)
143+
paramInfo.paramCType = 99 # SQL_C_DEFAULT
144+
else:
145+
datetime_obj = datetime.datetime(2025, 1, 28, 5, 15, 30)
146+
params.append(datetime_obj)
147+
paramInfo.paramCType = 93 # SQL_C_TYPE_TIMESTAMP
148+
paramInfo.paramSQLType = 93 # SQL_TYPE_TIMESTAMP
149+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
150+
paramInfos.append(paramInfo)
151+
152+
def add_bool_param(params, paramInfos, bool_val):
153+
params.append(bool_val)
154+
paramInfo = ddbc_bindings.ParamInfo()
155+
paramInfo.paramCType = -7 # SQL_C_BIT
156+
paramInfo.paramSQLType = -7 # SQL_BIT
157+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
158+
paramInfos.append(paramInfo)
159+
160+
def add_tinyint_param(params, paramInfos, val):
161+
params.append(val)
162+
paramInfo = ddbc_bindings.ParamInfo()
163+
paramInfo.paramCType = -6 # SQL_C_TINYINT
164+
paramInfo.paramSQLType = -6 # SQL_TINYINT
165+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
166+
paramInfos.append(paramInfo)
167+
168+
def add_bigint_param(params, paramInfos, val):
169+
params.append(val)
170+
paramInfo = ddbc_bindings.ParamInfo()
171+
paramInfo.paramCType = -25 # SQL_C_SBIGINT
172+
paramInfo.paramSQLType = -5 # SQL_BIGINT
173+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
174+
paramInfos.append(paramInfo)
175+
176+
def add_float_param(params, paramInfos, val):
177+
params.append(val)
178+
paramInfo = ddbc_bindings.ParamInfo()
179+
paramInfo.paramCType = 7 # SQL_C_FLOAT
180+
paramInfo.paramSQLType = 7 # SQL_REAL
181+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
182+
paramInfo.columnSize = 15 # Precision
183+
paramInfos.append(paramInfo)
184+
185+
def add_double_param(params, paramInfos, val):
186+
params.append(val)
187+
paramInfo = ddbc_bindings.ParamInfo()
188+
paramInfo.paramCType = 8 # SQL_C_DOUBLE
189+
paramInfo.paramSQLType = 8 # SQL_DOUBLE
190+
paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT
191+
paramInfo.columnSize = 15 # Precision
192+
paramInfos.append(paramInfo)
193+
101194
if __name__ == "__main__":
102195
# Allocate environment handle
103196
env_handle = alloc_handle(SQL_HANDLE_ENV, 0)
@@ -134,20 +227,42 @@ def connect_to_db(dbc_handle, connection_string):
134227
'''
135228
# Test DDBCSQLExecute for INSERT query
136229
print("Test DDBCSQLExecute insert")
137-
insert_sql_query = "INSERT INTO customers (name, email) VALUES (?, ?);"
138-
params = ['gaurav', 'gaurav@gaurav.com']
230+
'''
231+
insert_sql_query = """
232+
ALTER TABLE [Employees].[dbo].[EmployeeFullNames]
233+
ADD date_ DATE,
234+
time_ TIME,
235+
datetime_ TIMESTAMP,
236+
wchar_ NVARCHAR(10),
237+
bool_ BIT,
238+
tinyint_ TINYINT,
239+
bigint_ BIGINT,
240+
float_ FLOAT(10),
241+
double_ DOUBLE PRECISION;
242+
243+
"""
244+
'''
245+
insert_sql_query = "INSERT INTO [Employees].[dbo].[EmployeeFullNames] (FirstName, LastName, date_, time_, wchar_, bool_, tinyint_, bigint_, float_, double_) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
246+
params = []
139247
param_info_list = []
140-
for i in params:
141-
paraminfo = ParamInfo()
142-
paraminfo.paramCType = 1
143-
paraminfo.paramSQLType = 12
144-
param_info_list.append(paraminfo)
248+
add_string_param(params, param_info_list, 'Harry')
249+
add_string_param(params, param_info_list, 'Potter2')
250+
add_date_param(params, param_info_list)
251+
add_time_param(params, param_info_list)
252+
# add_datetime_param(params, param_info_list, addNone=True) - Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column. Traceback (most recent call last):
253+
add_wstring_param(params, param_info_list, u"Wide str3")
254+
add_bool_param(params, param_info_list, True)
255+
add_tinyint_param(params, param_info_list, 127)
256+
add_bigint_param(params, param_info_list, 123456789)
257+
add_float_param(params, param_info_list, 12.34)
258+
add_double_param(params, param_info_list, 12.34)
145259
result = ddbc_sql_execute(stmt_handle, insert_sql_query, params, param_info_list, True)
146260
print("DDBCSQLExecute result:", result)
147261

148262
# Test DDBCSQLExecute for SELECT query
149263
print("Test DDBCSQLExecute select")
150-
select_sql_query = "SELECT * FROM customers;"
264+
# select_sql_query = "SELECT * FROM customers;"
265+
select_sql_query = "SELECT bool_, float_, wchar_, date_, time_, datetime_, wchar_, FirstName, LastName FROM [Employees].[dbo].[EmployeeFullNames];"
151266
params = []
152267
param_info_list = []
153268
result = ddbc_sql_execute(stmt_handle, select_sql_query, params, param_info_list, False)

0 commit comments

Comments
 (0)