@@ -108,7 +108,7 @@ class TableFunctionMergeTreeAnalyzeIndexes : public ITableFunction
108108 // / a) vector search with large vector indexes
109109 // / b) top-k using only minmax index (e.g SELECT * FROM youtube ORDER BY dislike_count LIMIT 10)
110110 // / These 2 cannot be packaged in the 'predicate'
111- void parseArgumentsForOptimizations (const ASTs & args, ContextPtr context);
111+ void parseArgumentsForOptimizations (const ASTs & args, ContextPtr context, size_t start_index );
112112
113113 const bool resolve_by_uuid;
114114 StorageID source_table_id{StorageID::createEmpty ()};
@@ -156,17 +156,21 @@ void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsUUID(const ASTs & args_
156156 parts = extractParts (args[2 ], context);
157157
158158 if (args.size () > 3 )
159- parseArgumentsForOptimizations (args, context);
159+ {
160+ if (args.size () < 5 )
161+ throw Exception (ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, " Not enough arguments: no args_array for optimization" );
162+ parseArgumentsForOptimizations (args, context, 3 );
163+ }
160164
161165 source_table_id = StorageID{/* database=*/ " " , /* table=*/ " " , uuid};
162166}
163167
164168void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsDatabaseTable (const ASTs & args_func, ContextPtr context)
165169{
166170 ASTs & args = args_func.at (0 )->children ;
167- if (args.size () < 2 || args.size () > 4 )
171+ if (args.size () < 2 || args.size () > 6 )
168172 throw Exception (ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
169- " Table function '{}' must have from 2 to 4 arguments (database, table, condition[, parts_array]), got: {}" , getName (), args.size ());
173+ " Table function '{}' must have from 2 to 4 or 6 arguments (database, table, condition[, parts_array], [, optimization, args_array ]), got: {}" , getName (), args.size ());
170174
171175 args[0 ] = evaluateConstantExpressionForDatabaseName (args[0 ], context);
172176 auto database = checkAndGetLiteralArgument<String>(args[0 ], " database" );
@@ -180,40 +184,41 @@ void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsDatabaseTable(const AST
180184 if (args.size () > 3 )
181185 parts = extractParts (args[3 ], context);
182186
183- if (args.size () > 3 )
184- parseArgumentsForOptimizations (args, context);
187+ if (args.size () > 4 )
188+ {
189+ if (args.size () < 6 )
190+ throw Exception (ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, " Not enough arguments: no args_array for optimization" );
191+ parseArgumentsForOptimizations (args, context, 4 );
192+ }
185193
186194 source_table_id = StorageID{database, table};
187195}
188196
189- void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsForOptimizations (const ASTs & args, ContextPtr context)
197+ void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsForOptimizations (const ASTs & args, ContextPtr context, size_t start_index )
190198{
191- if (args.size () == 5 )
199+ auto optimization = checkAndGetLiteralArgument<String>(args[start_index++], " extra_optimization" );
200+ if (optimization == " vector_search_index_analysis" )
192201 {
193- auto optimization = checkAndGetLiteralArgument<String>(args[3 ], " extra_optimization" );
194- if (optimization == " vector_search_index_analysis" )
202+ auto cast_node = args[start_index++]->children .at (0 );
203+ auto vector_search_args = evaluateConstantExpressionAsLiteral (cast_node->children .at (0 ), context)->as <ASTLiteral &>().value .safeGet <Array>();
204+ if (vector_search_args.size () != 6 )
205+ throw Exception (ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
206+ " vector_search_index_analysis requires 6 arguments" );
207+
208+ Array field_array = vector_search_args[3 ].safeGet <Array>();
209+ std::vector<Float64> reference_vector;
210+ for (const auto & field_array_value : field_array)
195211 {
196- auto cast_node = args[4 ]->children .at (0 );
197- auto vector_search_args = evaluateConstantExpressionAsLiteral (cast_node->children .at (0 ), context)->as <ASTLiteral &>().value .safeGet <Array>();
198- if (vector_search_args.size () != 6 )
199- throw Exception (ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
200- " vector_search_index_analysis requires 6 arguments" );
201-
202- Array field_array = vector_search_args[3 ].safeGet <Array>();
203- std::vector<Float64> reference_vector;
204- for (const auto & field_array_value : field_array)
205- {
206- Float64 float64 = field_array_value.safeGet <Float64>();
207- reference_vector.push_back (float64);
208- }
209-
210- vector_search_parameters = VectorSearchParameters{vector_search_args[0 ].safeGet <String>(), // / column
211- vector_search_args[1 ].safeGet <String>(), // / distance function
212- vector_search_args[2 ].safeGet <UInt64>(), // / limit
213- reference_vector, // / search vector
214- static_cast <bool >(vector_search_args[4 ].safeGet <bool >()), // / additional filters
215- static_cast <bool >(vector_search_args[5 ].safeGet <bool >())}; // / return distances
212+ Float64 float64 = field_array_value.safeGet <Float64>();
213+ reference_vector.push_back (float64);
216214 }
215+
216+ vector_search_parameters = VectorSearchParameters{vector_search_args[0 ].safeGet <String>(), // / column
217+ vector_search_args[1 ].safeGet <String>(), // / distance function
218+ vector_search_args[2 ].safeGet <UInt64>(), // / limit
219+ reference_vector, // / search vector
220+ static_cast <bool >(vector_search_args[4 ].safeGet <bool >()), // / additional filters
221+ static_cast <bool >(vector_search_args[5 ].safeGet <bool >())}; // / return distances
217222 }
218223}
219224
0 commit comments