fix view of cstore table for update coredump
This commit is contained in:
@ -5125,6 +5125,29 @@ void CheckSelectLocking(Query* qry)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool CheckViewBasedOnCstore(Relation targetrel)
|
||||||
|
{
|
||||||
|
Assert(RelationIsView(targetrel));
|
||||||
|
|
||||||
|
Query* viewquery = get_view_query(targetrel);
|
||||||
|
ListCell* l = NULL;
|
||||||
|
|
||||||
|
foreach (l, viewquery->jointree->fromlist) {
|
||||||
|
RangeTblRef* rtr = (RangeTblRef*)lfirst(l);
|
||||||
|
RangeTblEntry* base_rte = rt_fetch(rtr->rtindex, viewquery->rtable);
|
||||||
|
Relation base_rel = try_relation_open(base_rte->relid, AccessShareLock);
|
||||||
|
|
||||||
|
if (RelationIsColStore(base_rel) || (RelationIsView(base_rel) && CheckViewBasedOnCstore(base_rel))) {
|
||||||
|
heap_close(base_rel, AccessShareLock);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
heap_close(base_rel, AccessShareLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transform a FOR [KEY] UPDATE/SHARE clause
|
* Transform a FOR [KEY] UPDATE/SHARE clause
|
||||||
*
|
*
|
||||||
@ -5187,6 +5210,12 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
|
|||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with "
|
errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with "
|
||||||
"column table \"%s\"", rte->eref->aliasname)));
|
"column table \"%s\"", rte->eref->aliasname)));
|
||||||
|
} else if (RelationIsView(rel) && CheckViewBasedOnCstore(rel)) {
|
||||||
|
heap_close(rel, AccessShareLock);
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with "
|
||||||
|
"view \"%s\" based on column table", rte->eref->aliasname)));
|
||||||
} else {
|
} else {
|
||||||
if (!RelationIsAstoreFormat(rel) && lc->waitPolicy == LockWaitSkip) {
|
if (!RelationIsAstoreFormat(rel) && lc->waitPolicy == LockWaitSkip) {
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -5253,6 +5282,13 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
|
|||||||
errmsg("SELECT FOR UPDATE/SHARE%s cannot be used with column table \"%s\"",
|
errmsg("SELECT FOR UPDATE/SHARE%s cannot be used with column table \"%s\"",
|
||||||
NOKEYUPDATE_KEYSHARE_ERRMSG, rte->eref->aliasname),
|
NOKEYUPDATE_KEYSHARE_ERRMSG, rte->eref->aliasname),
|
||||||
parser_errposition(pstate, thisrel->location)));
|
parser_errposition(pstate, thisrel->location)));
|
||||||
|
} else if (RelationIsView(rel) && CheckViewBasedOnCstore(rel)) {
|
||||||
|
heap_close(rel, AccessShareLock);
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg("SELECT FOR UPDATE/SHARE%s cannot be used with view \"%s\" based on"
|
||||||
|
" column table", NOKEYUPDATE_KEYSHARE_ERRMSG, rte->eref->aliasname),
|
||||||
|
parser_errposition(pstate, thisrel->location)));
|
||||||
} else {
|
} else {
|
||||||
if (!RelationIsAstoreFormat(rel) && lc->waitPolicy == LockWaitSkip) {
|
if (!RelationIsAstoreFormat(rel) && lc->waitPolicy == LockWaitSkip) {
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
|
@ -116,6 +116,23 @@ RESET ENABLE_HASHAGG;
|
|||||||
-- LockRows
|
-- LockRows
|
||||||
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 FOR UPDATE;
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 FOR UPDATE;
|
||||||
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with column table "vector_table_01"
|
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with column table "vector_table_01"
|
||||||
|
-- LockRows for view
|
||||||
|
CREATE VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW AS SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01;
|
||||||
|
CREATE VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 AS SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW;
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW FOR UPDATE;
|
||||||
|
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with view "vector_table_01_view" based on column table
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW FOR UPDATE OF VECTOR_TABLE_01_VIEW;
|
||||||
|
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with view "vector_table_01_view" based on column table
|
||||||
|
LINE 1: ..._VECTOR_ENGINE.VECTOR_TABLE_01_VIEW FOR UPDATE OF VECTOR_TAB...
|
||||||
|
^
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 FOR UPDATE;
|
||||||
|
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with view "vector_table_01_view1" based on column table
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 FOR UPDATE OF VECTOR_TABLE_01_VIEW1;
|
||||||
|
ERROR: SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with view "vector_table_01_view1" based on column table
|
||||||
|
LINE 1: ...VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 FOR UPDATE OF VECTOR_TAB...
|
||||||
|
^
|
||||||
|
DROP VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1;
|
||||||
|
DROP VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW;
|
||||||
-- CteScan
|
-- CteScan
|
||||||
-- HashJoin, MergeJoin, NestLoop, Materialize
|
-- HashJoin, MergeJoin, NestLoop, Materialize
|
||||||
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 T1, DISABLE_VECTOR_ENGINE.VECTOR_TABLE_02 T2 WHERE T1.DEPNAME=T2.DEPNAME;
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 T1, DISABLE_VECTOR_ENGINE.VECTOR_TABLE_02 T2 WHERE T1.DEPNAME=T2.DEPNAME;
|
||||||
|
@ -60,6 +60,19 @@ RESET ENABLE_HASHAGG;
|
|||||||
-- LockRows
|
-- LockRows
|
||||||
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 FOR UPDATE;
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01 FOR UPDATE;
|
||||||
|
|
||||||
|
-- LockRows for view
|
||||||
|
CREATE VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW AS SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01;
|
||||||
|
CREATE VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 AS SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW;
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW FOR UPDATE;
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW FOR UPDATE OF VECTOR_TABLE_01_VIEW;
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 FOR UPDATE;
|
||||||
|
EXPLAIN (COSTS OFF) SELECT * FROM DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1 FOR UPDATE OF VECTOR_TABLE_01_VIEW1;
|
||||||
|
|
||||||
|
DROP VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW1;
|
||||||
|
DROP VIEW DISABLE_VECTOR_ENGINE.VECTOR_TABLE_01_VIEW;
|
||||||
|
|
||||||
-- CteScan
|
-- CteScan
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user