@@ -4872,9 +4872,35 @@ function ( $column ) use ( $is_strict_mode, $insert_map ) {
48724872 // Wrap the original insert VALUES, SELECT, or SET list in a FROM clause.
48734873 if ( 'insertFromConstructor ' === $ node ->rule_name ) {
48744874 // VALUES (...)
4875- $ from = $ this ->translate (
4876- $ node ->get_first_child_node ( 'insertValues ' )
4877- );
4875+ $ insert_values = $ node ->get_first_child_node ( 'insertValues ' );
4876+ $ from = $ this ->translate ( $ insert_values );
4877+
4878+ /**
4879+ * The automatic "columnN" naming for VALUES lists is supported only
4880+ * from SQLite 3.33.0. For older versions, we need to emulate it by
4881+ * prepending a dummy VALUES list header via the UNION ALL operator:
4882+ *
4883+ * SELECT
4884+ * NULL AS `column1`, NULL AS `column2`, ... WHERE FALSE
4885+ * UNION ALL
4886+ * VALUES (value1, value2, ...)
4887+ */
4888+ $ is_values_naming_supported = version_compare ( $ this ->get_sqlite_version (), '3.33.0 ' , '>= ' );
4889+ if ( ! $ is_values_naming_supported ) {
4890+ $ values_list = $ insert_values ->get_first_child_node ( 'valueList ' );
4891+ $ values = $ values_list ->get_first_child_node ( 'values ' );
4892+ $ value_count = (
4893+ count ( $ values ->get_child_nodes ( 'expr ' ) )
4894+ + count ( $ values ->get_child_nodes ( WP_MySQL_Lexer::DEFAULT_SYMBOL ) )
4895+ );
4896+
4897+ $ columns_list = '' ;
4898+ for ( $ i = 1 ; $ i <= $ value_count ; $ i ++ ) {
4899+ $ columns_list .= $ i > 1 ? ', ' : '' ;
4900+ $ columns_list .= 'NULL AS ' . $ this ->quote_sqlite_identifier ( 'column ' . $ i );
4901+ }
4902+ $ from = 'SELECT ' . $ columns_list . ' WHERE FALSE UNION ALL ' . $ from ;
4903+ }
48784904 } elseif ( 'insertQueryExpression ' === $ node ->rule_name ) {
48794905 // SELECT ...
48804906 $ from = $ this ->translate (
0 commit comments