|
14 | 14 |
|
15 | 15 | import pytest |
16 | 16 | import asyncio |
| 17 | +import datetime |
17 | 18 | import uuid |
18 | 19 | import os |
19 | 20 | from google.api_core import retry |
20 | 21 | from google.api_core.exceptions import ClientError |
21 | 22 |
|
| 23 | +from google.cloud.bigtable.data.execute_query.metadata import SqlType |
22 | 24 | from google.cloud.bigtable.data.read_modify_write_rules import _MAX_INCREMENT_VALUE |
23 | 25 | from google.cloud.environment_vars import BIGTABLE_EMULATOR |
| 26 | +from google.type import date_pb2 |
24 | 27 |
|
25 | 28 | from google.cloud.bigtable.data._cross_sync import CrossSync |
26 | 29 |
|
@@ -1027,3 +1030,83 @@ async def test_execute_query_simple(self, client, table_id, instance_id): |
1027 | 1030 | row = rows[0] |
1028 | 1031 | assert row["a"] == 1 |
1029 | 1032 | assert row["b"] == "foo" |
| 1033 | + |
| 1034 | + @CrossSync.pytest |
| 1035 | + @pytest.mark.usefixtures("client") |
| 1036 | + @CrossSync.Retry( |
| 1037 | + predicate=retry.if_exception_type(ClientError), initial=1, maximum=5 |
| 1038 | + ) |
| 1039 | + async def test_execute_query_params(self, client, table_id, instance_id): |
| 1040 | + query = ( |
| 1041 | + "SELECT @stringParam AS strCol, @bytesParam as bytesCol, @int64Param AS intCol, " |
| 1042 | + "@float32Param AS float32Col, @float64Param AS float64Col, @boolParam AS boolCol, " |
| 1043 | + "@tsParam AS tsCol, @dateParam AS dateCol, @byteArrayParam AS byteArrayCol, " |
| 1044 | + "@stringArrayParam AS stringArrayCol, @intArrayParam AS intArrayCol, " |
| 1045 | + "@float32ArrayParam AS float32ArrayCol, @float64ArrayParam AS float64ArrayCol, " |
| 1046 | + "@boolArrayParam AS boolArrayCol, @tsArrayParam AS tsArrayCol, " |
| 1047 | + "@dateArrayParam AS dateArrayCol" |
| 1048 | + ) |
| 1049 | + parameters = { |
| 1050 | + "stringParam": "foo", |
| 1051 | + "bytesParam": b"bar", |
| 1052 | + "int64Param": 12, |
| 1053 | + "float32Param": 1.1, |
| 1054 | + "float64Param": 1.2, |
| 1055 | + "boolParam": True, |
| 1056 | + "tsParam": datetime.datetime.fromtimestamp(1000, tz=datetime.timezone.utc), |
| 1057 | + "dateParam": datetime.date(2025, 1, 16), |
| 1058 | + "byteArrayParam": [b"foo", b"bar", None], |
| 1059 | + "stringArrayParam": ["foo", "bar", None], |
| 1060 | + "intArrayParam": [1, None, 2], |
| 1061 | + "float32ArrayParam": [1.2, None, 1.3], |
| 1062 | + "float64ArrayParam": [1.4, None, 1.5], |
| 1063 | + "boolArrayParam": [None, False, True], |
| 1064 | + "tsArrayParam": [ |
| 1065 | + datetime.datetime.fromtimestamp(1000, tz=datetime.timezone.utc), |
| 1066 | + datetime.datetime.fromtimestamp(2000, tz=datetime.timezone.utc), |
| 1067 | + None, |
| 1068 | + ], |
| 1069 | + "dateArrayParam": [ |
| 1070 | + datetime.date(2025, 1, 16), |
| 1071 | + datetime.date(2025, 1, 17), |
| 1072 | + None, |
| 1073 | + ], |
| 1074 | + } |
| 1075 | + param_types = { |
| 1076 | + "float32Param": SqlType.Float32(), |
| 1077 | + "float64Param": SqlType.Float64(), |
| 1078 | + "byteArrayParam": SqlType.Array(SqlType.Bytes()), |
| 1079 | + "stringArrayParam": SqlType.Array(SqlType.String()), |
| 1080 | + "intArrayParam": SqlType.Array(SqlType.Int64()), |
| 1081 | + "float32ArrayParam": SqlType.Array(SqlType.Float32()), |
| 1082 | + "float64ArrayParam": SqlType.Array(SqlType.Float64()), |
| 1083 | + "boolArrayParam": SqlType.Array(SqlType.Bool()), |
| 1084 | + "tsArrayParam": SqlType.Array(SqlType.Timestamp()), |
| 1085 | + "dateArrayParam": SqlType.Array(SqlType.Date()), |
| 1086 | + } |
| 1087 | + result = await client.execute_query( |
| 1088 | + query, instance_id, parameters=parameters, parameter_types=param_types |
| 1089 | + ) |
| 1090 | + rows = [r async for r in result] |
| 1091 | + assert len(rows) == 1 |
| 1092 | + row = rows[0] |
| 1093 | + assert row["strCol"] == parameters["stringParam"] |
| 1094 | + assert row["bytesCol"] == parameters["bytesParam"] |
| 1095 | + assert row["intCol"] == parameters["int64Param"] |
| 1096 | + assert row["float32Col"] == pytest.approx(parameters["float32Param"]) |
| 1097 | + assert row["float64Col"] == pytest.approx(parameters["float64Param"]) |
| 1098 | + assert row["boolCol"] == parameters["boolParam"] |
| 1099 | + assert row["tsCol"] == parameters["tsParam"] |
| 1100 | + assert row["dateCol"] == date_pb2.Date(year=2025, month=1, day=16) |
| 1101 | + assert row["stringArrayCol"] == parameters["stringArrayParam"] |
| 1102 | + assert row["byteArrayCol"] == parameters["byteArrayParam"] |
| 1103 | + assert row["intArrayCol"] == parameters["intArrayParam"] |
| 1104 | + assert row["float32ArrayCol"] == pytest.approx(parameters["float32ArrayParam"]) |
| 1105 | + assert row["float64ArrayCol"] == pytest.approx(parameters["float64ArrayParam"]) |
| 1106 | + assert row["boolArrayCol"] == parameters["boolArrayParam"] |
| 1107 | + assert row["tsArrayCol"] == parameters["tsArrayParam"] |
| 1108 | + assert row["dateArrayCol"] == [ |
| 1109 | + date_pb2.Date(year=2025, month=1, day=16), |
| 1110 | + date_pb2.Date(year=2025, month=1, day=17), |
| 1111 | + None, |
| 1112 | + ] |
0 commit comments