blob: 271c8a62600aa7de2b2b99ce8788f3ee88fd9d6a [file] [log] [blame]
# 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 math
import uuid
import datetime
import pytest
test_data = [
("select 'Lorem ipsum'", 'Lorem ipsum'),
("select ''", ''),
("select 42::TINYINT", 42),
("select -18::TINYINT", -18),
("select 4242::SMALLINT", 4242),
("select 987654321", 987654321),
("select 1234567890987654321::BIGINT", 1234567890987654321),
("select 123.456::REAL", 123.456),
("select -123456789.987654321::DOUBLE", -123456789.987654321),
("select TRUE", True),
("select FALSE", False),
("select x'45F0AB'", b'\x45\xf0\xab'),
("select x''", b''),
("select NULL", None),
("SELECT 'c4a0327c-44be-416d-ae90-75c05079789f'::UUID", uuid.UUID('c4a0327c-44be-416d-ae90-75c05079789f')),
("SELECT '00000000-0000-0000-0000-000000000001'::UUID", uuid.UUID('00000000-0000-0000-0000-000000000001')),
("SELECT '10101010-1010-1010-1010-101010101010'::UUID", uuid.UUID('10101010-1010-1010-1010-101010101010')),
("SELECT DATE'1969-07-20'", datetime.date(1969, 7, 20)),
("SELECT DATE'1525-01-01'", datetime.date(1525, 1, 1)),
("SELECT DATE'2024-09-12'", datetime.date(2024, 9, 12)),
("SELECT TIME'20:17:40'", datetime.time(20, 17, 40)),
("SELECT TIME'07:59:13'", datetime.time(7, 59, 13)),
("SELECT TIME'00:00:00'", datetime.time(0, 0, 0)),
("SELECT TIMESTAMP'1969-07-20 20:17:40'", datetime.datetime(1969, 7, 20, 20, 17, 40)),
("SELECT TIMESTAMP'2024-09-12 07:59:13'", datetime.datetime(2024, 9, 12, 7, 59, 13)),
("SELECT TIMESTAMP'1000-01-01 00:00:00'", datetime.datetime(1000, 1, 1, 0, 0, 0)),
("SELECT TIMESTAMP'1000-01-01 00:00:00'", datetime.datetime(1000, 1, 1, 0, 0, 0)),
("SELECT '1111111111111111111111111111111'::DECIMAL", decimal.Decimal('1111111111111111111111111111111')),
("SELECT '11111111111111.11111111111111111'::DECIMAL(31,17)", decimal.Decimal('11111111111111.11111111111111111')),
("SELECT '0.000000000000000000000000000001'::DECIMAL(31,30)", decimal.Decimal('0.000000000000000000000000000001')),
("SELECT '123.456789'::DECIMAL(9,6)", decimal.Decimal('123.456789')),
("SELECT '-123.456789'::DECIMAL(9,6)", decimal.Decimal('-123.456789')),
("SELECT '1'::DECIMAL(20,10)", decimal.Decimal(1)),
("SELECT '0'::DECIMAL(20,10)", decimal.Decimal(0)),
("SELECT INTERVAL '0' DAY", datetime.timedelta(days=0)),
("SELECT INTERVAL '1' DAY", datetime.timedelta(days=1)),
("SELECT INTERVAL '145' DAY", datetime.timedelta(days=145)),
("SELECT INTERVAL '123456789' SECOND", datetime.timedelta(seconds=123456789)),
("SELECT INTERVAL '987654321.123' SECOND", datetime.timedelta(seconds=987654321, milliseconds=123)),
]
@pytest.mark.parametrize("query,value", test_data)
def test_fetch_constant(query, value, cursor):
cursor.execute(query)
data = cursor.fetchone()
assert len(data) == 1
if isinstance(value, float):
assert data[0] == pytest.approx(value)
else:
assert data[0] == value
def test_fetch_constant_double_nan(cursor):
cursor.execute("select CAST('NaN' AS DOUBLE)")
data = cursor.fetchone()
assert len(data) == 1
assert math.isnan(data[0])
def test_fetch_constant_several_ints(cursor):
cursor.execute("select 1,2,3")
data = cursor.fetchone()
assert len(data) == 3
assert data[0] == 1
assert data[1] == 2
assert data[2] == 3
def test_fetch_constant_int_bool_string(cursor):
cursor.execute("select 42, TRUE, 'Test string'")
data = cursor.fetchone()
assert len(data) == 3
assert data[0] == 42
assert data[1] is True
assert data[2] == 'Test string'
nothing = cursor.fetchone()
assert nothing is None