Operators
Vulkn supports all ClickHouse operators using either raw SQL, column expressions, column literals or pure Python mechanisms.
Using Operators
Raw SQL
>>> v.q("SELECT database, name FROM system.tables WHERE database = 'system' LIMIT 3").s row database name ----- ---------- ------------------------------ 1 system aggregate_function_combinators 2 system asynchronous_metrics 3 system build_options (3 rows)
Column Expressions
>>> v.table('system.tables').select('database', 'name').where("database = 'system'").limit(3).s row database name ----- ---------- ------------------------------ 1 system aggregate_function_combinators 2 system asynchronous_metrics 3 system build_options (3 rows)
Column Literals
>>> v.table('system.tables').select('database', 'name').where(c("database = 'system'")).limit(3).s row database name ----- ---------- ------------------------------ 1 system aggregate_function_combinators 2 system asynchronous_metrics 3 system build_options (3 rows)
Python
Python operators can be used within any method and will be automatically converted to SQL providing one of the variables is a Vulkn declared type or column literal.
ss = 'substring(database, 3)' l = c('upper(name)').cast(String).length().alias('ucase_name') v.table('system.tables').select(ss, l).where(c('database') == 'system').limit(3).s row substring(database, 3) ucase_name ----- ------------------------ ------------ 1 stem 30 2 stem 20 3 stem 13 (3 rows)
Available Operators
Arithmetic Operators
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
addition, concatentation | + | + | v.q('SELECT 1 + 1').s v.select(vU8(1) + 1).s v.select(c(1).cast(UInt8) + 1).s |
subtraction | - | - | v.q('SELECT 1 - 1').s v.select(vU8(1) - 1).s v.select(c(1).cast(UInt8) - 1).s |
multiplication | * | * | v.q('SELECT 2 * 2').s v.select(vU8(2) * 2).s v.select(c(2).cast(UInt8) * 1).s |
division (float) | / | / | v.q('SELECT 2 / 2').s v.select(vU8(2) / 2).s v.select(c(2).cast(UInt8) / 2).s |
division (floor) | intDiv (function) | // | v.q('SELECT 5 // 3').s v.select(vU8(5) // 3).s v.select(c(5).cast(UInt8) // 3).s |
modulus | % | % | v.q('SELECT 5 % 3').s v.select(vU8(5) % 3).s v.select(c(5).cast(UInt8) % 3).s |
Comparison Operators
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
equals | = == |
== eq equals |
v.q('SELECT 1 == 1').s v.q('SELECT 1 = 1').s v.select(vU8(1) == 1).s v.select(c(1) == 1).s v.select(vU8(1).eq(1)).s v.select(c(1).equals(1)).s |
not equals | != <> |
!= ne notEquals not_equals |
v.q('SELECT 1 != 1').s v.select(vU8(1) != 1).s v.select(c(1) != 1).s v.select(vU8(1).ne(1)).s v.select(c(1).notEquals(1)).s |
greater than | > | > gt greater |
v.q('SELECT 1 > 2').s v.select(vU8(1) > 2).s v.select(c(1) > c(2)).s v.select(vU8(1).gt(2)).s v.select(c(1).greater(c(2))).s |
less than | < | < lt less |
v.q('SELECT 1 < 1').s v.select(vU8(1) < 2).s v.select(c(1) < 2).s v.select(vU8(1).lt(2)).s v.select(c(1).less(2)).s |
greater than or equal to | >= | >= greaterOrEquals greater_or_equals |
v.q('SELECT 1 >= 2').s v.select(vU8(1) >= 2).s v.select(c(1) >= 2).s v.select(c(1).greaterOrEquals(2)).s |
less than or equal to | <= | <= lessOrEquals less_or_equals |
v.q('SELECT 1 <= 2').s v.select(vU8(1) <= 2).s v.select(c(1) <= 2).s v.select(c(1).lessOrEquals(2)).s |
Logical Operators
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
logical and | AND | and_ funcs.and_ |
v.q('SELECT 1 AND 1').s v.select(c(1).and_(1)).s v.select(funcs.and_('col1 = 3', 'col2 = 4', String(n='baz') == 'foo')).s |
logical or | OR | or_ funcs.or_ |
v.q('SELECT 1 OR 1').s v.select(c(1).or_(1)).s v.q("SELECT (col1 = 3 AND col2 = 4) OR baz = 'foo'").s v.select(funcs.or_(funcs.and_('col1 = 3', 'col2 = 4'), String(n='baz') == 'foo'))).s |
logical not | NOT | not_ funcs.not_ |
v.q('SELECT NOT 1').s v.select(c(1).not_()).s v.select(funcs.not_('col1 = 3')).s |
Bitwise Operators
Numeric types also support bitwise operations
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
bitwise and | bitAnd (function) | bitAnd bit_and & |
v.q('SELECT bitAnd(1, 4)').s v.select(vU8(1).bitAnd(4)).s v.select(c(1).cast(UInt8) & 4).s |
bitwise or | bitOr (function) | bitOr bit_or | |
v.q('SELECT bitOr(1, 4)').s v.select(vU8(1).bitOr(4)).s v.select(c(1).cast(UInt8) | 4).s |
btiwise not | bitNot (function) | bitNot bit_not ~ |
v.q('SELECT bitNot(3)').s v.select(vU8(3).bitNot()).s v.select(~(c(3).cast(UInt8))).s |
bitwise xor | bitXor (function) | bitXor bit_xor ^ |
v.q('SELECT bitXor(3, 1)').s v.select(vU8(3).bitXor(1)).s v.select(c(3).cast(UInt8)^1).s |
bitwise left shift | bitShiftLeft (function) | bitShiftLeft << |
v.q('SELECT bitShiftLeft(3748362, 3)').s v.select(vU32(3748362)<<3).s v.select(c(3748362).cast(UInt32)<<3).s |
bitwise right shift | bitShiftRight (function) | bitShiftRight >> |
v.q('SELECT bitShiftRight(87651, 2)').s v.select(vU32(87651)>>2).s v.select(c(87651).cast(UInt32)>>2).s |
Set Membership
Sets can be compared using the in_ and not_in_ set membership tests.
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
exists in set | [GLOBAL] IN | in_ global_in_ global_in |
v.q('SELECT number FROM numbers(10) WHERE number IN (1, 4)').s v.numbers(10).select('*').where(c('number').in_(v.numbers(5))).s |
not in set | [GLOBAL] NOT IN | not_in_ not_in global_not_in_ global_not_in |
v.q('SELECT number FROM numbers(10) WHERE number GLOBAL NOT IN (1, 4)').s v.numbers(10).select('*').where(c('number').global_not_in(v.numbers(5))).s |
Range Testing
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
between inclusive | x BETWEEN x1 AND x2 | between bt |
v.one().select(c(11).between(11, 24)).s v.one().select(c(11).bt(11, 24)).s |
not_between inclusive | x NOT BETWEEN x1 AND x2 | not_between notBetween nbt |
v.one().select(c(11).not_between(11, 24)).s v.one().select(c(11).nbt(11, 24)).s |
Null Handling
Description | ClickHouse Operator | Vulkn Python | Examples |
---|---|---|---|
is null | isNull | is_null isn isNull |
v.select(String('hello').is_null()).s |
is not null | isNotNull | is_not_null isnn isNotNull |
v.select(NULL.isnn()).s |
cast to not null(type) | assumeNotNull | assume_not_null nn |
v.select(String('hello').nn()).s |
cast to null(type) | toNullable | to_nullable tn toNullable |
v.select(String('hello').to_nullable()).s |