-
Notifications
You must be signed in to change notification settings - Fork 548
Expand file tree
/
Copy pathtest_sqlalchemy_presto.py
More file actions
101 lines (92 loc) · 4.25 KB
/
test_sqlalchemy_presto.py
File metadata and controls
101 lines (92 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from __future__ import absolute_import
from __future__ import unicode_literals
from builtins import str
from decimal import Decimal
from pyhive.tests.sqlalchemy_test_case import SqlAlchemyTestCase
from pyhive.tests.sqlalchemy_test_case import with_engine_connection
from sqlalchemy import types
from sqlalchemy.engine import create_engine
from sqlalchemy.schema import Column
from sqlalchemy.schema import MetaData
from sqlalchemy.schema import Table
from sqlalchemy.types import String
import contextlib
import unittest
class TestSqlAlchemyPresto(unittest.TestCase, SqlAlchemyTestCase):
def create_engine(self):
return create_engine('presto://localhost:8080/hive/default?source={}'.format(self.id()))
def test_bad_format(self):
self.assertRaises(
ValueError,
lambda: create_engine('presto://localhost:8080/hive/default/what'),
)
@with_engine_connection
def test_reflect_select(self, engine, connection):
"""reflecttable should be able to fill in a table from the name"""
one_row_complex = Table('one_row_complex', MetaData(bind=engine), autoload=True)
# Presto ignores the union column
self.assertEqual(len(one_row_complex.c), 15 - 1)
self.assertIsInstance(one_row_complex.c.string, Column)
rows = one_row_complex.select().execute().fetchall()
self.assertEqual(len(rows), 1)
self.assertEqual(list(rows[0]), [
True,
127,
32767,
2147483647,
9223372036854775807,
0.5,
0.25,
'a string',
'1970-01-01 00:00:00.000',
b'123',
[1, 2],
{"1": 2, "3": 4}, # Presto converts all keys to strings so that they're valid JSON
[1, 2], # struct is returned as a list of elements
# '{0:1}',
Decimal('0.1'),
])
# TODO some of these types could be filled in better
self.assertIsInstance(one_row_complex.c.boolean.type, types.Boolean)
self.assertIsInstance(one_row_complex.c.tinyint.type, types.Integer)
self.assertIsInstance(one_row_complex.c.smallint.type, types.Integer)
self.assertIsInstance(one_row_complex.c.int.type, types.Integer)
self.assertIsInstance(one_row_complex.c.bigint.type, types.BigInteger)
self.assertIsInstance(one_row_complex.c.float.type, types.Float)
self.assertIsInstance(one_row_complex.c.double.type, types.Float)
self.assertIsInstance(one_row_complex.c.string.type, String)
self.assertIsInstance(one_row_complex.c.timestamp.type, types.TIMESTAMP)
self.assertIsInstance(one_row_complex.c.binary.type, types.VARBINARY)
self.assertIsInstance(one_row_complex.c.array.type, types.NullType)
self.assertIsInstance(one_row_complex.c.map.type, types.NullType)
self.assertIsInstance(one_row_complex.c.struct.type, types.NullType)
self.assertIsInstance(one_row_complex.c.decimal.type, types.NullType)
def test_url_default(self):
engine = create_engine('presto://localhost:8080/hive')
try:
with contextlib.closing(engine.connect()) as connection:
self.assertEqual(connection.execute('SELECT 1 AS foobar FROM one_row').scalar(), 1)
finally:
engine.dispose()
@with_engine_connection
def test_reserved_words(self, engine, connection):
"""Presto uses double quotes, not backticks"""
# Use keywords for the table/column name
fake_table = Table('select', MetaData(bind=engine), Column('current_timestamp', String))
query = str(fake_table.select(fake_table.c.current_timestamp == 'a'))
self.assertIn('"select"', query)
self.assertIn('"current_timestamp"', query)
self.assertNotIn('`select`', query)
self.assertNotIn('`current_timestamp`', query)
@with_engine_connection
def test_multiple_catalogs(self, engine, connection):
system_table = Table(
'tables',
MetaData(bind=engine),
autoload=True,
schema='information_schema',
presto_catalog='system'
)
query = str(system_table.select())
self.assertIn('"system"."information_schema"', query)
self.assertNotIn('"hive"', query)