Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,203 changes: 1,196 additions & 7 deletions ibm_db.c

Large diffs are not rendered by default.

591 changes: 591 additions & 0 deletions ibm_db_tests/test_ArrayTypeAndSPCreation.py

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions ibm_db_tests/test_scalarsp_create.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from __future__ import print_function
import unittest
import ibm_db
import config
from datetime import date, time, datetime
from testfunctions import IbmDbTestFunctions

class IbmDbTestCase(unittest.TestCase):

def test_scalarsp_create(self):
obj = IbmDbTestFunctions()
obj.assert_expectf(self.run_test_scalarsp_create)

def run_test_scalarsp_create(self):
conn = ibm_db.connect(config.database, config.user, config.password)
if not conn:
print("no connection")
return
scalar_types = [
("int_scalar", "INTEGER"),
("sint_scalar", "SMALLINT"),
("bint_scalar", "BIGINT"),
("float_scalar", "FLOAT"),
("double_scalar", "DOUBLE"),
("real_scalar", "REAL"),
("decfloat16_scalar", "DECFLOAT(16)"),
("decfloat34_scalar", "DECFLOAT(34)"),
("decimal_scalar", "DECIMAL(10,2)"),
("date_scalar", "DATE"),
("time_scalar", "TIME"),
("ts_scalar", "TIMESTAMP"),
]
for proc_name, base_type in scalar_types:
try:
ibm_db.exec_immediate(conn, f"DROP PROCEDURE {proc_name}")
except:
pass
if base_type in ["INTEGER", "SMALLINT", "BIGINT"]:
operation = "SET var2 = var1 + 1;"
elif base_type in ["FLOAT", "DOUBLE", "REAL"]:
operation = "SET var2 = var1 + 1.0;"
elif base_type in ["DECFLOAT(16)", "DECFLOAT(34)", "DECIMAL(10,2)"]:
operation = "SET var2 = var1 + Decimal(1.25);"
elif base_type == "DATE":
operation = "SET var2 = var1 + 1 DAY;"
elif base_type == "TIME":
operation = "SET var2 = var1 + 1 MINUTE;"
elif base_type == "TIMESTAMP":
operation = "SET var2 = var1 + 1 SECOND;"
else:
operation = "SET var2 = var1;"
ibm_db.exec_immediate(conn, f"""
CREATE PROCEDURE {proc_name}(IN var1 {base_type}, OUT var2 {base_type})
LANGUAGE SQL
BEGIN
{operation}
END
""")
print("Preparation complete: scalar stored procedures with safe operations created.")

#__END__
#__LUW_EXPECTED__
#Preparation complete: scalar stored procedures with safe operations created.
#__ZOS_EXPECTED__
#... same as LUW ...
#__SYSTEMI_EXPECTED__
#... same as LUW ...
#__IDS_EXPECTED__
#... same as LUW ...

68 changes: 68 additions & 0 deletions ibm_db_tests/test_scalarsp_execute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from __future__ import print_function
import unittest
import ibm_db
import config
from datetime import date, time, datetime
from testfunctions import IbmDbTestFunctions

class IbmDbTestCase(unittest.TestCase):

def test_scalarsp_execute(self):
obj = IbmDbTestFunctions()
obj.assert_expectf(self.run_test_scalarsp_execute)

def run_test_scalarsp_execute(self):
conn = ibm_db.connect(config.database, config.user, config.password)
if not conn:
print("no connection")
return
scalar_procs = [
("INTEGER", "int_scalar", 42),
("SMALLINT", "sint_scalar", 7),
("BIGINT", "bint_scalar", 1234),
("FLOAT", "float_scalar", 3.14),
("DOUBLE", "double_scalar", 20.25),
("REAL", "real_scalar", 1.5),
("DECFLOAT(16)", "decfloat16_scalar", 4.56),
("DECFLOAT(34)", "decfloat34_scalar", 123456.1234),
("DECIMAL(10,2)", "decimal_scalar", 56.78),
("DATE", "date_scalar", date(2025, 1, 1)),
("TIME", "time_scalar", time(12, 20, 30)),
("TIMESTAMP", "ts_scalar", datetime(1989, 2, 12, 23, 55, 59)),
]

for base_type, proc_name, input_val in scalar_procs:
sql = f"CALL {proc_name}(?, ?)"
stmt = ibm_db.prepare(conn, sql)
output_val = input_val

