@@ -104,6 +104,11 @@ constexpr absl::string_view kHintTableScanGroupByScanOptimization =
104104constexpr absl::string_view kUseAdditionalParallelism =
105105 " use_additional_parallelism" ;
106106
107+ constexpr absl::string_view kScanMethod = " scan_method" ;
108+ constexpr absl::string_view kScanMethodAuto = " auto" ;
109+ constexpr absl::string_view kScanMethodBatch = " batch" ;
110+ constexpr absl::string_view kScanMethodRow = " row" ;
111+
107112// Lock scanned ranges
108113constexpr absl::string_view kHintLockScannedRange = " lock_scanned_ranges" ;
109114constexpr absl::string_view kHintLockScannedRangeShared = " shared" ;
@@ -210,7 +215,7 @@ absl::Status QueryValidator::CheckSpannerHintName(
210215 zetasql_base::StringViewCaseEqual>>{
211216 {zetasql::RESOLVED_TABLE_SCAN ,
212217 {kHintForceIndex , kHintTableScanGroupByScanOptimization ,
213- kHintIndexStrategy }},
218+ kHintIndexStrategy , kScanMethod }},
214219 {zetasql::RESOLVED_JOIN_SCAN ,
215220 {kHintJoinTypeDeprecated , kHintJoinMethod , kHashJoinBuildSide ,
216221 kHintJoinForceOrder , kHashJoinExecution }},
@@ -236,6 +241,7 @@ absl::Status QueryValidator::CheckSpannerHintName(
236241 kHintAllowSearchIndexesInTransaction ,
237242 kRequireEnhanceQuery ,
238243 kEnhanceQueryTimeoutMs ,
244+ kScanMethod ,
239245 }},
240246 {zetasql::RESOLVED_SUBQUERY_EXPR ,
241247 {kHintJoinTypeDeprecated , kHintJoinMethod , kHashJoinBuildSide ,
@@ -298,6 +304,7 @@ absl::Status QueryValidator::CheckHintValue(
298304 {kHintAllowSearchIndexesInTransaction , zetasql::types::BoolType ()},
299305 {kRequireEnhanceQuery , zetasql::types::BoolType ()},
300306 {kEnhanceQueryTimeoutMs , zetasql::types::Int64Type ()},
307+ {kScanMethod , zetasql::types::StringType ()},
301308 }};
302309
303310 const auto & iter = supported_hint_types->find (name);
@@ -393,6 +400,13 @@ absl::Status QueryValidator::CheckHintValue(
393400 kHintIndexStrategyForceIndexUnion )) {
394401 return error::InvalidHintValue (name, value.DebugString ());
395402 }
403+ } else if (absl::EqualsIgnoreCase (name, kScanMethod )) {
404+ const std::string& string_value = value.string_value ();
405+ if (!(absl::EqualsIgnoreCase (string_value, kScanMethodAuto ) ||
406+ absl::EqualsIgnoreCase (string_value, kScanMethodBatch ) ||
407+ absl::EqualsIgnoreCase (string_value, kScanMethodRow ))) {
408+ return error::InvalidHintValue (name, value.DebugString ());
409+ }
396410 }
397411 return absl::OkStatus ();
398412}
0 commit comments