GoogleCloudPlatform / GoogleCloudPlatform/cloud-spanner-emulator
Support all documented query hints
- Dominant language
- C++
- Stars
- 334
- Forks
- 77
- Avg merge
- 8m
- Merged PRs (30d)
- 2
Description
This emulator validates names and values of query hints.
It is useful to ensure that the query is valid, but sometimes, valid queries can be rejected because of unimplemented hints.
Ideally, all valid queries with hints should be accepted.
## Current status (as of 2025-12-05)
[Statement Hints](https://docs.cloud.google.com/spanner/docs/reference/standard-sql/query-syntax#statement_hints)
|hint name| supported|
|---|---|
|`USE_ADDITIONAL_PARALLELISM`|Yes|
|`OPTIMIZER_VERSION`|No|
|`OPTIMIZER_STATISTICS_PACKAGE`|No|
|`ALLOW_DISTRIBUTED_MERGE`|No|
|`LOCK_SCANNED_RANGES `|Yes|
|`SCAN_METHOD`|Yes|
|`EXECUTION_METHOD`|No|
|`USE_UNENFORCED_FOREIGN_KEY`|No|
|`ALLOW_TIMESTAMP_PREDICATE_PUSHDOWN`|No|
```
spanner> @{OPTIMIZER_VERSION=latest} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: OPTIMIZER_VERSION.
spanner> @{OPTIMIZER_STATISTICS_PACKAGE=latest} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: OPTIMIZER_STATISTICS_PACKAGE.
spanner> @{ALLOW_DISTRIBUTED_MERGE=TRUE} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: ALLOW_DISTRIBUTED_MERGE.
spanner> @{EXECUTION_METHOD=BATCH} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: EXECUTION_METHOD.
spanner> @{USE_UNENFORCED_FOREIGN_KEY=TRUE} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: USE_UNENFORCED_FOREIGN_KEY.
spanner> @{ALLOW_TIMESTAMP_PREDICATE_PUSHDOWN=TRUE} SELECT 1;
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: ALLOW_TIMESTAMP_PREDICATE_PUSHDOWN.
```
[Table hints](https://docs.cloud.google.com/spanner/docs/reference/standard-sql/query-syntax#table_hints)
|hint name| supported|
|---|---|
|`FORCE_INDEX`|Yes|
|`GROUPBY_SCAN_OPTIMIZATION`|Yes|
|`SCAN_METHOD`|Yes|
|`INDEX_STRATEGY`|Yes|
|`SEEKABLE_KEY_SIZE`|No|
```
spanner> SELECT * FROM Singers@{FORCE_INDEX=SingersByFirstLastName,SEEKABLE_KEY_SIZE=1};
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: SEEKABLE_KEY_SIZE.
```
[Join hints](https://docs.cloud.google.com/spanner/docs/reference/standard-sql/query-syntax#join_hints)
|hint name| supported|
|---|---|
|`FORCE_JOIN_ORDER`|Yes|
|`JOIN_METHOD`|Yes|
|`HASH_JOIN_BUILD_SIDE`|Yes, but only accepted using `HASH JOIN` (not `@{JOIN_METHOD=HASH_JOIN}`)|
|`BATCH_MODE`|No|
|`HASH_JOIN_EXECUTION`|Yes|
```
### HASH_JOIN_BUILD_SIDE with HASH JOIN
spanner> SELECT * FROM Singers HASH JOIN@{HASH_JOIN_BUILD_SIDE=BUILD_LEFT} Albums USING (SingerId);
+----------+-----------+----------+------------+------------+---------+-------------------------+-----------------+
| SingerId | FirstName | LastName | SingerInfo | BirthDate | AlbumId | AlbumTitle | MarketingBudget |
| INT64 | STRING | STRING | BYTES | DATE | INT64 | STRING | INT64 |
+----------+-----------+----------+------------+------------+---------+-------------------------+-----------------+
| 2 | Catalina | Smith | NULL | 1990-08-17 | 1 | Green | NULL |
| 4 | Lea | Martin | NULL | 1991-11-09 | 1 | Play | NULL |
| 1 | Marc | Richards | NULL | 1970-09-03 | 1 | Total Junk | NULL |
| 2 | Catalina | Smith | NULL | 1990-08-17 | 2 | Forever Hold Your Peace | NULL |
| 2 | Catalina | Smith | NULL | 1990-08-17 | 3 | Terrified | NULL |
| 1 | Marc | Richards | NULL | 1970-09-03 | 2 | Go, Go, Go | NULL |
| 3 | Alice | Trentor | NULL | 1991-10-02 | 1 | Nothing To Do With Me | NULL |
+----------+-----------+----------+------------+------------+---------+-------------------------+-----------------+
7 rows in set (1.61051ms)
### HASH_JOIN_BUILD_SIDE with JOIN_METHOD=HASH_JOIN
spanner> SELECT * FROM Singers JOIN@{JOIN_METHOD=HASH_JOIN,HASH_JOIN_BUILD_SIDE=BUILD_LEFT} Albums USING (SingerId);
ERROR: spanner: code="InvalidArgument", desc: hash_join_build_side hint is only supported for HASH joins.
spanner> SELECT * FROM Singers JOIN@{BATCH_MODE=TRUE} Albums USING (SingerId);
ERROR: spanner: code="InvalidArgument", desc: Unsupported hint: BATCH_MODE.
```
Contributor guide
Assessment
This issue has not been assessed yet.