ibm_db.bind_param(stmt, 1, input_val, ibm_db.SQL_PARAM_INPUT)
ibm_db.bind_param(stmt, 2, output_val, ibm_db.SQL_PARAM_OUTPUT)

ibm_db.execute(stmt)
result = ibm_db.fetch_callproc(stmt)
print(f"Procedure: {proc_name} {base_type} input: {result[1]} {base_type} output: {result[2]}")



#__END__
#__LUW_EXPECTED__
#Procedure: int_scalar INTEGER input: 42 INTEGER output: 43
#Procedure: sint_scalar SMALLINT input: 7 SMALLINT output: 8
#Procedure: bint_scalar BIGINT input: 1234 BIGINT output: 1235
#Procedure: float_scalar FLOAT input: 3.14 FLOAT output: 4.140000000000001
#Procedure: double_scalar DOUBLE input: 20.25 DOUBLE output: 21.25
#Procedure: real_scalar REAL input: 1.5 REAL output: 2.5
#Procedure: decfloat16_scalar DECFLOAT(16) input: 4.56 DECFLOAT(16) output: 5.56
#Procedure: decfloat34_scalar DECFLOAT(34) input: 123456.1234 DECFLOAT(34) output: 123457.1234
#Procedure: decimal_scalar DECIMAL(10,2) input: 56.78 DECIMAL(10,2) output: 57.78
#Procedure: date_scalar DATE input: 2025-01-01 DATE output: 2025-01-02
#Procedure: time_scalar TIME input: 12:20:30 TIME output: 12:21:30
#Procedure: ts_scalar TIMESTAMP input: 1989-02-12 23:55:59 TIMESTAMP output: 1989-02-12 23:56:00
#__ZOS_EXPECTED__
#... same as LUW ...
#__SYSTEMI_EXPECTED__
#... same as LUW ...
#__IDS_EXPECTED__
#... same as LUW ...

124 changes: 124 additions & 0 deletions ibm_db_tests/test_sparray_cardinalities.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
from __future__ import print_function
import unittest
import ibm_db
import config
from datetime import date, time, datetime
from testfunctions import IbmDbTestFunctions

class IbmDbTestCase(unittest.TestCase):

def test_sparray_cardinalities(self):
obj = IbmDbTestFunctions()
obj.assert_expectf(self.run_test_sparray_cardinalities)

def run_test_sparray_cardinalities(self):
conn = ibm_db.connect(config.database, config.user, config.password)
if not conn:
print("no connection")
return
array_procs = [
("int_array", "array_int12", [1, 2, 3, 4, 5, None]),
("sint_array", "array_sint12", [7, 512, -29000, 32000]),
("bint_array", "array_bint12", [1234567890123, None,-9876543210]),
("float_array", "array_float12", [1.1, 2.2, 3.3]),
("double_array", "array_double12", [10.5, 20.25, 30.75]),
("real_array", "array_real12", [0.5, 1.5, 2.5]),
("decfloat16_array", "array_decfloat1612", [1.23,None, 4.56, None]),
("decfloat34_array", "array_decfloat3412", [1234567890.1234, None]),
("decimal_array", "array_decimal12", [12.34, None, 56.78]),
("time_array", "array_time12", [time(12, 20, 30), time(13, 30, 45)]),
("date_array", "array_date12", [date(2025, 1, 1), date(2025, 12, 31)]),
("ts_array", "array_ts12", [b'1981-07-08 10:42:34.000010',None, b'1982-07-08 10:42:34.000010']),
("ts_array", "array_ts12", [ datetime(1989, 2, 12, 23, 55, 59, 342380), datetime(1990, 2, 12, 23, 55, 59, 342380)]),
("char_array", "array_char12", ["abc", "defg", "jkl"]),
("char_array", "array_char12", [b'abc', b'defg']),
("vc_array", "array_vc12", ["hello", "world"]),
("vc_array", "array_vc12", [b'hello', b'world']),
("vcfbd_array", "array_vcfbd12",[b'abc', b'dog', b'deadbeef', None, b'foobar']),
("clob_array", "array_clob12", [b'long text here', b'another clob']),
("blob_array", "array_blob12", [b"binarydata", b"morebytes", None, b'abc'])
]
for type_name, proc_name, input_array in array_procs:
sql = f"CALL {proc_name}(?,?)"
stmt = ibm_db.prepare(conn, sql)
output = 0

