mirror of
https://github.com/hanzo-ds/connect.git
synced 2026-10-30 20:31:24 +00:00
Imports read `datastore_connect`, distribution `datastore-connect`, so nothing has to import another product's name to talk to Hanzo Datastore. Cut from upstream 0.8.17 — the version this stack already ran — rather than from upstream HEAD, so it is a PURE RENAME with no behaviour change. Forking from HEAD would have dragged versions along with the name (connect alone jumped 0.8.17 -> 1.6.0, a major), which is a different and much riskier change wearing a rename's clothes. X-ClickHouse-* headers are untouched: they are wire protocol the server sends and expects, and a different token shape from the module name.
89 lines
4.7 KiB
Python
89 lines
4.7 KiB
Python
from datetime import datetime, date
|
|
from typing import Callable
|
|
|
|
from datastore_connect.driver import Client
|
|
from datastore_connect.driver.binding import DT64Param
|
|
|
|
|
|
def test_params(test_client: Client, table_context: Callable):
|
|
result = test_client.query('SELECT name, database FROM system.tables WHERE database = {db:String}',
|
|
parameters={'db': 'system'})
|
|
assert result.first_item['database'] == 'system'
|
|
if test_client.min_version('21'):
|
|
result = test_client.query('SELECT name, {col:String} FROM system.tables WHERE table ILIKE {t:String}',
|
|
parameters={'t': '%rr%', 'col': 'database'})
|
|
assert 'rr' in result.first_item['name']
|
|
|
|
first_date = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
|
|
first_date = test_client.server_tz.localize(first_date)
|
|
second_date = datetime.strptime('Dec 25 2022 5:00AM', '%b %d %Y %I:%M%p')
|
|
second_date = test_client.server_tz.localize(second_date)
|
|
with table_context('test_bind_params', ['key UInt64', 'dt DateTime', 'value String', 't Tuple(String, String)']):
|
|
test_client.insert('test_bind_params',
|
|
[[1, first_date, 'v11', ('one', 'two')],
|
|
[2, second_date, 'v21', ('t1', 't2')],
|
|
[3, datetime.now(), 'v31', ('str1', 'str2')]])
|
|
result = test_client.query('SELECT * FROM test_bind_params WHERE dt = {dt:DateTime}',
|
|
parameters={'dt': second_date})
|
|
assert result.first_item['key'] == 2
|
|
result = test_client.query('SELECT * FROM test_bind_params WHERE dt = %(dt)s',
|
|
parameters={'dt': first_date})
|
|
assert result.first_item['key'] == 1
|
|
result = test_client.query("SELECT * FROM test_bind_params WHERE value != %(v)s AND value like '%%1'",
|
|
parameters={'v': 'v11'})
|
|
assert result.row_count == 2
|
|
result = test_client.query('SELECT * FROM test_bind_params WHERE value IN %(tp)s',
|
|
parameters={'tp': ('v18', 'v31')})
|
|
assert result.first_item['key'] == 3
|
|
|
|
result = test_client.query('SELECT number FROM numbers(10) WHERE {n:Nullable(String)} IS NULL',
|
|
parameters={'n': None}).result_rows
|
|
assert len(result) == 10
|
|
|
|
date_params = [date(2023, 6, 1), date(2023, 8, 5)]
|
|
result = test_client.query('SELECT {l:Array(Date)}', parameters={'l': date_params}).first_row
|
|
assert date_params == result[0]
|
|
|
|
dt_params = [datetime(2023, 6, 1, 7, 40, 2), datetime(2023, 8, 17, 20, 0, 10)]
|
|
result = test_client.query('SELECT {l:Array(DateTime)}', parameters={'l': dt_params}).first_row
|
|
assert dt_params == result[0]
|
|
|
|
num_array_params = [2.5, 5.3, 7.4]
|
|
result = test_client.query('SELECT {l:Array(Float64)}', parameters={'l': num_array_params}).first_row
|
|
assert num_array_params == result[0]
|
|
result = test_client.query('SELECT %(l)s', parameters={'l': num_array_params}).first_row
|
|
assert num_array_params == result[0]
|
|
|
|
tp_params = ('str1', 'str2')
|
|
result = test_client.query('SELECT %(tp)s', parameters={'tp': tp_params}).first_row
|
|
assert tp_params == result[0]
|
|
|
|
num_params = {'p_0': 2, 'p_1': 100523.55}
|
|
result = test_client.query(
|
|
'SELECT count() FROM system.tables WHERE total_rows > %(p_0)d and total_rows < %(p_1)f', parameters=num_params)
|
|
assert result.first_row[0] > 0
|
|
|
|
|
|
def test_datetime_64_params(test_client: Client):
|
|
dt_values = [datetime(2023, 6, 1, 7, 40, 2, 250306), datetime(2023, 8, 17, 20, 0, 10, 777722)]
|
|
dt_params = {f'd{ix}': DT64Param(v) for ix, v in enumerate(dt_values)}
|
|
result = test_client.query('SELECT {d0:DateTime64(3)}, {d1:Datetime64(9)}', parameters=dt_params).first_row
|
|
assert result[0] == dt_values[0].replace(microsecond=250000)
|
|
assert result[1] == dt_values[1]
|
|
|
|
result = test_client.query('SELECT {a1:Array(DateTime64(6))}', parameters={'a1': [dt_params['d0'], dt_params['d1']]}).first_row
|
|
assert result[0] == dt_values
|
|
|
|
dt_params = {f'd{ix}_64': v for ix, v in enumerate(dt_values)}
|
|
result = test_client.query('SELECT {d0:DateTime64(3)}, {d1:Datetime64(9)}', parameters=dt_params).first_row
|
|
assert result[0] == dt_values[0].replace(microsecond=250000)
|
|
assert result[1] == dt_values[1]
|
|
|
|
result = test_client.query('SELECT {a1:Array(DateTime64(6))}',
|
|
parameters={'a1_64': dt_values}).first_row
|
|
assert result[0] == dt_values
|
|
|
|
dt_params = [DT64Param(v) for v in dt_values]
|
|
result = test_client.query("SELECT %s as string, toDateTime64(%s,6) as dateTime", parameters = dt_params).first_row
|
|
assert result == ('2023-06-01 07:40:02.250306', dt_values[1])
|