diff --git a/c/parser.php.lemon b/c/parser.php.lemon index 5d8ee12..b7f0395 100644 --- a/c/parser.php.lemon +++ b/c/parser.php.lemon @@ -379,8 +379,8 @@ update_statement(R) ::= update_clause(U) where_clause(W) limit_clause(L) . { zval_ptr_dtor(&$$); } -update_clause(R) ::= UPDATE associated_name(A) SET update_item_list(U) . { - phql_ret_update_clause(&R, &A, &U); +update_clause(R) ::= UPDATE associated_name(A) join_list_or_null(J) SET update_item_list(U) . { + phql_ret_update_clause(&R, &A, &J, &U); } %destructor update_item_list { diff --git a/resources/files/parser.php b/resources/files/parser.php index 5858ece..4313d0f 100644 --- a/resources/files/parser.php +++ b/resources/files/parser.php @@ -135,7 +135,7 @@ public function getOutput(): mixed const YYNOCODE = 135; const YYWILDCARD = 135; /* No %wildcard in this grammar; use YYNOCODE so the wildcard path never matches */ const YYNRULE = 162; - const YYNSTATE = 295; + const YYNSTATE = 296; const YYSTACKDEPTH = 100; /* The next thing included is series of defines which control ** various aspects of the generated parser. @@ -170,10 +170,10 @@ public function getOutput(): mixed ** YYERRORSYMBOL is the code number of the error symbol. If not ** defined, then do no error processing. */ - const YY_REDUCE_MAX = 90; + const YY_REDUCE_MAX = 181; #define phql_TOKENTYPE phql_parser_token* const YY_REDUCE_USE_DFLT = -67; - const YY_SHIFT_MAX = 192; + const YY_SHIFT_MAX = 295; const YY_SHIFT_USE_DFLT = -3; var $YY_ACCEPT_ACTION; @@ -338,7 +338,7 @@ public function getOutput(): mixed 85, 3, 113, - 4, + 5, 115, 3, 115, @@ -664,7 +664,7 @@ public function getOutput(): mixed /* 47 */ "update_statement ::= update_clause where_clause limit_clause", /* 48 */ - "update_clause ::= UPDATE associated_name SET update_item_list", + "update_clause ::= UPDATE associated_name join_list_or_null SET update_item_list", /* 49 */ "update_item_list ::= update_item_list COMMA update_item", /* 50 */ @@ -1572,7 +1572,7 @@ public function getOutput(): mixed 235, /* 490 */ 164, - 458, + 459, 294, 194, 195, @@ -1863,10 +1863,10 @@ public function getOutput(): mixed 185, 188, 149, - 298, + 299, 57, 76, - 298, + 299, /* 760 */ 230, 73, @@ -1874,274 +1874,819 @@ public function getOutput(): mixed 277, 36, 61, + 460, + 460, + 460, + 460, + /* 770 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 780 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 790 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 800 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 810 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 820 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 830 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 840 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 850 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 860 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 870 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 880 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 890 */ + 460, + 460, + 460, + 460, + 170, + 263, + 161, + 146, + 460, + 145, + /* 900 */ + 144, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 910 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 920 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 930 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 940 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 950 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 960 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 970 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 980 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 990 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1000 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1010 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1020 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1030 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1040 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1050 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1060 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1070 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1080 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1090 */ + 460, + 295, + 460, + 460, + 460, + 53, + 264, + 224, + 60, + 460, + /* 1100 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1110 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1120 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1130 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1140 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1150 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1160 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1170 */ + 460, + 460, + 460, + 460, + 460, + 460, + 57, + 460, + 460, + 460, + /* 1180 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1190 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1200 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1210 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1220 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1230 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1240 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1250 */ + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + 460, + /* 1260 */ + 460, + 460, ]; static $yy_default = [ /* 0 */ - 457, - 457, - 457, - 432, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 433, + 458, + 458, + 458, + 458, + 458, + 458, /* 10 */ - 315, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 316, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 20 */ - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 30 */ - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 40 */ - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 50 */ - 457, - 457, - 457, - 314, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 315, + 458, + 458, + 458, + 458, + 458, + 458, /* 60 */ - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 70 */ - 457, - 457, - 304, - 457, - 457, - 322, - 457, - 457, - 457, - 373, + 458, + 458, + 305, + 458, + 458, + 323, + 458, + 458, + 458, + 374, /* 80 */ - 386, - 366, - 364, - 380, - 364, - 386, - 364, - 384, - 333, - 378, + 387, + 367, + 365, + 381, + 365, + 387, + 365, + 385, + 334, + 379, /* 90 */ - 430, - 311, - 369, - 457, - 457, - 457, - 457, - 419, + 431, + 312, + 370, + 458, + 458, + 458, + 458, + 420, + 378, 377, - 376, /* 100 */ - 363, - 338, - 347, - 332, - 425, - 436, + 364, + 339, + 348, + 333, 426, + 437, + 427, + 441, 440, - 439, - 407, - /* 110 */ 408, - 406, - 403, + /* 110 */ + 409, + 407, 404, 405, - 398, + 406, 399, - 409, - 411, - 401, - /* 120 */ 400, + 410, + 412, 402, - 395, - 397, + /* 120 */ + 401, + 403, 396, - 392, - 394, + 398, + 397, 393, - 352, - 457, + 395, + 394, + 353, + 458, /* 130 */ - 457, - 381, - 457, - 457, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 382, + 458, + 458, + 458, + 458, + 458, + 458, + 458, + 458, /* 140 */ + 458, + 458, 457, 457, - 456, - 456, - 457, - 457, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, + 458, + 458, /* 150 */ - 457, - 457, - 412, - 457, - 457, - 457, - 457, - 457, - 457, - 372, + 458, + 458, + 413, + 458, + 458, + 458, + 458, + 458, + 458, + 373, /* 160 */ - 456, - 457, - 457, - 457, - 457, - 457, - 457, - 431, - 410, 457, + 458, + 458, + 458, + 458, + 458, + 458, + 432, + 411, + 458, /* 170 */ - 457, - 457, - 441, - 457, + 458, + 458, 442, - 457, - 457, - 457, - 457, - 365, + 458, + 443, + 458, + 458, + 458, + 458, + 366, /* 180 */ + 352, + 316, + 344, + 458, + 458, 351, - 457, - 343, - 457, - 457, - 350, - 457, - 457, - 457, - 457, + 458, + 458, + 458, + 458, /* 190 */ - 457, - 457, - 457, - 349, - 296, + 458, + 458, + 458, + 350, 297, 298, 299, 300, - 379, + 301, + 380, /* 200 */ - 382, - 387, + 383, 388, 389, 390, 391, - 383, - 367, - 370, + 392, + 384, + 368, 371, + 372, /* 210 */ - 301, - 312, - 353, + 302, + 313, 354, - 359, - 361, - 360, 355, + 360, + 362, + 361, 356, 357, - /* 220 */ 358, - 362, - 455, - 316, - 318, + /* 220 */ + 359, + 363, + 456, + 317, 319, - 437, + 320, 438, - 443, - 415, + 439, + 444, + 416, /* 230 */ - 418, - 420, + 419, 421, 422, 423, - 427, + 424, 428, - 433, - 435, - 444, - /* 240 */ + 429, + 434, + 436, 445, + /* 240 */ 446, 447, 448, @@ -2151,56 +2696,58 @@ public function getOutput(): mixed 452, 453, 454, + 455, /* 250 */ - 434, - 429, - 424, - 320, + 435, + 430, + 425, 321, - 323, + 322, 324, 325, 326, 327, - /* 260 */ 328, + /* 260 */ 329, 330, 331, - 317, - 313, - 305, - 307, + 332, + 318, + 314, + 306, 308, 309, - /* 270 */ 310, - 306, - 302, + /* 270 */ + 311, + 307, 303, - 413, - 416, + 304, 414, 417, - 368, - 374, - /* 280 */ + 415, + 418, + 369, 375, - 334, - 336, - 337, + /* 280 */ + 376, 335, - 339, - 341, + 337, + 338, + 336, 340, 342, - 385, + 341, + 343, + 386, /* 290 */ - 344, - 346, 345, - 348, - 295, + 347, + 346, + 349, + 296, + 458, ]; static $yy_lookahead = [ /* 0 */ @@ -3037,15 +3584,561 @@ public function getOutput(): mixed 31, 134, 48, - 50, + 50, + 134, + /* 760 */ + 46, + 50, + 46, + 46, + 45, + 45, + 134, + 134, + 134, + 134, + /* 770 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 780 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 790 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 800 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 810 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 820 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 830 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 840 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 850 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 860 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 870 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 880 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 890 */ + 134, + 134, + 134, + 134, + 34, + 35, + 36, + 37, + 134, + 39, + /* 900 */ + 40, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 910 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 920 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 930 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 940 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 950 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 960 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 970 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 980 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 990 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1000 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1010 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1020 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1030 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1040 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1050 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1060 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1070 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1080 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1090 */ + 134, + 97, + 134, + 134, + 134, + 101, + 102, + 103, + 104, + 134, + /* 1100 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1110 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1120 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1130 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1140 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1150 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1160 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1170 */ + 134, + 134, + 134, + 134, + 134, + 134, + 48, + 134, + 134, + 134, + /* 1180 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1190 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1200 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1210 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1220 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1230 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1240 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1250 */ + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + 134, + /* 1260 */ + 134, 134, - /* 760 */ - 46, - 50, - 46, - 46, - 45, - 45, ]; static $yy_reduce_ofst = [ /* 0 */ @@ -3149,6 +4242,106 @@ public function getOutput(): mixed 545, /* 90 */ 522, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 100 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 110 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 120 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 130 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 140 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 150 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 160 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 170 */ + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + -67, + /* 180 */ + -67, + 994, ]; /* The next table maps tokens into fallback tokens. If a construct @@ -3362,7 +4555,7 @@ public function getOutput(): mixed 725, /* 180 */ 708, - 709, + 860, 726, 714, 86, @@ -3375,6 +4568,119 @@ public function getOutput(): mixed 719, 720, 724, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 200 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 210 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 220 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 230 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 240 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 250 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 260 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 270 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 280 */ + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + /* 290 */ + -3, + -3, + -3, + -3, + -3, + 1128, ]; /* @@ -4182,10 +5488,11 @@ private function yy_reduce(int $yyruleno): void case 48: phql_ret_update_clause( $yygotominor, + $this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor ); - $this->yy_destructor(47, $this->yystack[$this->yyidx + -3]->minor); + $this->yy_destructor(47, $this->yystack[$this->yyidx + -4]->minor); $this->yy_destructor(48, $this->yystack[$this->yyidx + -1]->minor); break; case 51: @@ -5131,10 +6438,15 @@ function phql_ret_update_statement(array &$ret, $update, $where = null, $limit = } } -function phql_ret_update_clause(array &$ret, $tables, $values): void +function phql_ret_update_clause(array &$ret, $tables, $joins, $values): void { $ret = []; $ret['tables'] = $tables; + + if (!empty($joins)) { + $ret['joins'] = $joins; + } + $ret['values'] = $values; } diff --git a/tests/unit/Phql/Update/CombinationTest.php b/tests/unit/Phql/Update/CombinationTest.php index 818fecd..a8e1b7e 100644 --- a/tests/unit/Phql/Update/CombinationTest.php +++ b/tests/unit/Phql/Update/CombinationTest.php @@ -664,4 +664,76 @@ public function testMvcModelQueryPhqlUpdateWhereMultipleAndConditions(): void $actual = (new Parser())->parse($source); $this->assertSame($expected, $actual); } + + /** + * Tests UPDATE with an INNER JOIN used to filter the rows to update. + * + * @return void + * + * @issue https://github.com/phalcon/cphalcon/issues/16984 + * @author Phalcon Team + * @since 2026-06-06 + */ + public function testMvcModelQueryPhqlUpdateInnerJoinWhereNum(): void + { + $source = "UPDATE Invoices " + . "INNER JOIN Customers ON Customers.cst_id = Invoices.inv_cst_id " + . "SET inv_total = 999 " + . "WHERE Customers.cst_id = 1"; + $expected = [ + 'type' => Opcode::UPDATE->value, + 'update' => [ + 'tables' => [ + 'qualifiedName' => [ + 'type' => Opcode::QUALIFIED->value, + 'name' => 'Invoices', + ], + ], + 'joins' => [ + 'type' => Opcode::INNERJOIN->value, + 'qualified' => [ + 'type' => Opcode::QUALIFIED->value, + 'name' => 'Customers', + ], + 'conditions' => [ + 'type' => Opcode::EQUALS->value, + 'left' => [ + 'type' => Opcode::QUALIFIED->value, + 'domain' => 'Customers', + 'name' => 'cst_id', + ], + 'right' => [ + 'type' => Opcode::QUALIFIED->value, + 'domain' => 'Invoices', + 'name' => 'inv_cst_id', + ], + ], + ], + 'values' => [ + 'column' => [ + 'type' => Opcode::QUALIFIED->value, + 'name' => 'inv_total', + ], + 'expr' => [ + 'type' => Opcode::INTEGER->value, + 'value' => '999', + ], + ], + ], + 'where' => [ + 'type' => Opcode::EQUALS->value, + 'left' => [ + 'type' => Opcode::QUALIFIED->value, + 'domain' => 'Customers', + 'name' => 'cst_id', + ], + 'right' => [ + 'type' => Opcode::INTEGER->value, + 'value' => '1', + ], + ], + ]; + $actual = (new Parser())->parse($source); + $this->assertSame($expected, $actual); + } }