ibm_db.bind_param(stmt, 1, input_array, ibm_db.SQL_PARAM_INPUT)
ibm_db.bind_param(stmt, 2, output, ibm_db.SQL_PARAM_OUTPUT, ibm_db.SQL_INTEGER)

ibm_db.execute(stmt)
inout_value = ibm_db.fetch_callproc(stmt)

print(f"Procedure : {proc_name}")
print(f"{type_name} input:", inout_value[1])
print(f"{type_name} cardinality:", inout_value[2])

#__END__
#__LUW_EXPECTED__
#Procedure : array_int12
#int_array input: [1, 2, 3, 4, 5, None]
#int_array cardinality: 6
#Procedure : array_sint12
#sint_array input: [7, 512, -29000, 32000]
#sint_array cardinality: 4
#Procedure : array_bint12
#bint_array input: [1234567890123, None, -9876543210]
#bint_array cardinality: 3
#Procedure : array_float12
#float_array input: [1.1, 2.2, 3.3]
#float_array cardinality: 3
#Procedure : array_double12
#double_array input: [10.5, 20.25, 30.75]
#double_array cardinality: 3
#Procedure : array_real12
#real_array input: [0.5, 1.5, 2.5]
#real_array cardinality: 3
#Procedure : array_decfloat1612
#decfloat16_array input: [1.23, None, 4.56, None]
#decfloat16_array cardinality: 4
#Procedure : array_decfloat3412
#decfloat34_array input: [1234567890.1234, None]
#decfloat34_array cardinality: 2
#Procedure : array_decimal12
#decimal_array input: [12.34, None, 56.78]
#decimal_array cardinality: 3
#Procedure : array_time12
#time_array input: [datetime.time(12, 20, 30), datetime.time(13, 30, 45)]
#time_array cardinality: 2
#Procedure : array_date12
#date_array input: [datetime.date(2025, 1, 1), datetime.date(2025, 12, 31)]
#date_array cardinality: 2
#Procedure : array_ts12
#ts_array input: [b'1981-07-08 10:42:34.000010', None, b'1982-07-08 10:42:34.000010']
#ts_array cardinality: 3
#Procedure : array_ts12
#ts_array input: [datetime.datetime(1989, 2, 12, 23, 55, 59, 342380), datetime.datetime(1990, 2, 12, 23, 55, 59, 342380)]
#ts_array cardinality: 2
#Procedure : array_char12
#char_array input: ['abc', 'defg', 'jkl']
#char_array cardinality: 3
#Procedure : array_char12
#char_array input: [b'abc', b'defg']
#char_array cardinality: 2
#Procedure : array_vc12
#vc_array input: ['hello', 'world']
#vc_array cardinality: 2
#Procedure : array_vc12
#vc_array input: [b'hello', b'world']
#vc_array cardinality: 2
#Procedure : array_vcfbd12
#vcfbd_array input: [b'abc', b'dog', b'deadbeef', None, b'foobar']
#vcfbd_array cardinality: 5
#Procedure : array_clob12
#clob_array input: [b'long text here', b'another clob']
#clob_array cardinality: 2
#Procedure : array_blob12
#blob_array input: [b'binarydata', b'morebytes', None, b'abc']
#blob_array cardinality: 4
#__ZOS_EXPECTED__
#... same as LUW ...
#__SYSTEMI_EXPECTED__
#... same as LUW ...
#__IDS_EXPECTED__
#... same as LUW ...

105 changes: 105 additions & 0 deletions ibm_db_tests/test_sparray_computations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
from __future__ import print_function
import unittest
import ibm_db
import config
from datetime import date, time, datetime
from testfunctions import IbmDbTestFunctions

class IbmDbTestCase(unittest.TestCase):

def test_sparray_computations(self):
obj = IbmDbTestFunctions()
obj.assert_expectf(self.run_test_sparray_computations)

