blob: 2cef0f27d844027a23a63430a3d1ff9ebb278af6 [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 sys
import unittest
import datetime
import phoenixdb
from decimal import Decimal
from phoenixdb.tests import DatabaseTestCase
class TypesTest(DatabaseTestCase):
def checkIntType(self, type_name, min_value, max_value):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val {}".format(type_name))
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 1)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [1])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [None])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [min_value])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [max_value])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.description[1].type_code, phoenixdb.NUMBER)
self.assertEqual(cursor.fetchall(), [[1, 1], [2, None], [3, 1], [4, None], [5, min_value], [6, max_value]])
self.assertRaises(
self.conn.DatabaseError, cursor.execute,
"UPSERT INTO phoenixdb_test_tbl1 VALUES (100, {})".format(min_value - 1))
self.assertRaises(
self.conn.DatabaseError, cursor.execute,
"UPSERT INTO phoenixdb_test_tbl1 VALUES (100, {})".format(max_value + 1))
# XXX The server silently truncates the values
# self.assertRaises(self.conn.DatabaseError, cursor.execute, "UPSERT INTO phoenixdb_test_tbl1 VALUES (100, ?)", [min_value - 1])
# self.assertRaises(self.conn.DatabaseError, cursor.execute, "UPSERT INTO phoenixdb_test_tbl1 VALUES (100, ?)", [max_value + 1])
def test_integer(self):
self.checkIntType("integer", -2147483648, 2147483647)
def test_unsigned_int(self):
self.checkIntType("unsigned_int", 0, 2147483647)
def test_bigint(self):
self.checkIntType("bigint", -9223372036854775808, 9223372036854775807)
def test_unsigned_long(self):
self.checkIntType("unsigned_long", 0, 9223372036854775807)
def test_tinyint(self):
self.checkIntType("tinyint", -128, 127)
def test_unsigned_tinyint(self):
self.checkIntType("unsigned_tinyint", 0, 127)
def test_smallint(self):
self.checkIntType("smallint", -32768, 32767)
def test_unsigned_smallint(self):
self.checkIntType("unsigned_smallint", 0, 32767)
def checkFloatType(self, type_name, min_value, max_value):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val {}".format(type_name))
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 1)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [1])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [None])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [min_value])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [max_value])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.description[1].type_code, phoenixdb.NUMBER)
rows = cursor.fetchall()
self.assertEqual([r[0] for r in rows], [1, 2, 3, 4, 5, 6])
self.assertEqual(rows[0][1], 1.0)
self.assertEqual(rows[1][1], None)
self.assertEqual(rows[2][1], 1.0)
self.assertEqual(rows[3][1], None)
self.assertAlmostEqual(rows[4][1], min_value)
self.assertAlmostEqual(rows[5][1], max_value)
def test_float(self):
self.checkFloatType("float", -3.4028234663852886e+38, 3.4028234663852886e+38)
def test_unsigned_float(self):
self.checkFloatType("unsigned_float", 0, 3.4028234663852886e+38)
def test_double(self):
self.checkFloatType("double", -1.7976931348623158E+308, 1.7976931348623158E+308)
def test_unsigned_double(self):
self.checkFloatType("unsigned_double", 0, 1.7976931348623158E+308)
def test_decimal(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val decimal(8,3)")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 33333.333)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [33333.333])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [Decimal('33333.333')])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [None])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.description[1].type_code, phoenixdb.NUMBER)
rows = cursor.fetchall()
self.assertEqual([r[0] for r in rows], [1, 2, 3, 4, 5])
self.assertEqual(rows[0][1], Decimal('33333.333'))
self.assertEqual(rows[1][1], None)
self.assertEqual(rows[2][1], Decimal('33333.333'))
self.assertEqual(rows[3][1], Decimal('33333.333'))
self.assertEqual(rows[4][1], None)
self.assertRaises(
self.conn.DatabaseError, cursor.execute,
"UPSERT INTO phoenixdb_test_tbl1 VALUES (100, ?)", [Decimal('1234567890')])
self.assertRaises(
self.conn.DatabaseError, cursor.execute,
"UPSERT INTO phoenixdb_test_tbl1 VALUES (101, ?)", [Decimal('123456.789')])
def test_boolean(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val boolean")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, TRUE)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, FALSE)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [True])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [False])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [None])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.description[1].type_code, phoenixdb.BOOLEAN)
self.assertEqual(cursor.fetchall(), [[1, True], [2, False], [3, None], [4, True], [5, False], [6, None]])
def test_time(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val time")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '1970-01-01 12:01:02')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [phoenixdb.Time(12, 1, 2)])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [datetime.time(12, 1, 2)])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [None])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.time(12, 1, 2)],
[2, None],
[3, datetime.time(12, 1, 2)],
[4, datetime.time(12, 1, 2)],
[5, None],
])
@unittest.skip("https://issues.apache.org/jira/browse/CALCITE-797")
def test_time_full(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val time")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '2015-07-12 13:01:02.123')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", [datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
[2, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
])
def test_date(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val date")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '2015-07-12 00:00:00')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [phoenixdb.Date(2015, 7, 12)])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [datetime.date(2015, 7, 12)])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.date(2015, 7, 12)],
[3, datetime.date(2015, 7, 12)],
[4, datetime.date(2015, 7, 12)],
])
@unittest.skip("https://issues.apache.org/jira/browse/CALCITE-798")
def test_date_full(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val date")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '2015-07-12 13:01:02.123')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", [datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
[2, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
])
def test_date_null(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val date")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", [None])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id") # raises NullPointerException on the server
self.assertEqual(cursor.fetchall(), [
[1, None],
[2, None],
])
def test_timestamp(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val timestamp")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '2015-07-12 13:01:02.123')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", [phoenixdb.Timestamp(2015, 7, 12, 13, 1, 2)])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, ?)", [None])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
[2, None],
[3, datetime.datetime(2015, 7, 12, 13, 1, 2)],
[4, datetime.datetime(2015, 7, 12, 13, 1, 2, 123000)],
[5, None],
])
@unittest.skip("https://issues.apache.org/jira/browse/CALCITE-796")
def test_timestamp_full(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val timestamp")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, '2015-07-12 13:01:02.123456789')")
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, datetime.datetime(2015, 7, 12, 13, 1, 2, 123456789)],
])
def test_varchar(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val varchar")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 'abc')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", ['abc'])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [None])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, '')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [''])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[1, 'abc'], [2, None], [3, 'abc'], [4, None], [5, None], [6, None]])
def test_varchar_very_long(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val varchar")
with self.conn.cursor() as cursor:
value = '1234567890' * 1000
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, ?)", [value])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[1, value]])
def test_varchar_limited(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val varchar(2)")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 'ab')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, ?)", ['ab'])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [None])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, '')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [''])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[1, 'ab'], [2, None], [3, 'ab'], [4, None], [5, None], [6, None]])
self.assertRaises(self.conn.DataError, cursor.execute, "UPSERT INTO phoenixdb_test_tbl1 VALUES (100, 'abc')")
def test_char_null(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val char(2)")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, NULL)")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [None])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (5, '')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (6, ?)", [''])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[2, None], [4, None], [5, None], [6, None]])
self.assertRaises(self.conn.DataError, cursor.execute, "UPSERT INTO phoenixdb_test_tbl1 VALUES (100, 'abc')")
def test_char(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val char(2)")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 'ab')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", ['ab'])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, 'a')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", ['b'])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[1, 'ab'], [2, 'ab'], [3, 'a'], [4, 'b']])
self.assertRaises(self.conn.DataError, cursor.execute, "UPSERT INTO phoenixdb_test_tbl1 VALUES (100, 'abc')")
def test_binary(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val binary(2)")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, 'ab')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", [phoenixdb.Binary(b'ab')])
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (3, '\x01\x00')")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (4, ?)", [phoenixdb.Binary(b'\x01\x00')])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, b'ab'],
[2, b'ab'],
[3, b'\x01\x00'],
[4, b'\x01\x00'],
])
def test_binary_all_bytes(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val binary(256)")
with self.conn.cursor() as cursor:
if sys.version_info[0] < 3:
value = ''.join(map(chr, range(256)))
else:
value = bytes(range(256))
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, ?)", [phoenixdb.Binary(value)])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [[1, value]])
@unittest.skip("https://issues.apache.org/jira/browse/CALCITE-1050 https://issues.apache.org/jira/browse/PHOENIX-2585")
def test_array(self):
self.createTable("phoenixdb_test_tbl1", "id integer primary key, val integer[]")
with self.conn.cursor() as cursor:
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (1, ARRAY[1, 2])")
cursor.execute("UPSERT INTO phoenixdb_test_tbl1 VALUES (2, ?)", [[2, 3]])
cursor.execute("SELECT id, val FROM phoenixdb_test_tbl1 ORDER BY id")
self.assertEqual(cursor.fetchall(), [
[1, [1, 2]],
[2, [2, 3]],
])