Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add db2 hash and concat support #800

Merged
merged 5 commits into from
Apr 14, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions third_party/ibis/ibis_DB2/alchemy.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
dt.BIGINT: sa.BIGINT,
}
_ibis_type_to_sqla.update(s_al._ibis_type_to_sqla)
_ibis_type_to_sqla[dts.String] = sa.sql.sqltypes.String(length=3000)


def _to_sqla_type(itype, type_map=None):
Expand Down
3 changes: 2 additions & 1 deletion third_party/ibis/ibis_DB2/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,8 @@ def _mod(t, expr):

def _string_join(t, expr):
sep, elements = expr.op().args
return sa.func.concat(*map(t.translate, elements))
columns = [col.name for col in map(t.translate, elements)]
return sa.sql.literal_column(" || ".join(columns))


def _literal(t, expr):
Expand Down
2 changes: 1 addition & 1 deletion third_party/ibis/ibis_DB2/expr/datatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ def name(value):
_TYPE_KEYS = tuple(_TYPE_RULES.keys())


class TypeParser_Oracle(dt.TypeParser):
class TypeParser_DB2(dt.TypeParser):
def type(self) -> dt.DataType:
if self._accept(Token_DB2.CLOB):
return CLOB()
Expand Down
16 changes: 16 additions & 0 deletions third_party/ibis/ibis_addon/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@
from third_party.ibis.ibis_mssql.compiler import MSSQLExprTranslator
from ibis.backends.postgres.compiler import PostgreSQLExprTranslator

# avoid errors if Db2 is not installed and not needed
try:
from third_party.ibis.ibis_DB2.compiler import DB2ExprTranslator
except Exception:
DB2ExprTranslator = None


# from third_party.ibis.ibis_snowflake.compiler import SnowflakeExprTranslator
# from third_party.ibis.ibis_oracle.compiler import OracleExprTranslator <<<<<< DB2

Expand Down Expand Up @@ -213,6 +220,12 @@ def sa_format_hashbytes_oracle(translator, expr):
hash_func = sa.func.standard_hash(compiled_arg, sa.sql.literal_column("'SHA256'"))
return sa.func.lower(hash_func)

def sa_format_hashbytes_db2(translator, expr):
arg, how = expr.op().args
compiled_arg = translator.translate(arg)
hashfunc = sa.func.hash(compiled_arg,sa.sql.literal_column("2"))
return sa.func.hex(hashfunc)
ngdav marked this conversation as resolved.
Show resolved Hide resolved

def sa_format_hashbytes_postgres(translator, expr):
arg, how = expr.op().args
compiled_arg = translator.translate(arg)
Expand Down Expand Up @@ -292,3 +305,6 @@ def sa_cast_postgres(t, expr):
PostgreSQLExprTranslator._registry[RawSQL] = sa_format_raw_sql
PostgreSQLExprTranslator._registry[ToChar] = sa_format_to_char
PostgreSQLExprTranslator._registry[Cast] = sa_cast_postgres

if DB2ExprTranslator: #check if Db2 driver is loaded
DB2ExprTranslator._registry[HashBytes] = sa_format_hashbytes_db2