@@ -300,6 +300,19 @@ static void ParseTablesScalarFunction_struct(DataChunk &args, ExpressionState &s
300300 });
301301}
302302
303+ static void IsParsableFunction (DataChunk &args, ExpressionState &state, Vector &result) {
304+ UnaryExecutor::Execute<string_t , bool >(args.data [0 ], result, args.size (),
305+ [](string_t query) -> bool {
306+ try {
307+ Parser parser;
308+ parser.ParseQuery (query.GetString ());
309+ return true ;
310+ } catch (const std::exception &) {
311+ return false ;
312+ }
313+ });
314+ }
315+
303316// Extension scaffolding
304317// ---------------------------------------------------
305318
@@ -309,22 +322,26 @@ void RegisterParseTablesFunction(DatabaseInstance &db) {
309322}
310323
311324void RegisterParseTableScalarFunction (DatabaseInstance &db) {
312- // parse tables is overloaded, allowing for an optional boolean argument
325+ // parse_table_names is overloaded, allowing for an optional boolean argument
313326 // that indicates whether to include CTEs in the result
314327 // usage: parse_tables(sql_query [, include_cte])
315328 ScalarFunctionSet set (" parse_table_names" );
316329 set.AddFunction (ScalarFunction ({LogicalType::VARCHAR}, LogicalType::LIST (LogicalType::VARCHAR), ParseTablesScalarFunction));
317330 set.AddFunction (ScalarFunction ({LogicalType::VARCHAR, LogicalType::BOOLEAN}, LogicalType::LIST (LogicalType::VARCHAR), ParseTablesScalarFunction));
318-
319331 ExtensionUtil::RegisterFunction (db, set);
320332
333+ // parse_tables_struct is a scalar function that returns a list of structs
321334 auto return_type = LogicalType::LIST (LogicalType::STRUCT ({
322335 {" schema" , LogicalType::VARCHAR},
323336 {" table" , LogicalType::VARCHAR},
324337 {" context" , LogicalType::VARCHAR}
325338 }));
326339 ScalarFunction sf (" parse_tables" , {LogicalType::VARCHAR}, return_type, ParseTablesScalarFunction_struct);
327340 ExtensionUtil::RegisterFunction (db, sf);
341+
342+ // is_parsable is a scalar function that returns a boolean indicating whether the SQL query is parsable (no parse errors)
343+ ScalarFunction is_parsable (" is_parsable" , {LogicalType::VARCHAR}, LogicalType::BOOLEAN, IsParsableFunction);
344+ ExtensionUtil::RegisterFunction (db, is_parsable);
328345}
329346
330347} // namespace duckdb
0 commit comments