parser: support := in assignment on UPDATE (#44756)

close pingcap/tidb#44751
This commit is contained in:
CbcWestwolf
2023-06-19 11:23:09 +08:00
committed by GitHub
parent 8b1006f1af
commit a52ac396df
3 changed files with 677 additions and 674 deletions

File diff suppressed because it is too large Load Diff

View File

@ -3157,7 +3157,7 @@ AnalyzeOption:
/*******************************************************************************************/
Assignment:
ColumnName eq ExprOrDefault
ColumnName EqOrAssignmentEq ExprOrDefault
{
$$ = &ast.Assignment{Column: $1.(*ast.ColumnName), Expr: $3}
}
@ -7118,7 +7118,7 @@ ExprOrDefault:
}
ColumnSetValueList:
ColumnName eq ExprOrDefault
ColumnName EqOrAssignmentEq ExprOrDefault
{
$$ = &ast.InsertStmt{
Columns: []*ast.ColumnName{$1.(*ast.ColumnName)},
@ -7126,7 +7126,7 @@ ColumnSetValueList:
Setlist: true,
}
}
| ColumnSetValueList ',' ColumnName eq ExprOrDefault
| ColumnSetValueList ',' ColumnName EqOrAssignmentEq ExprOrDefault
{
ins := $1.(*ast.InsertStmt)
ins.Columns = append(ins.Columns, $3.(*ast.ColumnName))
@ -10314,11 +10314,11 @@ SetStmt:
{
$$ = &ast.SetStmt{Variables: $2.([]*ast.VariableAssignment)}
}
| "SET" "PASSWORD" eq PasswordOpt
| "SET" "PASSWORD" EqOrAssignmentEq PasswordOpt
{
$$ = &ast.SetPwdStmt{Password: $4}
}
| "SET" "PASSWORD" "FOR" Username eq PasswordOpt
| "SET" "PASSWORD" "FOR" Username EqOrAssignmentEq PasswordOpt
{
$$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6}
}

View File

@ -870,7 +870,9 @@ func TestDMLStmt(t *testing.T) {
// for on duplicate key update
{"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"},
{"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b);", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"},
{"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true, "INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"},
{"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c:=VALUES(a)+VALUES(b);", true, "INSERT IGNORE INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`)"},
// for insert ... set
{"INSERT INTO t SET a=1,b=2", true, "INSERT INTO `t` SET `a`=1,`b`=2"},
@ -3505,6 +3507,7 @@ func TestDDL(t *testing.T) {
// for issue 549
{"insert into t set a = default", true, "INSERT INTO `t` SET `a`=DEFAULT"},
{"insert into t set a := default", true, "INSERT INTO `t` SET `a`=DEFAULT"},
{"replace t set a = default", true, "REPLACE INTO `t` SET `a`=DEFAULT"},
{"update t set a = default", true, "UPDATE `t` SET `a`=DEFAULT"},
{"insert into t set a = default on duplicate key update a = default", true, "INSERT INTO `t` SET `a`=DEFAULT ON DUPLICATE KEY UPDATE `a`=DEFAULT"},