# 🔍 Description This is the follow-up of #5686, renaming `./pyhive` to `./python`, and also adding `**/python/*` to RAT exclusion list temporarily. "PyHive" may not be a suitable name after being part of Apache Kyuubi, let's use a generic dir name `python`, and discuss the official name later(we probably keep the code at `./python` eventually). ## Types of changes 🔖 - [ ] Bugfix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) ## Test Plan 🧪 Recover RAT checked. --- # Checklist 📝 - [x] This patch was not authored or co-authored using [Generative Tooling](https://www.apache.org/legal/generative-tooling.html) **Be nice. Be informative.** Closes #6279 from pan3793/pyhive-1. Closes #5686 42d338e71 [Cheng Pan] [KYUUBI #5686][FOLLOWUP] Rename pyhive to python Authored-by: Cheng Pan <chengpan@apache.org> Signed-off-by: Cheng Pan <chengpan@apache.org>
85 lines
2.2 KiB
Python
85 lines
2.2 KiB
Python
"""Integration between SQLAlchemy and Trino.
|
|
|
|
Some code based on
|
|
https://github.com/zzzeek/sqlalchemy/blob/rel_0_5/lib/sqlalchemy/databases/sqlite.py
|
|
which is released under the MIT license.
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import unicode_literals
|
|
|
|
import re
|
|
from sqlalchemy import exc
|
|
from sqlalchemy import types
|
|
from sqlalchemy import util
|
|
# TODO shouldn't use mysql type
|
|
try:
|
|
from sqlalchemy.databases import mysql
|
|
mysql_tinyinteger = mysql.MSTinyInteger
|
|
except ImportError:
|
|
# Required for SQLAlchemy>=2.0
|
|
from sqlalchemy.dialects import mysql
|
|
mysql_tinyinteger = mysql.base.MSTinyInteger
|
|
from sqlalchemy.engine import default
|
|
from sqlalchemy.sql import compiler
|
|
from sqlalchemy.sql.compiler import SQLCompiler
|
|
|
|
from pyhive import trino
|
|
from pyhive.common import UniversalSet
|
|
from pyhive.sqlalchemy_presto import PrestoDialect, PrestoCompiler, PrestoIdentifierPreparer
|
|
|
|
class TrinoIdentifierPreparer(PrestoIdentifierPreparer):
|
|
pass
|
|
|
|
|
|
_type_map = {
|
|
'boolean': types.Boolean,
|
|
'tinyint': mysql_tinyinteger,
|
|
'smallint': types.SmallInteger,
|
|
'integer': types.Integer,
|
|
'bigint': types.BigInteger,
|
|
'real': types.Float,
|
|
'double': types.Float,
|
|
'varchar': types.String,
|
|
'timestamp': types.TIMESTAMP,
|
|
'date': types.DATE,
|
|
'varbinary': types.VARBINARY,
|
|
}
|
|
|
|
|
|
class TrinoCompiler(PrestoCompiler):
|
|
pass
|
|
|
|
|
|
class TrinoTypeCompiler(PrestoCompiler):
|
|
def visit_CLOB(self, type_, **kw):
|
|
raise ValueError("Trino does not support the CLOB column type.")
|
|
|
|
def visit_NCLOB(self, type_, **kw):
|
|
raise ValueError("Trino does not support the NCLOB column type.")
|
|
|
|
def visit_DATETIME(self, type_, **kw):
|
|
raise ValueError("Trino does not support the DATETIME column type.")
|
|
|
|
def visit_FLOAT(self, type_, **kw):
|
|
return 'DOUBLE'
|
|
|
|
def visit_TEXT(self, type_, **kw):
|
|
if type_.length:
|
|
return 'VARCHAR({:d})'.format(type_.length)
|
|
else:
|
|
return 'VARCHAR'
|
|
|
|
|
|
class TrinoDialect(PrestoDialect):
|
|
name = 'trino'
|
|
supports_statement_cache = False
|
|
|
|
@classmethod
|
|
def dbapi(cls):
|
|
return trino
|
|
|
|
@classmethod
|
|
def import_dbapi(cls):
|
|
return trino
|