处理issue:MYSQL兼容性下执行insert语句core
This commit is contained in:
@ -1739,15 +1739,45 @@ static void SetUpsertAttrnoState(ParseState* pstate, List *targetList)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isSubExprSupportRightRef(Node* node)
|
||||||
|
{
|
||||||
|
if (!node) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (IsA(node, A_Expr)) {
|
||||||
|
A_Expr* expr = (A_Expr*)node;
|
||||||
|
return isSubExprSupportRightRef(expr->lexpr) &&
|
||||||
|
isSubExprSupportRightRef(expr->rexpr);
|
||||||
|
} else if (IsA(node, SubLink)) {
|
||||||
|
SubLink* sl = (SubLink*)node;
|
||||||
|
if (sl->subselect) {
|
||||||
|
SelectStmt* subsel = (SelectStmt*)sl->subselect;
|
||||||
|
return (!subsel->whereClause || subsel->fromClause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static RightRefState* MakeRightRefStateIfSupported(SelectStmt* selectStmt)
|
static RightRefState* MakeRightRefStateIfSupported(SelectStmt* selectStmt)
|
||||||
{
|
{
|
||||||
bool isSupported = DB_IS_CMPT(B_FORMAT) && selectStmt && selectStmt->valuesLists && !IsInitdb;
|
bool isSupported = DB_IS_CMPT(B_FORMAT) && selectStmt && selectStmt->valuesLists && !IsInitdb;
|
||||||
if (isSupported) {
|
if (!isSupported) {
|
||||||
RightRefState* refState = (RightRefState*)palloc0(sizeof(RightRefState));
|
return nullptr;
|
||||||
refState->isSupported = true;
|
|
||||||
return refState;
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
ListCell* lc = NULL;
|
||||||
|
ListCell* lc2 = NULL;
|
||||||
|
foreach (lc, selectStmt->valuesLists) {
|
||||||
|
List* sublist = (List*)lfirst(lc);
|
||||||
|
foreach(lc2, sublist) {
|
||||||
|
Node* col = (Node*)lfirst(lc2);
|
||||||
|
if (!isSubExprSupportRightRef(col)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RightRefState* refState = (RightRefState*)palloc0(sizeof(RightRefState));
|
||||||
|
refState->isSupported = true;
|
||||||
|
return refState;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1008,6 +1008,17 @@ select @num;
|
|||||||
0
|
0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- test insert right ref
|
||||||
|
drop table if exists ins_sel_t0;
|
||||||
|
NOTICE: table "ins_sel_t0" does not exist, skipping
|
||||||
|
CREATE TABLE ins_sel_t0 ( c3 INT , c10 INT ) ;
|
||||||
|
INSERT INTO ins_sel_t0 VALUES ( -66 , 54 ) ,
|
||||||
|
( EXISTS ( SELECT 76 AS c42 WHERE c3 = 12 IS NOT FALSE ) NOT IN ( 75 >= -80 ) , -99 ) ; -- should error
|
||||||
|
ERROR: column "c3" does not exist
|
||||||
|
LINE 2: ( EXISTS ( SELECT 76 AS c42 WHERE c3 = 12 IS NOT FALSE )...
|
||||||
|
^
|
||||||
|
HINT: There is a column named "c3" in table "ins_sel_t0", but it cannot be referenced from this part of the query.
|
||||||
|
drop table ins_sel_t0;
|
||||||
--test as function parameter
|
--test as function parameter
|
||||||
set @num := 1;
|
set @num := 1;
|
||||||
select sin(@num := @num + 1) from t1;
|
select sin(@num := @num + 1) from t1;
|
||||||
|
@ -323,6 +323,13 @@ insert into t2 select @num + 10 from t1;
|
|||||||
select * from t2;
|
select * from t2;
|
||||||
select @num;
|
select @num;
|
||||||
|
|
||||||
|
-- test insert right ref
|
||||||
|
drop table if exists ins_sel_t0;
|
||||||
|
CREATE TABLE ins_sel_t0 ( c3 INT , c10 INT ) ;
|
||||||
|
INSERT INTO ins_sel_t0 VALUES ( -66 , 54 ) ,
|
||||||
|
( EXISTS ( SELECT 76 AS c42 WHERE c3 = 12 IS NOT FALSE ) NOT IN ( 75 >= -80 ) , -99 ) ; -- should error
|
||||||
|
drop table ins_sel_t0;
|
||||||
|
|
||||||
--test as function parameter
|
--test as function parameter
|
||||||
set @num := 1;
|
set @num := 1;
|
||||||
select sin(@num := @num + 1) from t1;
|
select sin(@num := @num + 1) from t1;
|
||||||
|
Reference in New Issue
Block a user