-
-
Notifications
You must be signed in to change notification settings - Fork 114
Expand file tree
/
Copy pathUpdateStatement.php
More file actions
158 lines (145 loc) · 4.23 KB
/
UpdateStatement.php
File metadata and controls
158 lines (145 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?php
declare(strict_types=1);
namespace PhpMyAdmin\SqlParser\Statements;
use PhpMyAdmin\SqlParser\Components\Condition;
use PhpMyAdmin\SqlParser\Components\Expression;
use PhpMyAdmin\SqlParser\Components\JoinKeyword;
use PhpMyAdmin\SqlParser\Components\Limit;
use PhpMyAdmin\SqlParser\Components\OrderKeyword;
use PhpMyAdmin\SqlParser\Components\SetOperation;
use PhpMyAdmin\SqlParser\Exceptions\ParserException;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Statement;
use PhpMyAdmin\SqlParser\Token;
use PhpMyAdmin\SqlParser\TokensList;
/**
* `UPDATE` statement.
*
* UPDATE [LOW_PRIORITY] [IGNORE] table_reference
* [INNER JOIN | LEFT JOIN | JOIN] T1 ON T1.C1 = T2.C1
* SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
* [WHERE where_condition]
* [ORDER BY ...]
* [LIMIT row_count]
*
* or
*
* UPDATE [LOW_PRIORITY] [IGNORE] table_references
* SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
* [WHERE where_condition]
*/
class UpdateStatement extends Statement
{
/**
* Options for `UPDATE` statements and their slot ID.
*
* @var array<string, int|array<int, int|string>>
* @psalm-var array<string, (positive-int|array{positive-int, ('var'|'var='|'expr'|'expr=')})>
*/
public static array $statementOptions = [
'LOW_PRIORITY' => 1,
'IGNORE' => 2,
];
/**
* The clauses of this statement, in order.
*
* @see Statement::$clauses
*
* @var array<string, array{non-empty-string, int-mask-of<self::ADD_*>}>
*/
public static array $clauses = [
'UPDATE' => [
'UPDATE',
Statement::ADD_KEYWORD,
],
// Used for options.
'_OPTIONS' => [
'_OPTIONS',
Statement::ADD_CLAUSE,
],
// Used for updated tables.
'_UPDATE' => [
'UPDATE',
Statement::ADD_CLAUSE,
],
'JOIN' => [
'JOIN',
Statement::ADD_CLAUSE,
],
'LEFT JOIN' => [
'LEFT JOIN',
Statement::ADD_CLAUSE,
],
'INNER JOIN' => [
'INNER JOIN',
Statement::ADD_CLAUSE,
],
'SET' => [
'SET',
Statement::ADD_CLAUSE | Statement::ADD_KEYWORD,
],
'WHERE' => [
'WHERE',
Statement::ADD_CLAUSE | Statement::ADD_KEYWORD,
],
'ORDER BY' => [
'ORDER BY',
Statement::ADD_CLAUSE | Statement::ADD_KEYWORD,
],
'LIMIT' => [
'LIMIT',
Statement::ADD_CLAUSE | Statement::ADD_KEYWORD,
],
];
/**
* Tables used as sources for this statement.
*
* @var Expression[]|null
*/
public array|null $tables = null;
/**
* The updated values.
*
* @var SetOperation[]|null
*/
public array|null $set = null;
/**
* Conditions used for filtering each row of the result set.
*
* @var Condition[]|null
*/
public array|null $where = null;
/**
* Specifies the order of the rows in the result set.
*
* @var OrderKeyword[]|null
*/
public array|null $order = null;
/**
* Conditions used for limiting the size of the result set.
*/
public Limit|null $limit = null;
/**
* Joins.
*
* @var JoinKeyword[]|null
*/
public array|null $join = null;
/**
* Function called after the token was processed.
* In the update statement, this is used to check that at least one assignment has been set to throw an error if a
* query like `UPDATE acme SET WHERE 1;` is parsed.
*
* @throws ParserException throws the exception, if strict mode is enabled.
*/
public function after(Parser $parser, TokensList $list, Token $token): void
{
/** @psalm-var string $tokenValue */
$tokenValue = $token->value;
// Ensure we finished to parse the "SET" token, and if yes, ensure that assignments are defined.
if ($this->set !== [] || (Parser::KEYWORD_PARSERS[$tokenValue]['field'] ?? null) !== 'set') {
return;
}
$parser->error('Missing assignment in SET operation.', $list->tokens[$list->idx]);
}
}