blob: e7d0792336f081d0610ed402b489d06cd1b7ae8b [file]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import decimal
import pyignite_dbapi
import pytest
test_data = [
0,
1,
-1,
2,
43,
-543656,
423538409739,
0.0,
123.456,
-76.4,
4235384097394235384097394235384097394235.38409739423538409739423538409739423538409739,
1.0E-40,
1.0E40,
'test',
'TEST',
'Lorem Ipsum',
'你好',
'Мир!',
'',
True,
False,
None,
b'',
b'0',
b'123456789',
b'h9832y9r8wf08hw85h0h2508h0858',
b'\x45\xf0\xab',
pyignite_dbapi.Binary('Lorem Ipsum'),
pyignite_dbapi.Binary('x' * 1234),
pyignite_dbapi.UUID('c4a0327c-44be-416d-ae90-75c05079789f'),
pyignite_dbapi.UUID('00000000-0000-0000-0000-000000000001'),
pyignite_dbapi.UUID('10101010-1010-1010-1010-101010101010'),
pyignite_dbapi.UUID(int=0),
pyignite_dbapi.Time(23, 59, 59),
pyignite_dbapi.Time(20, 17, 40),
pyignite_dbapi.Time(7, 59, 13),
pyignite_dbapi.TIME(1, 2, 3),
pyignite_dbapi.TIME(0, 0, 0),
pyignite_dbapi.TimeFromTicks(0),
pyignite_dbapi.TimeFromTicks(89565),
pyignite_dbapi.Date(1969, 7, 20),
pyignite_dbapi.Date(1525, 1, 1),
pyignite_dbapi.DATE(2024, 9, 12),
pyignite_dbapi.DateFromTicks(0),
pyignite_dbapi.DateFromTicks(8956872365),
pyignite_dbapi.DATETIME(1969, 7, 20, 20, 17, 40),
pyignite_dbapi.DATETIME(2024, 9, 12, 7, 59, 13),
pyignite_dbapi.DATETIME(1000, 1, 1, 0, 0, 0),
pyignite_dbapi.DATETIME(1000, 1, 1, 0, 0, 0),
pyignite_dbapi.Timestamp(1979, 7, 20, 20, 17, 40),
pyignite_dbapi.Timestamp(2024, 9, 12, 7, 59, 13),
pyignite_dbapi.Timestamp(3000, 1, 1, 0, 0, 0),
pyignite_dbapi.Timestamp(2007, 1, 1, 0, 0, 0),
pyignite_dbapi.TimestampFromTicks(4239085792.333),
# TODO: IGNITE-17373 Fix DURATION type parameters in select statements
# pyignite_dbapi.DURATION(days=0),
# pyignite_dbapi.DURATION(days=1),
# pyignite_dbapi.DURATION(days=145),
# pyignite_dbapi.DURATION(seconds=123456789),
# pyignite_dbapi.DURATION(seconds=987654321, milliseconds=123),
# pyignite_dbapi.DURATION(days=145, seconds=987654321, milliseconds=123),
]
def check_fetch_parameters(cursor, param, use_tuple: bool):
cursor.execute("select ?", (param,) if use_tuple else [param])
data = cursor.fetchone()
assert len(data) == 1
if isinstance(param, float):
assert data[0] == pytest.approx(param)
else:
assert data[0] == param
@pytest.mark.parametrize("param", test_data)
def test_fetch_parameter_list(cursor, param):
check_fetch_parameters(cursor, param, False)
@pytest.mark.parametrize("param", test_data)
def test_fetch_parameter_tuple(cursor, param):
check_fetch_parameters(cursor, param, True)
test_decs = [
pyignite_dbapi.NUMBER('1111111111111111111111111111111'),
pyignite_dbapi.NUMBER('11111111111111.11111111111111111'),
pyignite_dbapi.NUMBER('0.000000000000000000000000000001'),
pyignite_dbapi.NUMBER('123.456789'),
pyignite_dbapi.NUMBER('-123.456789'),
pyignite_dbapi.NUMBER('2980949468541866002980035546865281241479836693504'),
pyignite_dbapi.NUMBER('2980949468541866002980035546865281241479836693504.943353696379651248255943353696379651248255'),
pyignite_dbapi.NUMBER('298094946854186600298003554686528124147.9836693504943353696379651248255'),
pyignite_dbapi.NUMBER('298094946854186600298003554686528.1241479836693504943353696379651248255'),
pyignite_dbapi.NUMBER('29809494685418660029800.35546865281241479836693504943353696379651248255'),
]
def check_fetch_decimals(cursor, param: decimal.Decimal, use_tuple: bool):
cursor.execute(f"select ?::DECIMAL(100,50)", (param,) if use_tuple else [param])
data = cursor.fetchone()
assert len(data) == 1
if isinstance(param, float):
assert data[0] == pytest.approx(param)
else:
assert data[0] == param
@pytest.mark.parametrize("param", test_decs)
def test_fetch_decimals_list(cursor, param):
check_fetch_decimals(cursor, param, False)
@pytest.mark.parametrize("param", test_decs)
def test_fetch_decimals_tuple(cursor, param):
check_fetch_decimals(cursor, param, True)