Skip to content

Commit da8a89e

Browse files
committed
Extract simpleExprBody as a named grammar rule
Promote the %simpleExpr_factored fragment to a real "simpleExprBody" rule so it creates its own AST node. This separates the core expression (CONVERT, CAST, literals, etc.) from trailing modifiers (COLLATE, CONCAT_PIPES) that remain in the parent "simpleExpr" node, making individual expression handlers simpler.
1 parent ee854d2 commit da8a89e

3 files changed

Lines changed: 12 additions & 12 deletions

File tree

grammar-tools/MySQLParser.g4

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2961,13 +2961,13 @@ bitExpr: simpleExpr %bitExpr_rr*;
29612961

29622962
/*
29632963
* @CHANGED:
2964-
* Factored left recursion.
2964+
* Factored left recursion and introduced "simpleExprBody" for easier processing.
29652965
*/
29662966
simpleExpr: %simpleExpr_collate (CONCAT_PIPES_SYMBOL %simpleExpr_collate)*;
29672967

2968-
%simpleExpr_collate: %simpleExpr_factored (COLLATE_SYMBOL textOrIdentifier)?;
2968+
%simpleExpr_collate: simpleExprBody (COLLATE_SYMBOL textOrIdentifier)?;
29692969

2970-
%simpleExpr_factored:
2970+
simpleExprBody:
29712971
literal # simpleExprLiteral
29722972
| sumExpr # simpleExprSum
29732973
| variable (equal expr)? # simpleExprVariable

packages/mysql-on-sqlite/src/mysql/mysql-grammar.php

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/mysql-on-sqlite/src/sqlite/class-wp-pdo-mysql-on-sqlite.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3691,8 +3691,8 @@ private function translate( $node ): ?string {
36913691
return null;
36923692
}
36933693
return $this->translate_sequence( $node->get_children() );
3694-
case 'simpleExpr':
3695-
return $this->translate_simple_expr( $node );
3694+
case 'simpleExprBody':
3695+
return $this->translate_simple_expr_body( $node );
36963696
case 'predicateOperations':
36973697
$token = $node->get_first_child_token();
36983698
if ( WP_MySQL_Lexer::LIKE_SYMBOL === $token->id ) {
@@ -4204,13 +4204,13 @@ private function translate_query_specification( WP_Parser_Node $node ): string {
42044204
}
42054205

42064206
/**
4207-
* Translate a MySQL simple expression to SQLite.
4207+
* Translate a MySQL simple expression body to SQLite.
42084208
*
4209-
* @param WP_Parser_Node $node The "simpleExpr" AST node.
4209+
* @param WP_Parser_Node $node The "simpleExprBody" AST node.
42104210
* @return string The translated value.
42114211
* @throws WP_SQLite_Driver_Exception When the translation fails.
42124212
*/
4213-
private function translate_simple_expr( WP_Parser_Node $node ): string {
4213+
private function translate_simple_expr_body( WP_Parser_Node $node ): string {
42144214
$token = $node->get_first_child_token();
42154215

42164216
// Translate "VALUES(col)" to "excluded.col" in ON DUPLICATE KEY UPDATE.
@@ -5350,12 +5350,12 @@ private function store_last_column_meta_from_statement( PDOStatement $stmt ): vo
53505350
private function unnest_parenthesized_expression( WP_Parser_Node $node ): WP_Parser_Node {
53515351
$children = $node->get_children();
53525352

5353-
// Descend the "expr -> boolPri -> predicate -> bitExpr -> simpleExpr" tree,
5354-
// when on each level we have only a single child node (expression nesting).
5353+
// Descend the "expr -> boolPri -> predicate -> bitExpr -> simpleExpr" -> "simpleExprBody"
5354+
// tree, when on each level we have only a single child node (expression nesting).
53555355
if (
53565356
1 === count( $children )
53575357
&& $children[0] instanceof WP_Parser_Node
5358-
&& in_array( $children[0]->rule_name, array( 'expr', 'boolPri', 'predicate', 'bitExpr', 'simpleExpr' ), true )
5358+
&& in_array( $children[0]->rule_name, array( 'expr', 'boolPri', 'predicate', 'bitExpr', 'simpleExpr', 'simpleExprBody' ), true )
53595359
) {
53605360
$unnested = $this->unnest_parenthesized_expression( $children[0] );
53615361
return $unnested === $children[0] ? $node : $unnested;

0 commit comments

Comments
 (0)