def run_test_sparray_computations(self):
conn = ibm_db.connect(config.database, config.user, config.password)
if not conn:
print("no connection")
return
scalar_procs = [
("int_array", "array_int22", 7),
("sint_array", "array_sint22", 10),
("bint_array", "array_bint22", 12345),
("float_array", "array_float22", 3.14),
("double_array", "array_double22", 20.25),
("real_array", "array_real22", 1.5),
("decfloat16_array", "array_decfloat1622", 4.56),
("decfloat34_array", "array_decfloat3422", 123456.1234),
("decimal_array", "array_decimal22", 56.78),
("time_array", "array_time22", time(12, 20, 30)),
("date_array", "array_date22", date(2025, 1, 1)),
("ts_array", "array_ts22", datetime(1989, 2, 12, 23, 55, 59, 342380)),
("char_array", "array_char22", b'HelloWorld'),
("vc_array", "array_vc22", b'basketball'),
("vcfbd_array", "array_vcfbd22", b'foobar'),
]
for type_name, proc_name, input_val in scalar_procs:
sql = f"CALL {proc_name}(?, ?)"
stmt = ibm_db.prepare(conn, sql)
output_array = [input_val]*4

ibm_db.bind_param(stmt, 1, input_val, ibm_db.SQL_PARAM_INPUT)
ibm_db.bind_param(stmt, 2, output_array, ibm_db.SQL_PARAM_OUTPUT)

ibm_db.execute(stmt)
result = ibm_db.fetch_callproc(stmt)
ibm_db.debug(False)

print(f"Procedure: {proc_name}")
print(f"{type_name} input:", input_val)
print(f"{type_name} output array:", result[2])

#__END__
#__LUW_EXPECTED__
#Procedure: array_int22
#int_array input: 7
#int_array output array: [49, 343, 28, 2]
#Procedure: array_sint22
#sint_array input: 10
#sint_array output array: [100, 1000, 40, 5]
#Procedure: array_bint22
#bint_array input: 12345
#bint_array output array: [152399025, 1881365963625, 49380, 12340]
#Procedure: array_float22
#float_array input: 3.14
#float_array output array: [9.8596, 30.959144000000002, 12.56, -1.8599999999999999]
#Procedure: array_double22
#double_array input: 20.25
#double_array output array: [410.0625, 8303.765625, 81.0, 15.25]
#Procedure: array_real22
#real_array input: 1.5
#real_array output array: [2.25, 3.375, 6.0, -3.5]
#Procedure: array_decfloat1622
#decfloat16_array input: 4.56
#decfloat16_array output array: [20.7936, 94.818816, 18.24, -0.44]
#Procedure: array_decfloat3422
#decfloat34_array input: 123456.1234
#decfloat34_array output array: [15241414404.956028, 1881645937568789.0, 493824.4936, 123451.1234]
#Procedure: array_decimal22
#decimal_array input: 56.78
#decimal_array output array: [3223.96, 183056.92, 227.12, 51.78]
#Procedure: array_time22
#time_array input: 12:20:30
#time_array output array: [datetime.time(13, 21, 31), datetime.time(11, 19, 29), datetime.time(12, 20, 31), datetime.time(12, 20, 29)]
#Procedure: array_date22
#date_array input: 2025-01-01
#date_array output array: [datetime.date(2026, 2, 2), datetime.date(2023, 11, 30), datetime.date(2025, 1, 2), datetime.date(2024, 12, 31)]
#Procedure: array_ts22
#ts_array input: 1989-02-12 23:55:59.342380
#ts_array output array: [datetime.datetime(1990, 3, 14, 0, 57, 0, 342380), datetime.datetime(1988, 1, 11, 22, 54, 58, 342380), datetime.datetime(1989, 2, 13, 23, 56, 0, 342380), datetime.datetime(1989, 2, 11, 23, 55, 58, 342380)]
#Procedure: array_char22
#char_array input: b'HelloWorld'
#char_array output array: [b'HelloWorld ', b'HelloWorld ', b'Hell ', b' ']
#Procedure: array_vc22
#vc_array input: b'basketball'
#vc_array output array: [b'basketballbasketbal', b'basketballbasketbal', b'bask', b'tball']
#Procedure: array_vcfbd22
#vcfbd_array input: b'foobar'
#vcfbd_array output array: [b'foobarfoobar', b'foobarfoobarfoobar', b'foobar', b'oobarr']
#__ZOS_EXPECTED__
#... same as LUW ...
#__SYSTEMI_EXPECTED__
#... same as LUW ...
#__IDS_EXPECTED__
#... same as LUW ...

Loading