Source code for spyql.sqlfuncs
from spyql.nulltype import NULL
from spyql import log
# functions that support NULLs (and that need to be replaced in the query)
NULL_SAFE_FUNCS = {
"int": "int_",
"float": "float_",
"str": "str_",
"complex": "complex_",
}
[docs]def coalesce(val, default):
"""
returns ``default`` if ``val is NULL`` otherwise returns ``val``
"""
if val is NULL:
return default
return val
ifnull = coalesce # alias
[docs]def nullif(a, b):
"""
returns ``NULL`` if ``a == b`` otherwise returns ``a``
"""
if a == b:
return NULL
return a
# returns NULL if any argument equals NULL
[docs]def null_safe_call(fun, *args, **kwargs):
if NULL in args or NULL in kwargs.values():
return NULL
return fun(*args, **kwargs)
# NULL-safe functions
[docs]def float_(a):
if a is NULL:
return NULL
try:
return float(a)
except ValueError as e:
log.conversion_warning("float", e, a)
return NULL
[docs]def int_(a, *args, **kwargs):
if a is NULL or NULL in args or NULL in kwargs.values():
return NULL
try:
return int(a, *args, **kwargs)
except ValueError as e:
log.conversion_warning("int", e, a, **kwargs)
return NULL
[docs]def complex_(*args):
if NULL in args:
return NULL
try:
return complex(*args)
except ValueError as e:
log.conversion_warning("complex", e, *args)
return NULL
[docs]def str_(*args, **kwargs):
if NULL in args or NULL in kwargs.values():
return NULL
return str(*args, **kwargs)