Path: blob/main/singlestoredb/tests/test_connection.py
469 views
#!/usr/bin/env python1# type: ignore2"""Basic SingleStoreDB connection testing."""3import datetime4import decimal5import os6import unittest7import uuid89import singlestoredb as s210from singlestoredb import connection as sc11from singlestoredb.tests import utils12# import pandas as pd13# import traceback1415try:16import numpy as np17has_numpy = True18except ImportError:19has_numpy = False2021try:22import pandas as pd23has_pandas = True24except ImportError:25has_pandas = False262728class TestConnection(unittest.TestCase):2930dbname: str = ''31dbexisted: bool = False3233@classmethod34def setUpClass(cls):35sql_file = os.path.join(os.path.dirname(__file__), 'test.sql')36cls.dbname, cls.dbexisted = utils.load_sql(sql_file)3738@classmethod39def tearDownClass(cls):40if not cls.dbexisted:41utils.drop_database(cls.dbname)4243def setUp(self):44self.conn = s2.connect(database=type(self).dbname, local_infile=True)45self.cur = self.conn.cursor()4647def tearDown(self):48try:49if self.cur is not None:50self.cur.close()51except Exception:52# traceback.print_exc()53pass5455try:56if self.conn is not None:57self.conn.close()58except Exception:59# traceback.print_exc()60pass6162def test_connection(self):63self.cur.execute('show databases')64dbs = set([x[0] for x in self.cur.fetchall()])65assert type(self).dbname in dbs, dbs6667def test_cast_bool_param(self):68cbp = sc.cast_bool_param6970assert cbp(0) is False, cbp(0)71assert cbp(1) is True, cbp(1)72with self.assertRaises(ValueError):73cbp(10)7475assert cbp(True) is True, cbp(True)76assert cbp(False) is False, cbp(False)77assert cbp(None) is False, cbp(None)7879assert cbp('true') is True, cbp('true')80assert cbp('t') is True, cbp('t')81assert cbp('True') is True, cbp('True')82assert cbp('T') is True, cbp('T')83assert cbp('TRUE') is True, cbp('TRUE')8485assert cbp('on') is True, cbp('on')86assert cbp('yes') is True, cbp('yes')87assert cbp('enable') is True, cbp('enable')88assert cbp('enabled') is True, cbp('enabled')8990assert cbp('false') is False, cbp('false')91assert cbp('f') is False, cbp('f')92assert cbp('False') is False, cbp('False')93assert cbp('F') is False, cbp('F')94assert cbp('FALSE') is False, cbp('FALSE')9596assert cbp('off') is False, cbp('off')97assert cbp('no') is False, cbp('no')98assert cbp('disable') is False, cbp('disable')99assert cbp('disabled') is False, cbp('disabled')100101with self.assertRaises(ValueError):102cbp('nein')103104with self.assertRaises(ValueError):105cbp(b'no')106107with self.assertRaises(ValueError):108cbp(['no'])109110def test_fetchall(self):111self.cur.execute('select * from data')112113out = self.cur.fetchall()114115desc = self.cur.description116rowcount = self.cur.rowcount117rownumber = self.cur.rownumber118lastrowid = self.cur.lastrowid119120assert sorted(out) == sorted([121('a', 'antelopes', 2),122('b', 'bears', 2),123('c', 'cats', 5),124('d', 'dogs', 4),125('e', 'elephants', 0),126]), out127128assert rowcount in (5, -1), rowcount129assert rownumber == 5, rownumber130assert lastrowid is None, lastrowid131assert len(desc) == 3, desc132assert desc[0].name == 'id', desc[0].name133assert desc[0].type_code in [253, 15], desc[0].type_code134assert desc[1].name == 'name', desc[1].name135assert desc[1].type_code in [253, 15], desc[1].type_code136assert desc[2].name == 'value', desc[2].name137assert desc[2].type_code == 8, desc[2].type_code138139def test_fetchone(self):140self.cur.execute('select * from data')141142out = []143while True:144row = self.cur.fetchone()145if row is None:146break147out.append(row)148assert self.cur.rownumber == len(out), self.cur.rownumber149150desc = self.cur.description151rowcount = self.cur.rowcount152rownumber = self.cur.rownumber153lastrowid = self.cur.lastrowid154155assert sorted(out) == sorted([156('a', 'antelopes', 2),157('b', 'bears', 2),158('c', 'cats', 5),159('d', 'dogs', 4),160('e', 'elephants', 0),161]), out162163assert rowcount in (5, -1), rowcount164assert rownumber == 5, rownumber165assert lastrowid is None, lastrowid166assert len(desc) == 3, desc167assert desc[0].name == 'id', desc[0].name168assert desc[0].type_code in [253, 15], desc[0].type_code169assert desc[1].name == 'name', desc[1].name170assert desc[1].type_code in [253, 15], desc[1].type_code171assert desc[2].name == 'value', desc[2].name172assert desc[2].type_code == 8, desc[2].type_code173174def test_fetchmany(self):175self.cur.execute('select * from data')176177out = []178while True:179rows = self.cur.fetchmany(size=3)180assert len(rows) <= 3, rows181if not rows:182break183out.extend(rows)184assert self.cur.rownumber == len(out), self.cur.rownumber185186desc = self.cur.description187rowcount = self.cur.rowcount188rownumber = self.cur.rownumber189lastrowid = self.cur.lastrowid190191assert sorted(out) == sorted([192('a', 'antelopes', 2),193('b', 'bears', 2),194('c', 'cats', 5),195('d', 'dogs', 4),196('e', 'elephants', 0),197]), out198199assert rowcount in (5, -1), rowcount200assert rownumber == 5, rownumber201assert lastrowid is None, lastrowid202assert len(desc) == 3, desc203assert desc[0].name == 'id'204assert desc[0].type_code in [253, 15]205assert desc[1].name == 'name'206assert desc[1].type_code in [253, 15]207assert desc[2].name == 'value'208assert desc[2].type_code == 8209210def test_arraysize(self):211self.cur.execute('select * from data')212213self.cur.arraysize = 3214assert self.cur.arraysize == 3215216rows = self.cur.fetchmany()217assert len(rows) == 3, rows218assert self.cur.rownumber == 3, self.cur.rownumber219220self.cur.arraysize = 1221assert self.cur.arraysize == 1222223rows = self.cur.fetchmany()224assert len(rows) == 1, rows225assert self.cur.rownumber == 4, self.cur.rownumber226227rows = self.cur.fetchmany()228assert len(rows) == 1, rows229assert self.cur.rownumber == 5, self.cur.rownumber230231rows = self.cur.fetchall()232assert len(rows) == 0, rows233assert self.cur.rownumber == 5, self.cur.rownumber234235def test_execute_with_dict_params(self):236self.cur.execute('select * from data where id < %(name)s', dict(name='d'))237out = self.cur.fetchall()238239desc = self.cur.description240rowcount = self.cur.rowcount241lastrowid = self.cur.lastrowid242243assert sorted(out) == sorted([244('a', 'antelopes', 2),245('b', 'bears', 2),246('c', 'cats', 5),247]), out248249assert rowcount in (3, -1), rowcount250assert lastrowid is None, lastrowid251assert len(desc) == 3, desc252assert desc[0].name == 'id', desc[0].name253assert desc[0].type_code in [253, 15], desc[0].type_code254assert desc[1].name == 'name', desc[1].name255assert desc[1].type_code in [253, 15], desc[1].type_code256assert desc[2].name == 'value', desc[2].name257assert desc[2].type_code == 8, desc[2].type_code258259def test_execute_with_positional_params(self):260self.cur.execute('select * from data where id < %s', ['d'])261out = self.cur.fetchall()262263desc = self.cur.description264rowcount = self.cur.rowcount265lastrowid = self.cur.lastrowid266267assert sorted(out) == sorted([268('a', 'antelopes', 2),269('b', 'bears', 2),270('c', 'cats', 5),271]), out272273assert rowcount in (3, -1), rowcount274assert lastrowid is None, lastrowid275assert len(desc) == 3, desc276assert desc[0].name == 'id', desc[0].name277assert desc[0].type_code in [253, 15], desc[0].type_code278assert desc[1].name == 'name', desc[1].name279assert desc[1].type_code in [253, 15], desc[1].type_code280assert desc[2].name == 'value', desc[2].name281assert desc[2].type_code == 8, desc[2].type_code282283def test_execute_with_escaped_positional_substitutions(self):284self.cur.execute(285'select `id`, `time` from alltypes where `time` = %s', [286'00:07:00',287],288)289out = self.cur.fetchall()290assert out[0] == (0, datetime.timedelta(seconds=420)), out[0]291292self.cur.execute(293'select `id`, `time` from alltypes where `time` = "00:07:00"',294)295out = self.cur.fetchall()296assert out[0] == (0, datetime.timedelta(seconds=420)), out[0]297298# with self.assertRaises(IndexError):299# self.cur.execute(300# 'select `id`, `time` from alltypes where `id` = %1s '301# 'or `time` = "00:07:00"', [0],302# )303304self.cur.execute(305'select `id`, `time` from alltypes where `id` = %s '306'or `time` = "00:07:00"', [0],307)308out = self.cur.fetchall()309assert out[0] == (0, datetime.timedelta(seconds=420)), out[0]310311def test_execute_with_escaped_substitutions(self):312self.cur.execute(313'select `id`, `time` from alltypes where `time` = %(time)s',314dict(time='00:07:00'),315)316out = self.cur.fetchall()317assert out[0] == (0, datetime.timedelta(seconds=420)), out[0]318319self.cur.execute(320'select `id`, `time` from alltypes where `time` = %(time)s',321dict(time='00:07:00'),322)323out = self.cur.fetchall()324assert len(out) == 1, out325326with self.assertRaises(KeyError):327self.cur.execute(328'select `id`, `time`, `char_100` from alltypes '329'where `time` = %(time)s or `char_100` like "foo:bar"',330dict(x='00:07:00'),331)332333self.cur.execute(334'select `id`, `time`, `char_100` from alltypes '335'where `time` = %(time)s or `char_100` like "foo::bar"',336dict(time='00:07:00'),337)338out = self.cur.fetchall()339assert out[0][:2] == (0, datetime.timedelta(seconds=420)), out[0]340341def test_is_connected(self):342assert self.conn.is_connected()343assert self.cur.is_connected()344self.cur.close()345assert not self.cur.is_connected()346assert self.conn.is_connected()347self.conn.close()348assert not self.cur.is_connected()349assert not self.conn.is_connected()350351def test_connection_attr(self):352# Use context manager to get to underlying object (self.conn is a weakref.proxy)353with self.conn as conn:354assert conn is self.conn355356def test_executemany(self):357# NOTE: Doesn't actually do anything since no rows match358self.cur.executemany(359'delete from data where id > %(name)s',360[dict(name='z'), dict(name='y')],361)362363def test_executemany_no_args(self):364self.cur.executemany('select * from data where id > "z"')365366def test_context_managers(self):367with s2.connect() as conn:368with conn.cursor() as cur:369assert cur.is_connected()370assert conn.is_connected()371assert not cur.is_connected()372assert not conn.is_connected()373374def test_iterator(self):375self.cur.execute('select * from data')376377out = []378for row in self.cur:379out.append(row)380381assert sorted(out) == sorted([382('a', 'antelopes', 2),383('b', 'bears', 2),384('c', 'cats', 5),385('d', 'dogs', 4),386('e', 'elephants', 0),387]), out388389def test_urls(self):390from singlestoredb.connection import build_params391from singlestoredb.config import get_option392393# Full URL (without scheme)394url = 'me:[email protected]:3307/mydb'395out = build_params(host=url)396assert out['driver'] == get_option('driver'), out['driver']397assert out['host'] == 's2host.com', out['host']398assert out['port'] == 3307, out['port']399assert out['database'] == 'mydb', out['database']400assert out['user'] == 'me', out['user']401assert out['password'] == 'p455w0rd', out['password']402403# Full URL (with scheme)404url = 'http://me:[email protected]:3307/mydb'405out = build_params(host=url)406assert out['driver'] == 'http', out['driver']407assert out['host'] == 's2host.com', out['host']408assert out['port'] == 3307, out['port']409assert out['database'] == 'mydb', out['database']410assert out['user'] == 'me', out['user']411assert out['password'] == 'p455w0rd', out['password']412413# No port414url = 'me:[email protected]/mydb'415out = build_params(host=url)416assert out['driver'] == get_option('driver'), out['driver']417assert out['host'] == 's2host.com', out['host']418if out['driver'] in ['http', 'https']:419assert out['port'] in [420get_option(421'http_port',422), 80, 443,423], out['port']424else:425assert out['port'] in [get_option('port'), 3306], out['port']426assert out['database'] == 'mydb', out['database']427assert out['user'] == 'me', out['user']428assert out['password'] == 'p455w0rd', out['password']429430# No http port431url = 'http://me:[email protected]/mydb'432out = build_params(host=url)433assert out['driver'] == 'http', out['driver']434assert out['host'] == 's2host.com', out['host']435assert out['port'] in [get_option('http_port'), 80], out['port']436assert out['database'] == 'mydb', out['database']437assert out['user'] == 'me', out['user']438assert out['password'] == 'p455w0rd', out['password']439440# No https port441url = 'https://me:[email protected]/mydb'442out = build_params(host=url)443assert out['driver'] == 'https', out['driver']444assert out['host'] == 's2host.com', out['host']445assert out['port'] in [get_option('http_port'), 443], out['port']446assert out['database'] == 'mydb', out['database']447assert out['user'] == 'me', out['user']448assert out['password'] == 'p455w0rd', out['password']449450# Invalid port451url = 'https://me:[email protected]:foo/mydb'452with self.assertRaises(ValueError):453build_params(host=url)454455# Empty password456url = 'me:@s2host.com/mydb'457out = build_params(host=url)458assert out['driver'] == get_option('driver'), out['driver']459assert out['host'] == 's2host.com', out['host']460if out['driver'] in ['http', 'https']:461assert out['port'] in [462get_option(463'http_port',464), 80, 443,465], out['port']466else:467assert out['port'] in [get_option('port'), 3306], out['port']468assert out['database'] == 'mydb', out['database']469assert out['user'] == 'me', out['user']470assert out['password'] == '', out['password']471472# No user/password473url = 's2host.com/mydb'474out = build_params(host=url)475assert out['driver'] == get_option('driver'), out['driver']476assert out['host'] == 's2host.com', out['host']477if out['driver'] in ['http', 'https']:478assert out['port'] in [479get_option(480'http_port',481), 80, 443,482], out['port']483else:484assert out['port'] in [get_option('port'), 3306], out['port']485assert out['database'] == 'mydb', out['database']486assert 'user' not in out or out['user'] == get_option(487'user',488), out['user']489assert 'password' not in out or out['password'] == get_option(490'password',491), out['password']492493# Just hostname494url = 's2host.com'495out = build_params(host=url)496assert out['driver'] == get_option('driver'), out['driver']497assert out['host'] == 's2host.com', out['host']498if out['driver'] in ['http', 'https']:499assert out['port'] in [500get_option(501'http_port',502), 80, 443,503], out['port']504else:505assert out['port'] in [get_option('port'), 3306], out['port']506assert 'database' not in out507assert 'user' not in out or out['user'] == get_option(508'user',509), out['user']510assert 'password' not in out or out['password'] == get_option(511'password',512), out['password']513514# Just hostname and port515url = 's2host.com:1000'516out = build_params(host=url)517assert out['driver'] == get_option('driver'), out['driver']518assert out['host'] == 's2host.com', out['host']519assert out['port'] == 1000, out['port']520assert 'database' not in out521assert 'user' not in out or out['user'] == get_option(522'user',523), out['user']524assert 'password' not in out or out['password'] == get_option(525'password',526), out['password']527528# Query options529url = 's2host.com:1000?local_infile=1&charset=utf8'530out = build_params(host=url)531assert out['driver'] == get_option('driver'), out['driver']532assert out['host'] == 's2host.com', out['host']533assert out['port'] == 1000, out['port']534assert 'database' not in out535assert 'user' not in out or out['user'] == get_option(536'user',537), out['user']538assert 'password' not in out or out['password'] == get_option(539'password',540), out['password']541assert out['local_infile'] is True, out['local_infile']542assert out['charset'] == 'utf8', out['charset']543544def test_exception(self):545with self.assertRaises(s2.ProgrammingError) as cm:546self.cur.execute('garbage syntax')547exc = cm.exception548assert 'You have an error in your SQL syntax' in exc.errmsg, exc.errmsg549550def test_alltypes(self):551self.cur.execute('select * from alltypes where id = 0')552names = [x[0] for x in self.cur.description]553types = [x[1] for x in self.cur.description]554out = self.cur.fetchone()555row = dict(zip(names, out))556typ = dict(zip(names, types))557558bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]559560def otype(x):561return x562563assert row['id'] == 0, row['id']564assert typ['id'] == otype(3), typ['id']565566assert row['tinyint'] == 80, row['tinyint']567assert typ['tinyint'] == otype(1), typ['tinyint']568569assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']570assert typ['unsigned_tinyint'] == otype(1), typ['unsigned_tinyint']571572assert row['bool'] == 0, row['bool']573assert typ['bool'] == otype(1), typ['bool']574575assert row['boolean'] == 1, row['boolean']576assert typ['boolean'] == otype(1), typ['boolean']577578assert row['smallint'] == -27897, row['smallint']579assert typ['smallint'] == otype(2), typ['smallint']580581assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']582assert typ['unsigned_smallint'] == otype(2), typ['unsigned_smallint']583584assert row['mediumint'] == 104729, row['mediumint']585assert typ['mediumint'] == otype(9), typ['mediumint']586587assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']588assert typ['unsigned_mediumint'] == otype(9), typ['unsigned_mediumint']589590assert row['int24'] == -200899, row['int24']591assert typ['int24'] == otype(9), typ['int24']592593assert row['unsigned_int24'] == 407709, row['unsigned_int24']594assert typ['unsigned_int24'] == otype(9), typ['unsigned_int24']595596assert row['int'] == -1295369311, row['int']597assert typ['int'] == otype(3), typ['int']598599assert row['unsigned_int'] == 3872362332, row['unsigned_int']600assert typ['unsigned_int'] == otype(3), typ['unsigned_int']601602assert row['integer'] == -1741727421, row['integer']603assert typ['integer'] == otype(3), typ['integer']604605assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']606assert typ['unsigned_integer'] == otype(3), typ['unsigned_integer']607608assert row['bigint'] == -266883847, row['bigint']609assert typ['bigint'] == otype(8), typ['bigint']610611assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']612assert typ['unsigned_bigint'] == otype(8), typ['unsigned_bigint']613614assert row['float'] == -146487000.0, row['float']615assert typ['float'] == otype(4), typ['float']616617assert row['double'] == -474646154.719356, row['double']618assert typ['double'] == otype(5), typ['double']619620assert row['real'] == -901409776.279346, row['real']621assert typ['real'] == otype(5), typ['real']622623assert row['decimal'] == decimal.Decimal(624'28111097.610822',625), row['decimal']626assert typ['decimal'] == otype(246), typ['decimal']627628assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']629assert typ['dec'] == otype(246), typ['dec']630631assert row['fixed'] == decimal.Decimal(632'-143773416.044092',633), row['fixed']634assert typ['fixed'] == otype(246), typ['fixed']635636assert row['numeric'] == decimal.Decimal(637'866689461.300046',638), row['numeric']639assert typ['numeric'] == otype(246), typ['numeric']640641assert row['date'] == datetime.date(8524, 11, 10), row['date']642assert typ['date'] == 10, typ['date']643644assert row['time'] == datetime.timedelta(minutes=7), row['time']645assert typ['time'] == 11, typ['time']646647assert typ['time_6'] == 11, typ['time_6']648649assert row['datetime'] == datetime.datetime(6509948, 3, 11, 15, 29, 22,651), row['datetime']652assert typ['datetime'] == 12, typ['datetime']653654assert row['datetime_6'] == datetime.datetime(6551756, 10, 29, 2, 2, 42, 8,656), row['datetime_6']657assert typ['datetime_6'] == 12, typ['datetime_6']658659assert row['timestamp'] == datetime.datetime(6601980, 12, 31, 1, 10, 23,661), row['timestamp']662assert typ['timestamp'] == otype(7), typ['timestamp']663664assert row['timestamp_6'] == datetime.datetime(6651991, 1, 2, 22, 15, 10, 6,666), row['timestamp_6']667assert typ['timestamp_6'] == otype(7), typ['timestamp_6']668669assert row['year'] == 1923, row['year']670assert typ['year'] == otype(13), typ['year']671672assert row['char_100'] == \673'This is a test of a 100 character column.', row['char_100']674assert typ['char_100'] == otype(254), typ['char_100']675676assert row['binary_100'] == bytearray(677bits + [0] * 84,678), row['binary_100']679assert typ['binary_100'] == otype(254), typ['binary_100']680681assert row['varchar_200'] == \682'This is a test of a variable character column.', row['varchar_200']683assert typ['varchar_200'] == otype(684253,685), typ['varchar_200'] # why not 15?686687assert row['varbinary_200'] == bytearray(688bits * 2,689), row['varbinary_200']690assert typ['varbinary_200'] == otype(691253,692), typ['varbinary_200'] # why not 15?693694assert row['longtext'] == 'This is a longtext column.', row['longtext']695assert typ['longtext'] == otype(251), typ['longtext']696697assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']698assert typ['mediumtext'] == otype(250), typ['mediumtext']699700assert row['text'] == 'This is a text column.', row['text']701assert typ['text'] == otype(252), typ['text']702703assert row['tinytext'] == 'This is a tinytext column.'704assert typ['tinytext'] == otype(249), typ['tinytext']705706assert row['longblob'] == bytearray(bits * 3), row['longblob']707assert typ['longblob'] == otype(251), typ['longblob']708709assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']710assert typ['mediumblob'] == otype(250), typ['mediumblob']711712assert row['blob'] == bytearray(bits), row['blob']713assert typ['blob'] == otype(252), typ['blob']714715assert row['tinyblob'] == bytearray(716[10, 11, 12, 13, 14, 15],717), row['tinyblob']718assert typ['tinyblob'] == otype(249), typ['tinyblob']719720assert row['json'] == {721'a': 10, 'b': 2.75,722'c': 'hello world',723}, row['json']724assert typ['json'] == otype(245), typ['json']725726assert row['enum'] == 'one', row['enum']727assert typ['enum'] == otype(253), typ['enum'] # mysql code: 247728729assert row['set'] == 'two', row['set']730assert typ['set'] == otype(253), typ['set'] # mysql code: 248731732assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']733assert typ['bit'] == otype(16), typ['bit']734735def test_alltypes_numpy(self):736conn = s2.connect(database=type(self).dbname, results_type='numpy')737cur = conn.cursor()738739cur.execute('select * from alltypes where id = 0')740names = [x[0] for x in cur.description]741out = cur.fetchone()742row = dict(zip(names, out[0]))743744dtypes = [745('id', '<f8'),746('tinyint', '<f4'),747('unsigned_tinyint', '<f4'),748('bool', '<f4'),749('boolean', '<f4'),750('smallint', '<f4'),751('unsigned_smallint', '<f4'),752('mediumint', '<f8'),753('unsigned_mediumint', '<f8'),754('int24', '<f8'),755('unsigned_int24', '<f8'),756('int', '<f8'),757('unsigned_int', '<f8'),758('integer', '<f8'),759('unsigned_integer', '<f8'),760('bigint', '<f8'),761('unsigned_bigint', '<f8'),762('float', '<f4'),763('double', '<f8'),764('real', '<f8'),765('decimal', 'O'),766('dec', 'O'),767('fixed', 'O'),768('numeric', 'O'),769('date', '<M8[D]'),770('time', '<m8[us]'),771('time_6', '<m8[us]'),772('datetime', '<M8[us]'),773('datetime_6', '<M8[us]'),774('timestamp', '<M8[us]'),775('timestamp_6', '<M8[us]'),776('year', '<f8'),777('char_100', 'O'),778('binary_100', 'O'),779('varchar_200', 'O'),780('varbinary_200', 'O'),781('longtext', 'O'),782('mediumtext', 'O'),783('text', 'O'),784('tinytext', 'O'),785('longblob', 'O'),786('mediumblob', 'O'),787('blob', 'O'),788('tinyblob', 'O'),789('json', 'O'),790('enum', 'O'),791('set', 'O'),792('bit', 'O'),793]794795assert out.dtype == dtypes796797bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]798799assert row['id'] == 0, row['id']800assert row['tinyint'] == 80, row['tinyint']801assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']802assert row['bool'] == 0, row['bool']803assert row['boolean'] == 1, row['boolean']804assert row['smallint'] == -27897, row['smallint']805assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']806assert row['mediumint'] == 104729, row['mediumint']807assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']808assert row['int24'] == -200899, row['int24']809assert row['unsigned_int24'] == 407709, row['unsigned_int24']810assert row['int'] == -1295369311, row['int']811assert row['unsigned_int'] == 3872362332, row['unsigned_int']812assert row['integer'] == -1741727421, row['integer']813assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']814assert row['bigint'] == -266883847, row['bigint']815assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']816assert row['float'] - -146487000.0 < 0.00001, row['float']817assert row['double'] == -474646154.719356, row['double']818assert row['real'] == -901409776.279346, row['real']819assert row['decimal'] == decimal.Decimal(820'28111097.610822',821), row['decimal']822assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']823assert row['fixed'] == decimal.Decimal(824'-143773416.044092',825), row['fixed']826assert row['numeric'] == decimal.Decimal(827'866689461.300046',828), row['numeric']829assert row['date'] == datetime.date(8524, 11, 10), row['date']830assert row['time'] == datetime.timedelta(minutes=7), row['time']831assert row['datetime'] == datetime.datetime(8329948, 3, 11, 15, 29, 22,833), row['datetime']834assert row['datetime_6'] == datetime.datetime(8351756, 10, 29, 2, 2, 42, 8,836), row['datetime_6']837assert row['timestamp'] == datetime.datetime(8381980, 12, 31, 1, 10, 23,839), row['timestamp']840assert row['timestamp_6'] == datetime.datetime(8411991, 1, 2, 22, 15, 10, 6,842), row['timestamp_6']843assert row['year'] == 1923, row['year']844assert row['char_100'] == \845'This is a test of a 100 character column.', row['char_100']846assert row['binary_100'] == bytearray(847bits + [0] * 84,848), row['binary_100']849assert row['varchar_200'] == \850'This is a test of a variable character column.', row['varchar_200']851assert row['varbinary_200'] == bytearray(852bits * 2,853), row['varbinary_200']854assert row['longtext'] == 'This is a longtext column.', row['longtext']855assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']856assert row['text'] == 'This is a text column.', row['text']857assert row['tinytext'] == 'This is a tinytext column.'858assert row['longblob'] == bytearray(bits * 3), row['longblob']859assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']860assert row['blob'] == bytearray(bits), row['blob']861assert row['tinyblob'] == bytearray(862[10, 11, 12, 13, 14, 15],863), row['tinyblob']864assert row['json'] == {865'a': 10, 'b': 2.75,866'c': 'hello world',867}, row['json']868assert row['enum'] == 'one', row['enum']869assert row['set'] == 'two', row['set']870assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']871872conn.close()873874def test_alltypes_no_nulls_numpy(self):875if self.conn.driver in ['http', 'https']:876self.skipTest('Data API does not surface unsigned int information')877878conn = s2.connect(database=type(self).dbname, results_type='numpy')879cur = conn.cursor()880881cur.execute('select * from alltypes_no_nulls where id = 0')882names = [x[0] for x in cur.description]883out = cur.fetchone()884row = dict(zip(names, out[0]))885886dtypes = [887('id', '<i4'),888('tinyint', 'i1'),889('unsigned_tinyint', 'u1'),890('bool', 'i1'),891('boolean', 'i1'),892('smallint', '<i2'),893('unsigned_smallint', '<u2'),894('mediumint', '<i4'),895('unsigned_mediumint', '<u4'),896('int24', '<i4'),897('unsigned_int24', '<u4'),898('int', '<i4'),899('unsigned_int', '<u4'),900('integer', '<i4'),901('unsigned_integer', '<u4'),902('bigint', '<i8'),903('unsigned_bigint', '<u8'),904('float', '<f4'),905('double', '<f8'),906('real', '<f8'),907('decimal', 'O'),908('dec', 'O'),909('fixed', 'O'),910('numeric', 'O'),911('date', '<M8[D]'),912('time', '<m8[us]'),913('time_6', '<m8[us]'),914('datetime', '<M8[us]'),915('datetime_6', '<M8[us]'),916('timestamp', '<M8[us]'),917('timestamp_6', '<M8[us]'),918('year', '<i2'),919('char_100', 'O'),920('binary_100', 'O'),921('varchar_200', 'O'),922('varbinary_200', 'O'),923('longtext', 'O'),924('mediumtext', 'O'),925('text', 'O'),926('tinytext', 'O'),927('longblob', 'O'),928('mediumblob', 'O'),929('blob', 'O'),930('tinyblob', 'O'),931('json', 'O'),932('enum', 'O'),933('set', 'O'),934('bit', 'O'),935]936937assert out.dtype == dtypes938939bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]940941assert row['id'] == 0, row['id']942assert row['tinyint'] == 80, row['tinyint']943assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']944assert row['bool'] == 0, row['bool']945assert row['boolean'] == 1, row['boolean']946assert row['smallint'] == -27897, row['smallint']947assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']948assert row['mediumint'] == 104729, row['mediumint']949assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']950assert row['int24'] == -200899, row['int24']951assert row['unsigned_int24'] == 407709, row['unsigned_int24']952assert row['int'] == -1295369311, row['int']953assert row['unsigned_int'] == 3872362332, row['unsigned_int']954assert row['integer'] == -1741727421, row['integer']955assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']956assert row['bigint'] == -266883847, row['bigint']957assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']958assert row['float'] - -146487000.0 < 0.00001, row['float']959assert row['double'] == -474646154.719356, row['double']960assert row['real'] == -901409776.279346, row['real']961assert row['decimal'] == decimal.Decimal(962'28111097.610822',963), row['decimal']964assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']965assert row['fixed'] == decimal.Decimal(966'-143773416.044092',967), row['fixed']968assert row['numeric'] == decimal.Decimal(969'866689461.300046',970), row['numeric']971assert row['date'] == datetime.date(8524, 11, 10), row['date']972assert row['time'] == datetime.timedelta(minutes=7), row['time']973assert row['datetime'] == datetime.datetime(9749948, 3, 11, 15, 29, 22,975), row['datetime']976assert row['datetime_6'] == datetime.datetime(9771756, 10, 29, 2, 2, 42, 8,978), row['datetime_6']979assert row['timestamp'] == datetime.datetime(9801980, 12, 31, 1, 10, 23,981), row['timestamp']982assert row['timestamp_6'] == datetime.datetime(9831991, 1, 2, 22, 15, 10, 6,984), row['timestamp_6']985assert row['year'] == 1923, row['year']986assert row['char_100'] == \987'This is a test of a 100 character column.', row['char_100']988assert row['binary_100'] == bytearray(989bits + [0] * 84,990), row['binary_100']991assert row['varchar_200'] == \992'This is a test of a variable character column.', row['varchar_200']993assert row['varbinary_200'] == bytearray(994bits * 2,995), row['varbinary_200']996assert row['longtext'] == 'This is a longtext column.', row['longtext']997assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']998assert row['text'] == 'This is a text column.', row['text']999assert row['tinytext'] == 'This is a tinytext column.'1000assert row['longblob'] == bytearray(bits * 3), row['longblob']1001assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1002assert row['blob'] == bytearray(bits), row['blob']1003assert row['tinyblob'] == bytearray(1004[10, 11, 12, 13, 14, 15],1005), row['tinyblob']1006assert row['json'] == {1007'a': 10, 'b': 2.75,1008'c': 'hello world',1009}, row['json']1010assert row['enum'] == 'one', row['enum']1011assert row['set'] == 'two', row['set']1012assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']10131014conn.close()10151016def test_alltypes_min_max_numpy(self):1017if self.conn.driver in ['http', 'https']:1018self.skipTest('Data API does not surface unsigned int information')10191020conn = s2.connect(database=type(self).dbname, results_type='numpy')1021cur = conn.cursor()10221023cur.execute('select * from alltypes_no_nulls')1024cur.fetchall()10251026cur.execute('select * from alltypes')1027cur.fetchall()10281029conn.close()10301031def test_alltypes_nulls_numpy(self):1032conn = s2.connect(database=type(self).dbname, results_type='numpy')1033cur = conn.cursor()10341035cur.execute('select * from alltypes where id = 1')1036names = [x[0] for x in cur.description]1037out = cur.fetchone()1038row = dict(zip(names, out[0]))10391040assert row['id'] == 1, row['id']1041assert np.isnan(row['tinyint']), row['tinyint']1042assert np.isnan(row['bool']), row['bool']1043assert np.isnan(row['boolean']), row['boolean']1044assert np.isnan(row['smallint']), row['smallint']1045assert np.isnan(row['mediumint']), row['mediumint']1046assert np.isnan(row['int24']), row['int24']1047assert np.isnan(row['int']), row['int']1048assert np.isnan(row['integer']), row['integer']1049assert np.isnan(row['bigint']), row['bigint']1050assert np.isnan(row['float']), row['float']1051assert np.isnan(row['double']), row['double']1052assert np.isnan(row['real']), row['real']1053assert row['decimal'] is None, row['decimal']1054assert row['dec'] is None, row['dec']1055assert row['fixed'] is None, row['fixed']1056assert row['numeric'] is None, row['numeric']1057assert np.isnat(row['date']), row['date']1058assert np.isnat(row['time']), row['time']1059assert np.isnat(row['time']), row['time']1060assert np.isnat(row['datetime']), row['datetime']1061assert np.isnat(row['datetime_6']), row['datetime_6']1062assert np.isnat(row['timestamp']), row['timestamp']1063assert np.isnat(row['timestamp_6']), row['timestamp_6']1064assert np.isnan(row['year']), row['year']1065assert row['char_100'] is None, row['char_100']1066assert row['binary_100'] is None, row['binary_100']1067assert row['varchar_200'] is None, row['varchar_200']1068assert row['varbinary_200'] is None, row['varbinary_200']1069assert row['longtext'] is None, row['longtext']1070assert row['mediumtext'] is None, row['mediumtext']1071assert row['text'] is None, row['text']1072assert row['tinytext'] is None, row['tinytext']1073assert row['longblob'] is None, row['longblob']1074assert row['mediumblob'] is None, row['mediumblob']1075assert row['blob'] is None, row['blob']1076assert row['tinyblob'] is None, row['tinyblob']1077assert row['json'] is None, row['json']1078assert row['enum'] is None, row['enum']1079assert row['set'] is None, row['set']1080assert row['bit'] is None, row['bit']10811082conn.close()10831084def test_alltypes_pandas(self):1085conn = s2.connect(database=type(self).dbname, results_type='pandas')1086cur = conn.cursor()10871088cur.execute('select * from alltypes where id = 0')1089names = [x[0] for x in cur.description]1090out = cur.fetchone()1091row = dict(zip(names, out.iloc[0]))10921093dtypes = [1094('id', 'float64'),1095('tinyint', 'float32'),1096('unsigned_tinyint', 'float32'),1097('bool', 'float32'),1098('boolean', 'float32'),1099('smallint', 'float32'),1100('unsigned_smallint', 'float32'),1101('mediumint', 'float64'),1102('unsigned_mediumint', 'float64'),1103('int24', 'float64'),1104('unsigned_int24', 'float64'),1105('int', 'float64'),1106('unsigned_int', 'float64'),1107('integer', 'float64'),1108('unsigned_integer', 'float64'),1109('bigint', 'float64'),1110('unsigned_bigint', 'float64'),1111('float', 'float32'),1112('double', 'float64'),1113('real', 'float64'),1114('decimal', 'object'),1115('dec', 'object'),1116('fixed', 'object'),1117('numeric', 'object'),1118('date', 'datetime64[s]'),1119('time', 'timedelta64[us]'),1120('time_6', 'timedelta64[us]'),1121('datetime', 'datetime64[us]'),1122('datetime_6', 'datetime64[us]'),1123('timestamp', 'datetime64[us]'),1124('timestamp_6', 'datetime64[us]'),1125('year', 'float64'),1126('char_100', 'object'),1127('binary_100', 'object'),1128('varchar_200', 'object'),1129('varbinary_200', 'object'),1130('longtext', 'object'),1131('mediumtext', 'object'),1132('text', 'object'),1133('tinytext', 'object'),1134('longblob', 'object'),1135('mediumblob', 'object'),1136('blob', 'object'),1137('tinyblob', 'object'),1138('json', 'object'),1139('enum', 'object'),1140('set', 'object'),1141('bit', 'object'),1142]11431144assert [(x[0], str(x[1])) for x in out.dtypes.items()] == dtypes11451146bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]11471148assert row['id'] == 0, row['id']1149assert row['tinyint'] == 80, row['tinyint']1150assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']1151assert row['bool'] == 0, row['bool']1152assert row['boolean'] == 1, row['boolean']1153assert row['smallint'] == -27897, row['smallint']1154assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']1155assert row['mediumint'] == 104729, row['mediumint']1156assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']1157assert row['int24'] == -200899, row['int24']1158assert row['unsigned_int24'] == 407709, row['unsigned_int24']1159assert row['int'] == -1295369311, row['int']1160assert row['unsigned_int'] == 3872362332, row['unsigned_int']1161assert row['integer'] == -1741727421, row['integer']1162assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']1163assert row['bigint'] == -266883847, row['bigint']1164assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']1165assert row['float'] - -146487000.0 < 0.00001, row['float']1166assert row['double'] == -474646154.719356, row['double']1167assert row['real'] == -901409776.279346, row['real']1168assert row['decimal'] == decimal.Decimal(1169'28111097.610822',1170), row['decimal']1171assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']1172assert row['fixed'] == decimal.Decimal(1173'-143773416.044092',1174), row['fixed']1175assert row['numeric'] == decimal.Decimal(1176'866689461.300046',1177), row['numeric']1178assert row['date'] == datetime.datetime(8524, 11, 10), row['date']1179assert row['time'] == datetime.timedelta(minutes=7), row['time']1180assert row['datetime'] == datetime.datetime(11819948, 3, 11, 15, 29, 22,1182), row['datetime']1183assert row['datetime_6'] == datetime.datetime(11841756, 10, 29, 2, 2, 42, 8,1185), row['datetime_6']1186assert row['timestamp'] == datetime.datetime(11871980, 12, 31, 1, 10, 23,1188), row['timestamp']1189assert row['timestamp_6'] == datetime.datetime(11901991, 1, 2, 22, 15, 10, 6,1191), row['timestamp_6']1192assert row['year'] == 1923, row['year']1193assert row['char_100'] == \1194'This is a test of a 100 character column.', row['char_100']1195assert row['binary_100'] == bytearray(1196bits + [0] * 84,1197), row['binary_100']1198assert row['varchar_200'] == \1199'This is a test of a variable character column.', row['varchar_200']1200assert row['varbinary_200'] == bytearray(1201bits * 2,1202), row['varbinary_200']1203assert row['longtext'] == 'This is a longtext column.', row['longtext']1204assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']1205assert row['text'] == 'This is a text column.', row['text']1206assert row['tinytext'] == 'This is a tinytext column.'1207assert row['longblob'] == bytearray(bits * 3), row['longblob']1208assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1209assert row['blob'] == bytearray(bits), row['blob']1210assert row['tinyblob'] == bytearray(1211[10, 11, 12, 13, 14, 15],1212), row['tinyblob']1213assert row['json'] == {1214'a': 10, 'b': 2.75,1215'c': 'hello world',1216}, row['json']1217assert row['enum'] == 'one', row['enum']1218assert row['set'] == 'two', row['set']1219assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']12201221conn.close()12221223def test_alltypes_no_nulls_pandas(self):1224if self.conn.driver in ['http', 'https']:1225self.skipTest('Data API does not surface unsigned int information')12261227conn = s2.connect(database=type(self).dbname, results_type='pandas')1228cur = conn.cursor()12291230cur.execute('select * from alltypes_no_nulls where id = 0')1231names = [x[0] for x in cur.description]1232out = cur.fetchone()1233row = dict(zip(names, out.iloc[0]))12341235dtypes = [1236('id', 'int32'),1237('tinyint', 'int8'),1238('unsigned_tinyint', 'uint8'),1239('bool', 'int8'),1240('boolean', 'int8'),1241('smallint', 'int16'),1242('unsigned_smallint', 'uint16'),1243('mediumint', 'int32'),1244('unsigned_mediumint', 'uint32'),1245('int24', 'int32'),1246('unsigned_int24', 'uint32'),1247('int', 'int32'),1248('unsigned_int', 'uint32'),1249('integer', 'int32'),1250('unsigned_integer', 'uint32'),1251('bigint', 'int64'),1252('unsigned_bigint', 'uint64'),1253('float', 'float32'),1254('double', 'float64'),1255('real', 'float64'),1256('decimal', 'object'),1257('dec', 'object'),1258('fixed', 'object'),1259('numeric', 'object'),1260('date', 'datetime64[s]'),1261('time', 'timedelta64[us]'),1262('time_6', 'timedelta64[us]'),1263('datetime', 'datetime64[us]'),1264('datetime_6', 'datetime64[us]'),1265('timestamp', 'datetime64[us]'),1266('timestamp_6', 'datetime64[us]'),1267('year', 'int16'),1268('char_100', 'object'),1269('binary_100', 'object'),1270('varchar_200', 'object'),1271('varbinary_200', 'object'),1272('longtext', 'object'),1273('mediumtext', 'object'),1274('text', 'object'),1275('tinytext', 'object'),1276('longblob', 'object'),1277('mediumblob', 'object'),1278('blob', 'object'),1279('tinyblob', 'object'),1280('json', 'object'),1281('enum', 'object'),1282('set', 'object'),1283('bit', 'object'),1284]12851286assert [(x[0], str(x[1])) for x in out.dtypes.items()] == dtypes12871288bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]12891290assert row['id'] == 0, row['id']1291assert row['tinyint'] == 80, row['tinyint']1292assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']1293assert row['bool'] == 0, row['bool']1294assert row['boolean'] == 1, row['boolean']1295assert row['smallint'] == -27897, row['smallint']1296assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']1297assert row['mediumint'] == 104729, row['mediumint']1298assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']1299assert row['int24'] == -200899, row['int24']1300assert row['unsigned_int24'] == 407709, row['unsigned_int24']1301assert row['int'] == -1295369311, row['int']1302assert row['unsigned_int'] == 3872362332, row['unsigned_int']1303assert row['integer'] == -1741727421, row['integer']1304assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']1305assert row['bigint'] == -266883847, row['bigint']1306assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']1307assert row['float'] - -146487000.0 < 0.00001, row['float']1308assert row['double'] == -474646154.719356, row['double']1309assert row['real'] == -901409776.279346, row['real']1310assert row['decimal'] == decimal.Decimal(1311'28111097.610822',1312), row['decimal']1313assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']1314assert row['fixed'] == decimal.Decimal(1315'-143773416.044092',1316), row['fixed']1317assert row['numeric'] == decimal.Decimal(1318'866689461.300046',1319), row['numeric']1320assert row['date'] == datetime.datetime(8524, 11, 10), row['date']1321assert row['time'] == datetime.timedelta(minutes=7), row['time']1322assert row['datetime'] == datetime.datetime(13239948, 3, 11, 15, 29, 22,1324), row['datetime']1325assert row['datetime_6'] == datetime.datetime(13261756, 10, 29, 2, 2, 42, 8,1327), row['datetime_6']1328assert row['timestamp'] == datetime.datetime(13291980, 12, 31, 1, 10, 23,1330), row['timestamp']1331assert row['timestamp_6'] == datetime.datetime(13321991, 1, 2, 22, 15, 10, 6,1333), row['timestamp_6']1334assert row['year'] == 1923, row['year']1335assert row['char_100'] == \1336'This is a test of a 100 character column.', row['char_100']1337assert row['binary_100'] == bytearray(1338bits + [0] * 84,1339), row['binary_100']1340assert row['varchar_200'] == \1341'This is a test of a variable character column.', row['varchar_200']1342assert row['varbinary_200'] == bytearray(1343bits * 2,1344), row['varbinary_200']1345assert row['longtext'] == 'This is a longtext column.', row['longtext']1346assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']1347assert row['text'] == 'This is a text column.', row['text']1348assert row['tinytext'] == 'This is a tinytext column.'1349assert row['longblob'] == bytearray(bits * 3), row['longblob']1350assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1351assert row['blob'] == bytearray(bits), row['blob']1352assert row['tinyblob'] == bytearray(1353[10, 11, 12, 13, 14, 15],1354), row['tinyblob']1355assert row['json'] == {1356'a': 10, 'b': 2.75,1357'c': 'hello world',1358}, row['json']1359assert row['enum'] == 'one', row['enum']1360assert row['set'] == 'two', row['set']1361assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']13621363conn.close()13641365def test_alltypes_min_max_pandas(self):1366if self.conn.driver in ['http', 'https']:1367self.skipTest('Data API does not surface unsigned int information')13681369conn = s2.connect(database=type(self).dbname, results_type='pandas')1370cur = conn.cursor()13711372cur.execute('select * from alltypes_no_nulls')1373cur.fetchall()13741375cur.execute('select * from alltypes')1376cur.fetchall()13771378conn.close()13791380def test_alltypes_nulls_pandas(self):1381conn = s2.connect(database=type(self).dbname, results_type='pandas')1382cur = conn.cursor()13831384cur.execute('select * from alltypes where id = 1')1385names = [x[0] for x in cur.description]1386out = cur.fetchone()1387row = dict(zip(names, out.iloc[0]))13881389assert row['id'] == 1, row['id']1390assert np.isnan(row['tinyint']), row['tinyint']1391assert np.isnan(row['bool']), row['bool']1392assert np.isnan(row['boolean']), row['boolean']1393assert np.isnan(row['smallint']), row['smallint']1394assert np.isnan(row['mediumint']), row['mediumint']1395assert np.isnan(row['int24']), row['int24']1396assert np.isnan(row['int']), row['int']1397assert np.isnan(row['integer']), row['integer']1398assert np.isnan(row['bigint']), row['bigint']1399assert np.isnan(row['float']), row['float']1400assert np.isnan(row['double']), row['double']1401assert np.isnan(row['real']), row['real']1402assert row['decimal'] is None, row['decimal']1403assert row['dec'] is None, row['dec']1404assert row['fixed'] is None, row['fixed']1405assert row['numeric'] is None, row['numeric']1406assert row['date'] is pd.NaT, row['date']1407assert row['time'] is pd.NaT, row['time']1408assert row['time'] is pd.NaT, row['time']1409assert row['datetime'] is pd.NaT, row['datetime']1410assert row['datetime_6'] is pd.NaT, row['datetime_6']1411assert row['timestamp'] is pd.NaT, row['timestamp']1412assert row['timestamp_6'] is pd.NaT, row['timestamp_6']1413assert np.isnan(row['year']), row['year']1414assert row['char_100'] is None, row['char_100']1415assert row['binary_100'] is None, row['binary_100']1416assert row['varchar_200'] is None, row['varchar_200']1417assert row['varbinary_200'] is None, row['varbinary_200']1418assert row['longtext'] is None, row['longtext']1419assert row['mediumtext'] is None, row['mediumtext']1420assert row['text'] is None, row['text']1421assert row['tinytext'] is None, row['tinytext']1422assert row['longblob'] is None, row['longblob']1423assert row['mediumblob'] is None, row['mediumblob']1424assert row['blob'] is None, row['blob']1425assert row['tinyblob'] is None, row['tinyblob']1426assert row['json'] is None, row['json']1427assert row['enum'] is None, row['enum']1428assert row['set'] is None, row['set']1429assert row['bit'] is None, row['bit']14301431conn.close()14321433def test_alltypes_polars(self):1434if self.conn.driver in ['http', 'https']:1435self.skipTest('Data API does not surface unsigned int information')14361437conn = s2.connect(database=type(self).dbname, results_type='polars')1438cur = conn.cursor()14391440cur.execute('select * from alltypes where id = 0')1441names = [x[0] for x in cur.description]1442out = cur.fetchone()1443row = dict(zip(names, out.row(0)))14441445# Recent versions of polars have a problem with decimals1446class FixCompare(str):1447def __eq__(self, other):1448return super().__eq__(other.replace('precision=None', 'precision=20'))14491450dtypes = [1451('id', 'Int32'),1452('tinyint', 'Int8'),1453('unsigned_tinyint', 'UInt8'),1454('bool', 'Int8'),1455('boolean', 'Int8'),1456('smallint', 'Int16'),1457('unsigned_smallint', 'UInt16'),1458('mediumint', 'Int32'),1459('unsigned_mediumint', 'UInt32'),1460('int24', 'Int32'),1461('unsigned_int24', 'UInt32'),1462('int', 'Int32'),1463('unsigned_int', 'UInt32'),1464('integer', 'Int32'),1465('unsigned_integer', 'UInt32'),1466('bigint', 'Int64'),1467('unsigned_bigint', 'UInt64'),1468('float', 'Float32'),1469('double', 'Float64'),1470('real', 'Float64'),1471('decimal', FixCompare('Decimal(precision=20, scale=6)')),1472('dec', FixCompare('Decimal(precision=20, scale=6)')),1473('fixed', FixCompare('Decimal(precision=20, scale=6)')),1474('numeric', FixCompare('Decimal(precision=20, scale=6)')),1475('date', 'Date'),1476('time', "Duration(time_unit='us')"),1477('time_6', "Duration(time_unit='us')"),1478('datetime', "Datetime(time_unit='us', time_zone=None)"),1479('datetime_6', "Datetime(time_unit='us', time_zone=None)"),1480('timestamp', "Datetime(time_unit='us', time_zone=None)"),1481('timestamp_6', "Datetime(time_unit='us', time_zone=None)"),1482('year', 'Int16'),1483('char_100', 'String'),1484('binary_100', 'Binary'),1485('varchar_200', 'String'),1486('varbinary_200', 'Binary'),1487('longtext', 'String'),1488('mediumtext', 'String'),1489('text', 'String'),1490('tinytext', 'String'),1491('longblob', 'Binary'),1492('mediumblob', 'Binary'),1493('blob', 'Binary'),1494('tinyblob', 'Binary'),1495('json', 'Object'),1496('enum', 'String'),1497('set', 'String'),1498('bit', 'Binary'),1499]15001501assert [(x, str(y)) for x, y in zip(out.columns, out.dtypes)] == dtypes15021503bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]15041505assert row['id'] == 0, row['id']1506assert row['tinyint'] == 80, row['tinyint']1507assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']1508assert row['bool'] == 0, row['bool']1509assert row['boolean'] == 1, row['boolean']1510assert row['smallint'] == -27897, row['smallint']1511assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']1512assert row['mediumint'] == 104729, row['mediumint']1513assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']1514assert row['int24'] == -200899, row['int24']1515assert row['unsigned_int24'] == 407709, row['unsigned_int24']1516assert row['int'] == -1295369311, row['int']1517assert row['unsigned_int'] == 3872362332, row['unsigned_int']1518assert row['integer'] == -1741727421, row['integer']1519assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']1520assert row['bigint'] == -266883847, row['bigint']1521assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']1522assert row['float'] - -146487000.0 < 0.00001, row['float']1523assert row['double'] == -474646154.719356, row['double']1524assert row['real'] == -901409776.279346, row['real']1525assert row['decimal'] == decimal.Decimal(1526'28111097.610822',1527), row['decimal']1528assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']1529assert row['fixed'] == decimal.Decimal(1530'-143773416.044092',1531), row['fixed']1532assert row['numeric'] == decimal.Decimal(1533'866689461.300046',1534), row['numeric']1535assert row['date'] == datetime.date(8524, 11, 10), row['date']1536assert row['time'] == datetime.timedelta(minutes=7), row['time']1537assert row['datetime'] == datetime.datetime(15389948, 3, 11, 15, 29, 22,1539), row['datetime']1540assert row['datetime_6'] == datetime.datetime(15411756, 10, 29, 2, 2, 42, 8,1542), row['datetime_6']1543assert row['timestamp'] == datetime.datetime(15441980, 12, 31, 1, 10, 23,1545), row['timestamp']1546assert row['timestamp_6'] == datetime.datetime(15471991, 1, 2, 22, 15, 10, 6,1548), row['timestamp_6']1549assert row['year'] == 1923, row['year']1550assert row['char_100'] == \1551'This is a test of a 100 character column.', row['char_100']1552assert row['binary_100'] == bytearray(1553bits + [0] * 84,1554), row['binary_100']1555assert row['varchar_200'] == \1556'This is a test of a variable character column.', row['varchar_200']1557assert row['varbinary_200'] == bytearray(1558bits * 2,1559), row['varbinary_200']1560assert row['longtext'] == 'This is a longtext column.', row['longtext']1561assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']1562assert row['text'] == 'This is a text column.', row['text']1563assert row['tinytext'] == 'This is a tinytext column.'1564assert row['longblob'] == bytearray(bits * 3), row['longblob']1565assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1566assert row['blob'] == bytearray(bits), row['blob']1567assert row['tinyblob'] == bytearray(1568[10, 11, 12, 13, 14, 15],1569), row['tinyblob']1570assert row['json'] == {1571'a': 10, 'b': 2.75,1572'c': 'hello world',1573}, row['json']1574assert row['enum'] == 'one', row['enum']1575assert row['set'] == 'two', row['set']1576assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']15771578conn.close()15791580def test_alltypes_no_nulls_polars(self):1581if self.conn.driver in ['http', 'https']:1582self.skipTest('Data API does not surface unsigned int information')15831584conn = s2.connect(database=type(self).dbname, results_type='polars')1585cur = conn.cursor()15861587cur.execute('select * from alltypes_no_nulls where id = 0')1588names = [x[0] for x in cur.description]1589out = cur.fetchone()1590row = dict(zip(names, out.row(0)))15911592# Recent versions of polars have a problem with decimals1593class FixCompare(str):1594def __eq__(self, other):1595return super().__eq__(other.replace('precision=None', 'precision=20'))15961597dtypes = [1598('id', 'Int32'),1599('tinyint', 'Int8'),1600('unsigned_tinyint', 'UInt8'),1601('bool', 'Int8'),1602('boolean', 'Int8'),1603('smallint', 'Int16'),1604('unsigned_smallint', 'UInt16'),1605('mediumint', 'Int32'),1606('unsigned_mediumint', 'UInt32'),1607('int24', 'Int32'),1608('unsigned_int24', 'UInt32'),1609('int', 'Int32'),1610('unsigned_int', 'UInt32'),1611('integer', 'Int32'),1612('unsigned_integer', 'UInt32'),1613('bigint', 'Int64'),1614('unsigned_bigint', 'UInt64'),1615('float', 'Float32'),1616('double', 'Float64'),1617('real', 'Float64'),1618('decimal', FixCompare('Decimal(precision=20, scale=6)')),1619('dec', FixCompare('Decimal(precision=20, scale=6)')),1620('fixed', FixCompare('Decimal(precision=20, scale=6)')),1621('numeric', FixCompare('Decimal(precision=20, scale=6)')),1622('date', 'Date'),1623('time', "Duration(time_unit='us')"),1624('time_6', "Duration(time_unit='us')"),1625('datetime', "Datetime(time_unit='us', time_zone=None)"),1626('datetime_6', "Datetime(time_unit='us', time_zone=None)"),1627('timestamp', "Datetime(time_unit='us', time_zone=None)"),1628('timestamp_6', "Datetime(time_unit='us', time_zone=None)"),1629('year', 'Int16'),1630('char_100', 'String'),1631('binary_100', 'Binary'),1632('varchar_200', 'String'),1633('varbinary_200', 'Binary'),1634('longtext', 'String'),1635('mediumtext', 'String'),1636('text', 'String'),1637('tinytext', 'String'),1638('longblob', 'Binary'),1639('mediumblob', 'Binary'),1640('blob', 'Binary'),1641('tinyblob', 'Binary'),1642('json', 'Object'),1643('enum', 'String'),1644('set', 'String'),1645('bit', 'Binary'),1646]16471648assert [(x, str(y)) for x, y in zip(out.columns, out.dtypes)] == dtypes16491650bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]16511652assert row['id'] == 0, row['id']1653assert row['tinyint'] == 80, row['tinyint']1654assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']1655assert row['bool'] == 0, row['bool']1656assert row['boolean'] == 1, row['boolean']1657assert row['smallint'] == -27897, row['smallint']1658assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']1659assert row['mediumint'] == 104729, row['mediumint']1660assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']1661assert row['int24'] == -200899, row['int24']1662assert row['unsigned_int24'] == 407709, row['unsigned_int24']1663assert row['int'] == -1295369311, row['int']1664assert row['unsigned_int'] == 3872362332, row['unsigned_int']1665assert row['integer'] == -1741727421, row['integer']1666assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']1667assert row['bigint'] == -266883847, row['bigint']1668assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']1669assert row['float'] - -146487000.0 < 0.00001, row['float']1670assert row['double'] == -474646154.719356, row['double']1671assert row['real'] == -901409776.279346, row['real']1672assert row['decimal'] == decimal.Decimal(1673'28111097.610822',1674), row['decimal']1675assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']1676assert row['fixed'] == decimal.Decimal(1677'-143773416.044092',1678), row['fixed']1679assert row['numeric'] == decimal.Decimal(1680'866689461.300046',1681), row['numeric']1682assert row['date'] == datetime.date(8524, 11, 10), row['date']1683assert row['time'] == datetime.timedelta(minutes=7), row['time']1684assert row['datetime'] == datetime.datetime(16859948, 3, 11, 15, 29, 22,1686), row['datetime']1687assert row['datetime_6'] == datetime.datetime(16881756, 10, 29, 2, 2, 42, 8,1689), row['datetime_6']1690assert row['timestamp'] == datetime.datetime(16911980, 12, 31, 1, 10, 23,1692), row['timestamp']1693assert row['timestamp_6'] == datetime.datetime(16941991, 1, 2, 22, 15, 10, 6,1695), row['timestamp_6']1696assert row['year'] == 1923, row['year']1697assert row['char_100'] == \1698'This is a test of a 100 character column.', row['char_100']1699assert row['binary_100'] == bytearray(1700bits + [0] * 84,1701), row['binary_100']1702assert row['varchar_200'] == \1703'This is a test of a variable character column.', row['varchar_200']1704assert row['varbinary_200'] == bytearray(1705bits * 2,1706), row['varbinary_200']1707assert row['longtext'] == 'This is a longtext column.', row['longtext']1708assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']1709assert row['text'] == 'This is a text column.', row['text']1710assert row['tinytext'] == 'This is a tinytext column.'1711assert row['longblob'] == bytearray(bits * 3), row['longblob']1712assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1713assert row['blob'] == bytearray(bits), row['blob']1714assert row['tinyblob'] == bytearray(1715[10, 11, 12, 13, 14, 15],1716), row['tinyblob']1717assert row['json'] == {1718'a': 10, 'b': 2.75,1719'c': 'hello world',1720}, row['json']1721assert row['enum'] == 'one', row['enum']1722assert row['set'] == 'two', row['set']1723assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']17241725conn.close()17261727def test_alltypes_min_max_polars(self):1728if self.conn.driver in ['http', 'https']:1729self.skipTest('Data API does not surface unsigned int information')17301731conn = s2.connect(database=type(self).dbname, results_type='polars')1732cur = conn.cursor()17331734cur.execute('select * from alltypes_no_nulls')1735cur.fetchall()17361737cur.execute('select * from alltypes')1738cur.fetchall()17391740conn.close()17411742def test_alltypes_nulls_polars(self):1743conn = s2.connect(database=type(self).dbname, results_type='polars')1744cur = conn.cursor()17451746cur.execute('select * from alltypes where id = 1')1747names = [x[0] for x in cur.description]1748out = cur.fetchone()1749row = dict(zip(names, out.row(0)))17501751assert row['id'] == 1, row['id']1752assert row['tinyint'] is None, row['tinyint']1753assert row['bool'] is None, row['bool']1754assert row['boolean'] is None, row['boolean']1755assert row['smallint'] is None, row['smallint']1756assert row['mediumint'] is None, row['mediumint']1757assert row['int24'] is None, row['int24']1758assert row['int'] is None, row['int']1759assert row['integer'] is None, row['integer']1760assert row['bigint'] is None, row['bigint']1761assert row['float'] is None, row['float']1762assert row['double'] is None, row['double']1763assert row['real'] is None, row['real']1764assert row['decimal'] is None, row['decimal']1765assert row['dec'] is None, row['dec']1766assert row['fixed'] is None, row['fixed']1767assert row['numeric'] is None, row['numeric']1768assert row['date'] is None, row['date']1769assert row['time'] is None, row['time']1770assert row['time'] is None, row['time']1771assert row['datetime'] is None, row['datetime']1772assert row['datetime_6'] is None, row['datetime_6']1773assert row['timestamp'] is None, row['timestamp']1774assert row['timestamp_6'] is None, row['timestamp_6']1775assert row['year'] is None, row['year']1776assert row['char_100'] is None, row['char_100']1777assert row['binary_100'] is None, row['binary_100']1778assert row['varchar_200'] is None, row['varchar_200']1779assert row['varbinary_200'] is None, row['varbinary_200']1780assert row['longtext'] is None, row['longtext']1781assert row['mediumtext'] is None, row['mediumtext']1782assert row['text'] is None, row['text']1783assert row['tinytext'] is None, row['tinytext']1784assert row['longblob'] is None, row['longblob']1785assert row['mediumblob'] is None, row['mediumblob']1786assert row['blob'] is None, row['blob']1787assert row['tinyblob'] is None, row['tinyblob']1788assert row['json'] is None, row['json']1789assert row['enum'] is None, row['enum']1790assert row['set'] is None, row['set']1791assert row['bit'] is None, row['bit']17921793conn.close()17941795def test_alltypes_arrow(self):1796if self.conn.driver in ['http', 'https']:1797self.skipTest('Data API does not surface unsigned int information')17981799conn = s2.connect(database=type(self).dbname, results_type='arrow')1800cur = conn.cursor()18011802cur.execute('select * from alltypes where id = 0')1803out = cur.fetchone()1804row = out.to_pylist()[0]18051806dtypes = [1807('id', 'int32'),1808('tinyint', 'int8'),1809('unsigned_tinyint', 'uint8'),1810('bool', 'int8'),1811('boolean', 'int8'),1812('smallint', 'int16'),1813('unsigned_smallint', 'uint16'),1814('mediumint', 'int32'),1815('unsigned_mediumint', 'uint32'),1816('int24', 'int32'),1817('unsigned_int24', 'uint32'),1818('int', 'int32'),1819('unsigned_int', 'uint32'),1820('integer', 'int32'),1821('unsigned_integer', 'uint32'),1822('bigint', 'int64'),1823('unsigned_bigint', 'uint64'),1824('float', 'float'),1825('double', 'double'),1826('real', 'double'),1827('decimal', 'decimal128(20, 6)'),1828('dec', 'decimal128(20, 6)'),1829('fixed', 'decimal128(20, 6)'),1830('numeric', 'decimal128(20, 6)'),1831('date', 'date64[ms]'),1832('time', 'duration[us]'),1833('time_6', 'duration[us]'),1834('datetime', 'timestamp[us]'),1835('datetime_6', 'timestamp[us]'),1836('timestamp', 'timestamp[us]'),1837('timestamp_6', 'timestamp[us]'),1838('year', 'int16'),1839('char_100', 'string'),1840('binary_100', 'binary'),1841('varchar_200', 'string'),1842('varbinary_200', 'binary'),1843('longtext', 'string'),1844('mediumtext', 'string'),1845('text', 'string'),1846('tinytext', 'string'),1847('longblob', 'binary'),1848('mediumblob', 'binary'),1849('blob', 'binary'),1850('tinyblob', 'binary'),1851('json', 'string'),1852('enum', 'string'),1853('set', 'string'),1854('bit', 'binary'),1855]18561857assert [(x.name, str(x.type)) for x in out.schema] == dtypes18581859bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]18601861assert row['id'] == 0, row['id']1862assert row['tinyint'] == 80, row['tinyint']1863assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']1864assert row['bool'] == 0, row['bool']1865assert row['boolean'] == 1, row['boolean']1866assert row['smallint'] == -27897, row['smallint']1867assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']1868assert row['mediumint'] == 104729, row['mediumint']1869assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']1870assert row['int24'] == -200899, row['int24']1871assert row['unsigned_int24'] == 407709, row['unsigned_int24']1872assert row['int'] == -1295369311, row['int']1873assert row['unsigned_int'] == 3872362332, row['unsigned_int']1874assert row['integer'] == -1741727421, row['integer']1875assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']1876assert row['bigint'] == -266883847, row['bigint']1877assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']1878assert row['float'] - -146487000.0 < 0.00001, row['float']1879assert row['double'] == -474646154.719356, row['double']1880assert row['real'] == -901409776.279346, row['real']1881assert row['decimal'] == decimal.Decimal(1882'28111097.610822',1883), row['decimal']1884assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']1885assert row['fixed'] == decimal.Decimal(1886'-143773416.044092',1887), row['fixed']1888assert row['numeric'] == decimal.Decimal(1889'866689461.300046',1890), row['numeric']1891assert row['date'] == datetime.date(8524, 11, 10), row['date']1892assert row['time'] == datetime.timedelta(minutes=7), row['time']1893assert row['datetime'] == datetime.datetime(18949948, 3, 11, 15, 29, 22,1895), row['datetime']1896assert row['datetime_6'] == datetime.datetime(18971756, 10, 29, 2, 2, 42, 8,1898), row['datetime_6']1899assert row['timestamp'] == datetime.datetime(19001980, 12, 31, 1, 10, 23,1901), row['timestamp']1902assert row['timestamp_6'] == datetime.datetime(19031991, 1, 2, 22, 15, 10, 6,1904), row['timestamp_6']1905assert row['year'] == 1923, row['year']1906assert row['char_100'] == \1907'This is a test of a 100 character column.', row['char_100']1908assert row['binary_100'] == bytearray(1909bits + [0] * 84,1910), row['binary_100']1911assert row['varchar_200'] == \1912'This is a test of a variable character column.', row['varchar_200']1913assert row['varbinary_200'] == bytearray(1914bits * 2,1915), row['varbinary_200']1916assert row['longtext'] == 'This is a longtext column.', row['longtext']1917assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']1918assert row['text'] == 'This is a text column.', row['text']1919assert row['tinytext'] == 'This is a tinytext column.'1920assert row['longblob'] == bytearray(bits * 3), row['longblob']1921assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']1922assert row['blob'] == bytearray(bits), row['blob']1923assert row['tinyblob'] == bytearray(1924[10, 11, 12, 13, 14, 15],1925), row['tinyblob']1926assert row['json'] == '{"a":10,"b":2.75,"c":"hello world"}', row['json']1927assert row['enum'] == 'one', row['enum']1928assert row['set'] == 'two', row['set']1929assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']19301931conn.close()19321933def test_alltypes_no_nulls_arrow(self):1934if self.conn.driver in ['http', 'https']:1935self.skipTest('Data API does not surface unsigned int information')19361937conn = s2.connect(database=type(self).dbname, results_type='arrow')1938cur = conn.cursor()19391940cur.execute('select * from alltypes_no_nulls where id = 0')1941out = cur.fetchone()19421943row = out.to_pylist()[0]19441945dtypes = [1946('id', 'int32'),1947('tinyint', 'int8'),1948('unsigned_tinyint', 'uint8'),1949('bool', 'int8'),1950('boolean', 'int8'),1951('smallint', 'int16'),1952('unsigned_smallint', 'uint16'),1953('mediumint', 'int32'),1954('unsigned_mediumint', 'uint32'),1955('int24', 'int32'),1956('unsigned_int24', 'uint32'),1957('int', 'int32'),1958('unsigned_int', 'uint32'),1959('integer', 'int32'),1960('unsigned_integer', 'uint32'),1961('bigint', 'int64'),1962('unsigned_bigint', 'uint64'),1963('float', 'float'),1964('double', 'double'),1965('real', 'double'),1966('decimal', 'decimal128(20, 6)'),1967('dec', 'decimal128(20, 6)'),1968('fixed', 'decimal128(20, 6)'),1969('numeric', 'decimal128(20, 6)'),1970('date', 'date64[ms]'),1971('time', 'duration[us]'),1972('time_6', 'duration[us]'),1973('datetime', 'timestamp[us]'),1974('datetime_6', 'timestamp[us]'),1975('timestamp', 'timestamp[us]'),1976('timestamp_6', 'timestamp[us]'),1977('year', 'int16'),1978('char_100', 'string'),1979('binary_100', 'binary'),1980('varchar_200', 'string'),1981('varbinary_200', 'binary'),1982('longtext', 'string'),1983('mediumtext', 'string'),1984('text', 'string'),1985('tinytext', 'string'),1986('longblob', 'binary'),1987('mediumblob', 'binary'),1988('blob', 'binary'),1989('tinyblob', 'binary'),1990('json', 'string'),1991('enum', 'string'),1992('set', 'string'),1993('bit', 'binary'),1994]19951996assert [(x.name, str(x.type)) for x in out.schema] == dtypes19971998bits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]19992000assert row['id'] == 0, row['id']2001assert row['tinyint'] == 80, row['tinyint']2002assert row['unsigned_tinyint'] == 85, row['unsigned_tinyint']2003assert row['bool'] == 0, row['bool']2004assert row['boolean'] == 1, row['boolean']2005assert row['smallint'] == -27897, row['smallint']2006assert row['unsigned_smallint'] == 27897, row['unsigned_smallint']2007assert row['mediumint'] == 104729, row['mediumint']2008assert row['unsigned_mediumint'] == 120999, row['unsigned_mediumint']2009assert row['int24'] == -200899, row['int24']2010assert row['unsigned_int24'] == 407709, row['unsigned_int24']2011assert row['int'] == -1295369311, row['int']2012assert row['unsigned_int'] == 3872362332, row['unsigned_int']2013assert row['integer'] == -1741727421, row['integer']2014assert row['unsigned_integer'] == 3198387363, row['unsigned_integer']2015assert row['bigint'] == -266883847, row['bigint']2016assert row['unsigned_bigint'] == 980007287362, row['unsigned_bigint']2017assert row['float'] - -146487000.0 < 0.00001, row['float']2018assert row['double'] == -474646154.719356, row['double']2019assert row['real'] == -901409776.279346, row['real']2020assert row['decimal'] == decimal.Decimal(2021'28111097.610822',2022), row['decimal']2023assert row['dec'] == decimal.Decimal('389451155.931428'), row['dec']2024assert row['fixed'] == decimal.Decimal(2025'-143773416.044092',2026), row['fixed']2027assert row['numeric'] == decimal.Decimal(2028'866689461.300046',2029), row['numeric']2030assert row['date'] == datetime.date(8524, 11, 10), row['date']2031assert row['time'] == datetime.timedelta(minutes=7), row['time']2032assert row['datetime'] == datetime.datetime(20339948, 3, 11, 15, 29, 22,2034), row['datetime']2035assert row['datetime_6'] == datetime.datetime(20361756, 10, 29, 2, 2, 42, 8,2037), row['datetime_6']2038assert row['timestamp'] == datetime.datetime(20391980, 12, 31, 1, 10, 23,2040), row['timestamp']2041assert row['timestamp_6'] == datetime.datetime(20421991, 1, 2, 22, 15, 10, 6,2043), row['timestamp_6']2044assert row['year'] == 1923, row['year']2045assert row['char_100'] == \2046'This is a test of a 100 character column.', row['char_100']2047assert row['binary_100'] == bytearray(2048bits + [0] * 84,2049), row['binary_100']2050assert row['varchar_200'] == \2051'This is a test of a variable character column.', row['varchar_200']2052assert row['varbinary_200'] == bytearray(2053bits * 2,2054), row['varbinary_200']2055assert row['longtext'] == 'This is a longtext column.', row['longtext']2056assert row['mediumtext'] == 'This is a mediumtext column.', row['mediumtext']2057assert row['text'] == 'This is a text column.', row['text']2058assert row['tinytext'] == 'This is a tinytext column.'2059assert row['longblob'] == bytearray(bits * 3), row['longblob']2060assert row['mediumblob'] == bytearray(bits * 2), row['mediumblob']2061assert row['blob'] == bytearray(bits), row['blob']2062assert row['tinyblob'] == bytearray(2063[10, 11, 12, 13, 14, 15],2064), row['tinyblob']2065assert row['json'] == '{"a":10,"b":2.75,"c":"hello world"}', row['json']2066assert row['enum'] == 'one', row['enum']2067assert row['set'] == 'two', row['set']2068assert row['bit'] == b'\x00\x00\x00\x00\x00\x00\x00\x80', row['bit']20692070conn.close()20712072def test_alltypes_min_max_arrow(self):2073if self.conn.driver in ['http', 'https']:2074self.skipTest('Data API does not surface unsigned int information')20752076conn = s2.connect(database=type(self).dbname, results_type='arrow')2077cur = conn.cursor()20782079cur.execute('select * from alltypes_no_nulls')2080cur.fetchall()20812082cur.execute('select * from alltypes')2083cur.fetchall()20842085conn.close()20862087def test_alltypes_nulls_arrow(self):2088conn = s2.connect(database=type(self).dbname, results_type='arrow')2089cur = conn.cursor()20902091cur.execute('select * from alltypes where id = 1')2092out = cur.fetchone()2093row = out.to_pylist()[0]20942095assert row['id'] == 1, row['id']2096assert row['tinyint'] is None, row['tinyint']2097assert row['bool'] is None, row['bool']2098assert row['boolean'] is None, row['boolean']2099assert row['smallint'] is None, row['smallint']2100assert row['mediumint'] is None, row['mediumint']2101assert row['int24'] is None, row['int24']2102assert row['int'] is None, row['int']2103assert row['integer'] is None, row['integer']2104assert row['bigint'] is None, row['bigint']2105assert row['float'] is None, row['float']2106assert row['double'] is None, row['double']2107assert row['real'] is None, row['real']2108assert row['decimal'] is None, row['decimal']2109assert row['dec'] is None, row['dec']2110assert row['fixed'] is None, row['fixed']2111assert row['numeric'] is None, row['numeric']2112assert row['date'] is None, row['date']2113assert row['time'] is None, row['time']2114assert row['time'] is None, row['time']2115assert row['datetime'] is None, row['datetime']2116assert row['datetime_6'] is None, row['datetime_6']2117assert row['timestamp'] is None, row['timestamp']2118assert row['timestamp_6'] is None, row['timestamp_6']2119assert row['year'] is None, row['year']2120assert row['char_100'] is None, row['char_100']2121assert row['binary_100'] is None, row['binary_100']2122assert row['varchar_200'] is None, row['varchar_200']2123assert row['varbinary_200'] is None, row['varbinary_200']2124assert row['longtext'] is None, row['longtext']2125assert row['mediumtext'] is None, row['mediumtext']2126assert row['text'] is None, row['text']2127assert row['tinytext'] is None, row['tinytext']2128assert row['longblob'] is None, row['longblob']2129assert row['mediumblob'] is None, row['mediumblob']2130assert row['blob'] is None, row['blob']2131assert row['tinyblob'] is None, row['tinyblob']2132assert row['json'] is None, row['json']2133assert row['enum'] is None, row['enum']2134assert row['set'] is None, row['set']2135assert row['bit'] is None, row['bit']21362137conn.close()21382139def test_alltypes_nulls(self):2140self.cur.execute('select * from alltypes where id = 1')2141names = [x[0] for x in self.cur.description]2142types = [x[1] for x in self.cur.description]2143out = self.cur.fetchone()2144row = dict(zip(names, out))2145typ = dict(zip(names, types))21462147def otype(x):2148return x21492150assert row['id'] == 1, row['id']2151assert typ['id'] == otype(3), typ['id']21522153assert row['tinyint'] is None, row['tinyint']2154assert typ['tinyint'] == otype(1), typ['tinyint']21552156assert row['bool'] is None, row['bool']2157assert typ['bool'] == otype(1), typ['bool']21582159assert row['boolean'] is None, row['boolean']2160assert typ['boolean'] == otype(1), typ['boolean']21612162assert row['smallint'] is None, row['smallint']2163assert typ['smallint'] == otype(2), typ['smallint']21642165assert row['mediumint'] is None, row['mediumint']2166assert typ['mediumint'] == otype(9), typ['mediumint']21672168assert row['int24'] is None, row['int24']2169assert typ['int24'] == otype(9), typ['int24']21702171assert row['int'] is None, row['int']2172assert typ['int'] == otype(3), typ['int']21732174assert row['integer'] is None, row['integer']2175assert typ['integer'] == otype(3), typ['integer']21762177assert row['bigint'] is None, row['bigint']2178assert typ['bigint'] == otype(8), typ['bigint']21792180assert row['float'] is None, row['float']2181assert typ['float'] == otype(4), typ['float']21822183assert row['double'] is None, row['double']2184assert typ['double'] == otype(5), typ['double']21852186assert row['real'] is None, row['real']2187assert typ['real'] == otype(5), typ['real']21882189assert row['decimal'] is None, row['decimal']2190assert typ['decimal'] == otype(246), typ['decimal']21912192assert row['dec'] is None, row['dec']2193assert typ['dec'] == otype(246), typ['dec']21942195assert row['fixed'] is None, row['fixed']2196assert typ['fixed'] == otype(246), typ['fixed']21972198assert row['numeric'] is None, row['numeric']2199assert typ['numeric'] == otype(246), typ['numeric']22002201assert row['date'] is None, row['date']2202assert typ['date'] == 10, typ['date']22032204assert row['time'] is None, row['time']2205assert typ['time'] == 11, typ['time']22062207assert row['time'] is None, row['time']2208assert typ['time_6'] == 11, typ['time_6']22092210assert row['datetime'] is None, row['datetime']2211assert typ['datetime'] == 12, typ['datetime']22122213assert row['datetime_6'] is None, row['datetime_6']2214assert typ['datetime'] == 12, typ['datetime']22152216assert row['timestamp'] is None, row['timestamp']2217assert typ['timestamp'] == otype(7), typ['timestamp']22182219assert row['timestamp_6'] is None, row['timestamp_6']2220assert typ['timestamp_6'] == otype(7), typ['timestamp_6']22212222assert row['year'] is None, row['year']2223assert typ['year'] == otype(13), typ['year']22242225assert row['char_100'] is None, row['char_100']2226assert typ['char_100'] == otype(254), typ['char_100']22272228assert row['binary_100'] is None, row['binary_100']2229assert typ['binary_100'] == otype(254), typ['binary_100']22302231assert row['varchar_200'] is None, typ['varchar_200']2232assert typ['varchar_200'] == otype(2233253,2234), typ['varchar_200'] # why not 15?22352236assert row['varbinary_200'] is None, row['varbinary_200']2237assert typ['varbinary_200'] == otype(2238253,2239), typ['varbinary_200'] # why not 15?22402241assert row['longtext'] is None, row['longtext']2242assert typ['longtext'] == otype(251), typ['longtext']22432244assert row['mediumtext'] is None, row['mediumtext']2245assert typ['mediumtext'] == otype(250), typ['mediumtext']22462247assert row['text'] is None, row['text']2248assert typ['text'] == otype(252), typ['text']22492250assert row['tinytext'] is None, row['tinytext']2251assert typ['tinytext'] == otype(249), typ['tinytext']22522253assert row['longblob'] is None, row['longblob']2254assert typ['longblob'] == otype(251), typ['longblob']22552256assert row['mediumblob'] is None, row['mediumblob']2257assert typ['mediumblob'] == otype(250), typ['mediumblob']22582259assert row['blob'] is None, row['blob']2260assert typ['blob'] == otype(252), typ['blob']22612262assert row['tinyblob'] is None, row['tinyblob']2263assert typ['tinyblob'] == otype(249), typ['tinyblob']22642265assert row['json'] is None, row['json']2266assert typ['json'] == otype(245), typ['json']22672268assert row['enum'] is None, row['enum']2269assert typ['enum'] == otype(253), typ['enum'] # mysql code: 24722702271assert row['set'] is None, row['set']2272assert typ['set'] == otype(253), typ['set'] # mysql code: 24822732274assert row['bit'] is None, row['bit']2275assert typ['bit'] == otype(16), typ['bit']22762277def test_name_check(self):2278nc = sc._name_check2279assert nc('foo') == 'foo'2280assert nc('Foo') == 'Foo'2281assert nc('Foo_Bar') == 'Foo_Bar'2282assert nc('Foo_Bar2') == 'Foo_Bar2'22832284with self.assertRaises(ValueError):2285assert nc('foo.bar')22862287with self.assertRaises(ValueError):2288assert nc('2foo')22892290with self.assertRaises(ValueError):2291assert nc('')22922293def test_echo(self):2294self.cur.execute('echo return_int()')22952296out = self.cur.fetchall()2297assert list(out) == [(1234567890,)], out22982299out = self.cur.nextset()2300assert out is None, out23012302def test_echo_with_result_set(self):2303self.cur.execute('echo result_set_and_return_int()')23042305out = self.cur.fetchall()2306assert list(out) == [(5,)], out23072308out = self.cur.nextset()2309assert out is True, out23102311out = self.cur.fetchall()2312assert list(out) == [(1, 2, 3)], out23132314out = self.cur.nextset()2315assert out is True, out23162317out = self.cur.fetchall()2318assert list(out) == [(1234567890,)], out23192320out = self.cur.nextset()2321assert out is None, out23222323def test_callproc(self):2324self.cur.callproc('get_animal', ['cats'])23252326out = self.cur.fetchall()2327assert list(out) == [(5,)], out23282329out = self.cur.nextset()2330assert out is True, out23312332out = self.cur.fetchall()2333assert list(out) == [(1, 2, 3)], out23342335out = self.cur.nextset()2336assert out is True, out23372338# Always get an empty set at the end2339out = self.cur.fetchall()2340assert list(out) == [], out23412342out = self.cur.nextset()2343assert out is None, out23442345def test_callproc_no_args(self):2346self.cur.callproc('no_args')23472348out = self.cur.fetchall()2349assert list(out) == [(4, 5, 6)], out23502351out = self.cur.nextset()2352assert out is True, out23532354# Always get an empty set at the end2355out = self.cur.fetchall()2356assert list(out) == [], out23572358out = self.cur.nextset()2359assert out is None, out23602361def test_callproc_return_int(self):2362self.cur.callproc('result_set_and_return_int')23632364out = self.cur.fetchall()2365assert list(out) == [(5,)], out23662367out = self.cur.nextset()2368assert out is True, out23692370out = self.cur.fetchall()2371assert list(out) == [(1, 2, 3)], out23722373out = self.cur.nextset()2374assert out is True, out23752376# Always get an empty set at the end2377out = self.cur.fetchall()2378assert list(out) == [], out23792380out = self.cur.nextset()2381assert out is None, out23822383def test_callproc_bad_args(self):2384self.cur.callproc('get_animal', [10])23852386out = self.cur.fetchall()2387assert list(out) == [], out23882389out = self.cur.nextset()2390assert out is True, out23912392out = self.cur.fetchall()2393assert list(out) == [(1, 2, 3)], out23942395out = self.cur.nextset()2396assert out is True, out23972398# Always get an empty set at the end2399out = self.cur.fetchall()2400assert list(out) == [], out24012402out = self.cur.nextset()2403assert out is None, out24042405def test_callproc_too_many_args(self):2406with self.assertRaises((2407s2.ProgrammingError,2408s2.OperationalError,2409s2.InternalError,2410TypeError,2411)):2412self.cur.callproc('get_animal', ['cats', 'dogs'])24132414with self.assertRaises((2415s2.ProgrammingError,2416s2.OperationalError,2417s2.InternalError,2418TypeError,2419)):2420self.cur.callproc('get_animal', [])24212422with self.assertRaises((2423s2.ProgrammingError,2424s2.OperationalError,2425s2.InternalError,2426TypeError,2427)):2428self.cur.callproc('get_animal')24292430def test_cursor_close(self):2431self.cur.close()24322433self.cur.close()24342435with self.assertRaises(s2.ProgrammingError):2436self.cur.callproc('foo')24372438with self.assertRaises(s2.ProgrammingError):2439self.cur.execute('select 1')24402441# with self.assertRaises(s2.ProgrammingError):2442# self.cur.executemany('select 1')24432444with self.assertRaises(s2.ProgrammingError):2445self.cur.fetchone()24462447with self.assertRaises(s2.ProgrammingError):2448self.cur.fetchall()24492450with self.assertRaises(s2.ProgrammingError):2451self.cur.fetchmany()24522453with self.assertRaises(s2.ProgrammingError):2454self.cur.nextset()24552456# with self.assertRaises(s2.ProgrammingError):2457# self.cur.setinputsizes([])24582459# with self.assertRaises(s2.ProgrammingError):2460# self.cur.setoutputsize(10)24612462with self.assertRaises(s2.ProgrammingError):2463self.cur.scroll(2)24642465with self.assertRaises(s2.InterfaceError):2466self.cur.next()24672468# The following attributes are still accessible after close.24692470assert isinstance(self.cur.messages, list), self.cur.messages24712472assert isinstance(self.cur.rowcount, (int, type(None))), self.cur.rowcount24732474assert isinstance(self.cur.lastrowid, (int, type(None))), self.cur.lastrowid24752476def test_setinputsizes(self):2477self.cur.setinputsizes([10, 20, 30])24782479def test_setoutputsize(self):2480self.cur.setoutputsize(100)24812482def test_scroll(self):2483self.cur.execute('select * from data order by name')24842485out = self.cur.fetchone()2486assert out[1] == 'antelopes', out[1]2487assert self.cur.rownumber == 1, self.cur.rownumber24882489self.cur.scroll(3)24902491out = self.cur.fetchone()2492assert out[1] == 'elephants', out[1]2493assert self.cur.rownumber == 5, self.cur.rownumber24942495try:2496self.cur.scroll(0, mode='absolute')2497assert self.cur.rownumber == 0, self.cur.rownumber24982499out = self.cur.fetchone()2500assert out[1] == 'antelopes', out[1]2501assert self.cur.rownumber == 1, self.cur.rownumber2502except s2.NotSupportedError:2503pass25042505with self.assertRaises((ValueError, s2.ProgrammingError)):2506self.cur.scroll(0, mode='badmode')25072508def test_autocommit(self):2509if self.conn.driver in ['http', 'https']:2510self.skipTest('Can not set autocommit in HTTP')25112512orig = self.conn.locals.autocommit25132514self.conn.autocommit(True)2515val = self.conn.locals.autocommit2516assert val is True, val25172518self.conn.autocommit(False)2519val = self.conn.locals.autocommit2520assert val is False, val25212522self.conn.locals.autocommit = orig25232524def test_conn_close(self):2525self.conn.close()25262527with self.assertRaises(s2.Error):2528self.conn.close()25292530with self.assertRaises(s2.InterfaceError):2531self.conn.autocommit(False)25322533with self.assertRaises(s2.InterfaceError):2534self.conn.commit()25352536with self.assertRaises(s2.InterfaceError):2537self.conn.rollback()25382539# with self.assertRaises(s2.InterfaceError):2540# self.conn.cursor()25412542# with self.assertRaises(s2.InterfaceError):2543# self.conn.messages25442545with self.assertRaises(s2.InterfaceError):2546self.conn.globals.autocommit = True25472548with self.assertRaises(s2.InterfaceError):2549self.conn.globals.autocommit25502551with self.assertRaises(s2.InterfaceError):2552self.conn.locals.autocommit = True25532554with self.assertRaises(s2.InterfaceError):2555self.conn.locals.autocommit25562557with self.assertRaises(s2.InterfaceError):2558self.conn.enable_data_api()25592560with self.assertRaises(s2.InterfaceError):2561self.conn.disable_data_api()25622563def test_rollback(self):2564if self.conn.driver in ['http', 'https']:2565self.skipTest('Can not set autocommit in HTTP')25662567self.conn.autocommit(False)25682569self.cur.execute('select * from data')2570out = self.cur.fetchall()2571assert len(out) == 5, len(out)25722573self.cur.execute("INSERT INTO data SET id='f', name='frogs', value=3")25742575self.cur.execute('select * from data')2576out = self.cur.fetchall()2577assert len(out) == 6, len(out)25782579self.conn.rollback()25802581self.cur.execute('select * from data')2582out = self.cur.fetchall()2583assert len(out) == 5, len(out)25842585def test_commit(self):2586if self.conn.driver in ['http', 'https']:2587self.skipTest('Can not set autocommit in HTTP')25882589self.conn.autocommit(False)25902591self.cur.execute('select * from data')2592out = self.cur.fetchall()2593assert len(out) == 5, len(out)25942595self.cur.execute("INSERT INTO data SET id='f', name='frogs', value=3")25962597self.cur.execute('select * from data')2598out = self.cur.fetchall()2599assert len(out) == 6, len(out)26002601self.conn.commit()26022603self.cur.execute('select * from data')2604out = self.cur.fetchall()2605assert len(out) == 6, len(out)26062607self.cur.execute("delete from data where id='f'")26082609self.cur.execute('select * from data')2610out = self.cur.fetchall()2611assert len(out) == 5, len(out)26122613self.conn.commit()26142615self.cur.execute('select * from data')2616out = self.cur.fetchall()2617assert len(out) == 5, len(out)26182619def test_global_var(self):2620orig = self.conn.globals.enable_external_functions26212622self.conn.globals.enable_external_functions = True2623val = self.conn.globals.enable_external_functions2624assert val is True, val26252626self.conn.globals.enable_external_functions = False2627val = self.conn.globals.enable_external_functions2628assert val is False, val26292630self.conn.globals.enable_external_functions = orig2631val = self.conn.globals.enable_external_functions2632assert val == orig, val26332634def test_session_var(self):2635if self.conn.driver in ['http', 'https']:2636self.skipTest('Can not change session variable in HTTP')26372638orig = self.conn.locals.enable_multipartition_queries26392640self.conn.locals.enable_multipartition_queries = True2641val = self.conn.locals.enable_multipartition_queries2642assert val is True, val26432644self.conn.locals.enable_multipartition_queries = False2645val = self.conn.locals.enable_multipartition_queries2646assert val is False, val26472648self.conn.locals.enable_multipartition_queries = orig2649val = self.conn.locals.enable_multipartition_queries2650assert val == orig, val26512652def test_local_infile(self):2653if self.conn.driver in ['http', 'https']:2654self.skipTest('Can not load local files in HTTP')26552656path = os.path.join(os.path.dirname(__file__), 'local_infile.csv')2657tblname = ('TEST_' + str(uuid.uuid4())).replace('-', '_')26582659self.cur.execute(f'''2660create table `{tblname}` (2661first_name char(20) not null,2662last_name char(30) not null,2663age int not null2664) collate="utf8_unicode_ci";2665''')26662667try:2668self.cur.execute(2669f'load data local infile %s into table {tblname} '2670'fields terminated by "," lines terminated by "\n";', [path],2671)26722673self.cur.execute(f'select * from {tblname} order by first_name')2674out = list(self.cur)2675assert out == [2676('John', 'Doe', 34),2677('Patty', 'Jones', 57),2678('Sandy', 'Smith', 24),2679], out26802681finally:2682self.cur.execute(f'drop table {tblname};')26832684def test_converters(self):2685def upper(x):2686if isinstance(x, str):2687return x.upper()2688return x26892690convs = {269115: upper,2692249: upper,2693250: upper,2694251: upper,2695252: upper,2696253: upper,2697254: upper,2698}26992700with s2.connect(database=type(self).dbname, conv=convs) as conn:2701with conn.cursor() as cur:2702cur.execute('select * from alltypes where id = 0')2703names = [x[0] for x in cur.description]2704out = cur.fetchone()2705row = dict(zip(names, out))2706assert row['longtext'] == 'THIS IS A LONGTEXT COLUMN.', \2707row['longtext']2708assert row['mediumtext'] == 'THIS IS A MEDIUMTEXT COLUMN.', \2709row['mediumtext']2710assert row['text'] == 'THIS IS A TEXT COLUMN.', \2711row['text']2712assert row['tinytext'] == 'THIS IS A TINYTEXT COLUMN.', \2713row['tinytext']27142715with s2.connect(database=type(self).dbname) as conn:2716with conn.cursor() as cur:2717cur.execute('select * from alltypes where id = 0')2718names = [x[0] for x in cur.description]2719out = cur.fetchone()2720row = dict(zip(names, out))2721assert row['longtext'] == 'This is a longtext column.', \2722row['longtext']2723assert row['mediumtext'] == 'This is a mediumtext column.', \2724row['mediumtext']2725assert row['text'] == 'This is a text column.', \2726row['text']2727assert row['tinytext'] == 'This is a tinytext column.', \2728row['tinytext']27292730def test_results_type(self):2731columns = [2732'id', 'tinyint', 'unsigned_tinyint', 'bool', 'boolean',2733'smallint', 'unsigned_smallint', 'mediumint', 'unsigned_mediumint',2734'int24', 'unsigned_int24', 'int', 'unsigned_int',2735'integer', 'unsigned_integer', 'bigint', 'unsigned_bigint',2736'float', 'double', 'real', 'decimal', 'dec', 'fixed', 'numeric',2737'date', 'time', 'time_6', 'datetime', 'datetime_6', 'timestamp',2738'timestamp_6', 'year', 'char_100', 'binary_100', 'varchar_200',2739'varbinary_200', 'longtext', 'mediumtext', 'text', 'tinytext',2740'longblob', 'mediumblob', 'blob', 'tinyblob', 'json', 'enum',2741'set', 'bit',2742]27432744with s2.connect(database=type(self).dbname, results_type='tuples') as conn:2745with conn.cursor() as cur:2746cur.execute('select * from alltypes')2747out = cur.fetchall()2748assert type(out[0]) is tuple, type(out[0])2749assert len(out[0]) == len(columns), len(out[0])27502751with s2.connect(database=type(self).dbname, results_type='namedtuples') as conn:2752with conn.cursor() as cur:2753cur.execute('select * from alltypes')2754out = cur.fetchall()2755assert type(out[0]).__name__ == 'Row', type(out)2756for i, name in enumerate(columns):2757assert hasattr(out[0], name)2758assert out[0][i] == getattr(out[0], name)27592760with s2.connect(database=type(self).dbname, results_type='dicts') as conn:2761with conn.cursor() as cur:2762cur.execute('select * from alltypes')2763out = cur.fetchall()2764assert type(out[0]) is dict, type(out)2765assert list(out[0].keys()) == columns, out[0].keys()27662767def test_results_format(self):2768with self.assertWarns(DeprecationWarning):2769with s2.connect(database=type(self).dbname, results_format='dicts') as conn:2770with conn.cursor() as cur:2771cur.execute('select * from alltypes')2772out = cur.fetchall()2773assert type(out[0]) is dict, type(out)27742775def test_multi_statements(self):2776if self.conn.driver not in ['http', 'https']:2777with s2.connect(database=type(self).dbname, multi_statements=True) as conn:2778with conn.cursor() as cur:2779cur.execute('SELECT 1; SELECT 2;')2780self.assertEqual([(1,)], list(cur))27812782r = cur.nextset()2783self.assertTrue(r)27842785self.assertEqual([(2,)], list(cur))2786self.assertIsNone(cur.nextset())27872788def test_client_found_rows(self):2789if self.conn.driver not in ['http', 'https']:2790with s2.connect(database=type(self).dbname, client_found_rows=False) as conn:2791with conn.cursor() as cur:2792tag = str(uuid.uuid4()).replace('-', '_')2793table_name = f'test_client_found_rows_{tag}'2794cur.execute(f"CREATE TABLE {table_name} (id BIGINT \2795PRIMARY KEY, s TEXT DEFAULT 'def');")2796cur.execute(f'INSERT INTO {table_name} (id) \2797VALUES (1), (2), (3);')2798cur.execute(f"UPDATE {table_name} SET s = 'def' \2799WHERE id = 1;")2800# UPDATE statement above is not changing any rows,2801# so affected_rows is 0 if client_found_rows is False (default)2802self.assertEqual(0, conn.affected_rows())2803cur.execute(f'DROP TABLE {table_name};')28042805with s2.connect(database=type(self).dbname, client_found_rows=True) as conn:2806with conn.cursor() as cur:2807tag = str(uuid.uuid4()).replace('-', '_')2808table_name = f'test_client_found_rows_{tag}'2809cur.execute(f"CREATE TABLE {table_name} (id BIGINT \2810PRIMARY KEY, s TEXT DEFAULT 'def');")2811cur.execute(f'INSERT INTO {table_name} (id) \2812VALUES (1), (2), (3);')2813cur.execute(f"UPDATE {table_name} SET s = 'def' \2814WHERE id = 1;")2815# UPDATE statement above is not changing any rows,2816# but affected_rows is 1 as 1 row is subject to update, and2817# this is what affected_rows return when client_found_rows is True2818self.assertEqual(1, conn.affected_rows())2819cur.execute(f'DROP TABLE {table_name};')28202821def test_connect_timeout(self):2822with s2.connect(database=type(self).dbname, connect_timeout=8) as conn:2823with conn.cursor() as cur:2824cur.execute('SELECT 1')2825self.assertEqual([(1,)], list(cur))28262827def test_show_accessors(self):2828out = self.conn.show.columns('data')2829assert out.columns == [2830'Name', 'Type', 'Null',2831'Key', 'Default', 'Extra',2832], out.columns2833assert out.Name == ['id', 'name', 'value'], out.Name2834assert out.Type == ['varchar(255)', 'varchar(255)', 'bigint(20)'], out.Type2835assert str(out).count('varchar(255)') == 2, out28362837html = out._repr_html_()2838assert html.count('varchar(255)') == 22839assert html.count('bigint(20)') == 12840assert '<table' in html28412842out = self.conn.show.tables()2843assert out.columns == ['Name'], out.columns2844assert 'data' in out.Name, out.Name2845assert 'alltypes' in out.Name, out.Name28462847out = self.conn.show.warnings()28482849out = self.conn.show.errors()28502851out = self.conn.show.databases()2852assert out.columns == ['Name'], out.columns2853assert 'information_schema' in out.Name28542855out = self.conn.show.database_status()2856assert out.columns == ['Name', 'Value'], out.columns2857assert 'database' in out.Name28582859out = self.conn.show.global_status()2860assert out.columns == ['Name', 'Value'], out.columns28612862out = self.conn.show.indexes('data')2863assert 'Name' in out.columns, out.columns2864assert 'KeyName' in out.columns, out.columns2865assert out.Name == ['data'], out.Name28662867out = self.conn.show.functions()28682869out = self.conn.show.partitions()2870assert 'Name' in out.columns, out.columns2871assert 'Role' in out.columns, out.columns28722873out = self.conn.show.pipelines()28742875# out = self.conn.show.plan(1)28762877# out = self.conn.show.plancache()28782879out = self.conn.show.processlist()2880assert 'Name' in out.columns, out.columns2881assert 'Command' in out.columns, out.columns28822883# out = self.conn.show.reproduction()28842885out = self.conn.show.schemas()2886assert out.columns == ['Name'], out.columns2887assert 'information_schema' in out.Name28882889out = self.conn.show.session_status()2890assert out.columns == ['Name', 'Value']28912892out = self.conn.show.status()2893assert out.columns == ['Name', 'Value']28942895out = self.conn.show.table_status()2896assert 'Name' in out.columns, out.columns2897assert 'alltypes' in out.Name, out.Name2898assert 'data' in out.Name, out.Name28992900out = self.conn.show.procedures()29012902out = self.conn.show.aggregates()29032904# out = self.conn.show.create_aggregate('aname')29052906# out = self.conn.show.create_function('fname')29072908# out = self.conn.show.create_pipeline('pname')29092910out = self.conn.show.create_table('data')2911assert 'Name' in out.columns, out.columns2912assert 'CreateTable' in out.columns, out.columns2913assert '`id` varchar(255)' in out.CreateTable[0], out.CreateTable[0]2914assert '`name` varchar(255)' in out.CreateTable[0], out.CreateTable[0]2915assert '`value` bigint(20)' in out.CreateTable[0], out.CreateTable[0]29162917# out = self.conn.show.create_view('vname')29182919def test_f32_vectors(self):2920if self.conn.driver in ['http', 'https']:2921self.skipTest('Data API does not surface vector information')29222923self.cur.execute('show variables like "enable_extended_types_metadata"')2924out = list(self.cur)2925if not out or out[0][1].lower() == 'off':2926self.skipTest('Database engine does not support extended types metadata')29272928self.cur.execute('select a from f32_vectors order by id')2929out = list(self.cur)29302931if hasattr(out[0][0], 'dtype'):2932assert out[0][0].dtype is np.dtype('float32')2933assert out[1][0].dtype is np.dtype('float32')2934assert out[2][0].dtype is np.dtype('float32')29352936np.testing.assert_array_equal(2937out[0][0],2938np.array([0.267261237, 0.534522474, 0.801783681], dtype=np.float32),2939)2940np.testing.assert_array_equal(2941out[1][0],2942np.array([0.371390671, 0.557085991, 0.742781341], dtype=np.float32),2943)2944np.testing.assert_array_equal(2945out[2][0],2946np.array([-0.424264073, -0.565685451, 0.707106829], dtype=np.float32),2947)29482949def test_f64_vectors(self):2950if self.conn.driver in ['http', 'https']:2951self.skipTest('Data API does not surface vector information')29522953self.cur.execute('show variables like "enable_extended_types_metadata"')2954out = list(self.cur)2955if not out or out[0][1].lower() == 'off':2956self.skipTest('Database engine does not support extended types metadata')29572958self.cur.execute('select a from f64_vectors order by id')2959out = list(self.cur)29602961if hasattr(out[0][0], 'dtype'):2962assert out[0][0].dtype is np.dtype('float64')2963assert out[1][0].dtype is np.dtype('float64')2964assert out[2][0].dtype is np.dtype('float64')29652966np.testing.assert_array_equal(2967out[0][0],2968np.array([0.267261237, 0.534522474, 0.801783681], dtype=np.float64),2969)2970np.testing.assert_array_equal(2971out[1][0],2972np.array([0.371390671, 0.557085991, 0.742781341], dtype=np.float64),2973)2974np.testing.assert_array_equal(2975out[2][0],2976np.array([-0.424264073, -0.565685451, 0.707106829], dtype=np.float64),2977)29782979def test_i8_vectors(self):2980if self.conn.driver in ['http', 'https']:2981self.skipTest('Data API does not surface vector information')29822983self.cur.execute('show variables like "enable_extended_types_metadata"')2984out = list(self.cur)2985if not out or out[0][1].lower() == 'off':2986self.skipTest('Database engine does not support extended types metadata')29872988self.cur.execute('select a from i8_vectors order by id')2989out = list(self.cur)29902991if hasattr(out[0][0], 'dtype'):2992assert out[0][0].dtype is np.dtype('int8')2993assert out[1][0].dtype is np.dtype('int8')2994assert out[2][0].dtype is np.dtype('int8')29952996np.testing.assert_array_equal(2997out[0][0],2998np.array([1, 2, 3], dtype=np.int8),2999)3000np.testing.assert_array_equal(3001out[1][0],3002np.array([4, 5, 6], dtype=np.int8),3003)3004np.testing.assert_array_equal(3005out[2][0],3006np.array([-1, -4, 8], dtype=np.int8),3007)30083009def test_i16_vectors(self):3010if self.conn.driver in ['http', 'https']:3011self.skipTest('Data API does not surface vector information')30123013self.cur.execute('show variables like "enable_extended_types_metadata"')3014out = list(self.cur)3015if not out or out[0][1].lower() == 'off':3016self.skipTest('Database engine does not support extended types metadata')30173018self.cur.execute('select a from i16_vectors order by id')3019out = list(self.cur)30203021if hasattr(out[0][0], 'dtype'):3022assert out[0][0].dtype is np.dtype('int16')3023assert out[1][0].dtype is np.dtype('int16')3024assert out[2][0].dtype is np.dtype('int16')30253026np.testing.assert_array_equal(3027out[0][0],3028np.array([1, 2, 3], dtype=np.int16),3029)3030np.testing.assert_array_equal(3031out[1][0],3032np.array([4, 5, 6], dtype=np.int16),3033)3034np.testing.assert_array_equal(3035out[2][0],3036np.array([-1, -4, 8], dtype=np.int16),3037)30383039def test_i32_vectors(self):3040if self.conn.driver in ['http', 'https']:3041self.skipTest('Data API does not surface vector information')30423043self.cur.execute('show variables like "enable_extended_types_metadata"')3044out = list(self.cur)3045if not out or out[0][1].lower() == 'off':3046self.skipTest('Database engine does not support extended types metadata')30473048self.cur.execute('select a from i32_vectors order by id')3049out = list(self.cur)30503051if hasattr(out[0][0], 'dtype'):3052assert out[0][0].dtype is np.dtype('int32')3053assert out[1][0].dtype is np.dtype('int32')3054assert out[2][0].dtype is np.dtype('int32')30553056np.testing.assert_array_equal(3057out[0][0],3058np.array([1, 2, 3], dtype=np.int32),3059)3060np.testing.assert_array_equal(3061out[1][0],3062np.array([4, 5, 6], dtype=np.int32),3063)3064np.testing.assert_array_equal(3065out[2][0],3066np.array([-1, -4, 8], dtype=np.int32),3067)30683069def test_i64_vectors(self):3070if self.conn.driver in ['http', 'https']:3071self.skipTest('Data API does not surface vector information')30723073self.cur.execute('show variables like "enable_extended_types_metadata"')3074out = list(self.cur)3075if not out or out[0][1].lower() == 'off':3076self.skipTest('Database engine does not support extended types metadata')30773078self.cur.execute('select a from i64_vectors order by id')3079out = list(self.cur)30803081if hasattr(out[0][0], 'dtype'):3082assert out[0][0].dtype is np.dtype('int64')3083assert out[1][0].dtype is np.dtype('int64')3084assert out[2][0].dtype is np.dtype('int64')30853086np.testing.assert_array_equal(3087out[0][0],3088np.array([1, 2, 3], dtype=np.int64),3089)3090np.testing.assert_array_equal(3091out[1][0],3092np.array([4, 5, 6], dtype=np.int64),3093)3094np.testing.assert_array_equal(3095out[2][0],3096np.array([-1, -4, 8], dtype=np.int64),3097)309830993100if __name__ == '__main__':3101import nose23102nose2.main()310331043105