!5828 物化视图功能增强,补齐功能,包括支持删除操作

Merge pull request !5828 from TinyBag/matview
This commit is contained in:
opengauss_bot
2024-10-09 08:58:23 +00:00
committed by Gitee
42 changed files with 1255 additions and 50 deletions

View File

@ -62,6 +62,6 @@
#define NAILED_IN_CATALOG_NUM 8
#define CATALOG_NUM 110
#define CATALOG_NUM 111
#endif

View File

@ -73,6 +73,11 @@ extern void insert_matviewdep_tuple(Oid matviewOid, Oid relid, Oid mlogid);
extern void delete_matviewdep_tuple(Oid matviewOid);
extern void delete_matdep_table(Oid mlogid);
extern void insert_matview_log_tuple(Oid mlog, Oid relid);
extern Oid delete_matview_log_tuple(Oid relid);
extern void invalidate_matdep_mlog(Oid relid);
extern void validate_matdep_mlog(Oid mlogid, Oid relid);
extern Datum get_matview_refreshtime(Oid matviewOid, bool *isNUll);
extern Datum get_matview_mapid(Oid matviewOid);
extern bool is_incremental_matview(Oid oid);

View File

@ -0,0 +1,23 @@
#ifndef GS_MATVIEW_LOG_H
#define GS_MATVIEW_LOG_H
#include "catalog/genbki.h"
#include "nodes/parsenodes.h"
#define MatviewLogRelationId 9753
#define MatviewLogRelationId_Rowtype_Id 9756
CATALOG(gs_matview_log,9753) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO
{
Oid mlogid;
Oid relid;
} FormData_gs_matview_log;
typedef FormData_gs_matview_log *Form_gs_matview_log;
#define Natts_gs_matview_log 2
#define Anum_gs_matview_log_mlogid 1
#define Anum_gs_matview_relid 2
#endif /* GS_MATVIEW_LOG_H */

View File

@ -621,6 +621,10 @@ DECLARE_UNIQUE_INDEX(gs_matview_oid_index, 9991, on gs_matview using btree(oid o
#define GsMatviewOidIndexId 9991
DECLARE_UNIQUE_INDEX(gs_matviewdep_oid_index, 9992, on gs_matview_dependency using btree(oid oid_ops));
#define GsMatviewDepOidIndexId 9992
DECLARE_UNIQUE_INDEX(gs_matviewlog_mlogid_index, 9754, on gs_matview_log using btree(mlogid oid_ops));
#define GsMatviewLogMlogIdIndexId 9754
DECLARE_UNIQUE_INDEX(gs_matviewlog_relid_index, 9755, on gs_matview_log using btree(relid oid_ops));
#define GsMatviewLogRelidIndexId 9755
/* Add indexes for pg_recyclebin */
DECLARE_UNIQUE_INDEX(gs_recyclebin_id_index, 8647, on gs_recyclebin using btree(oid oid_ops));

View File

@ -0,0 +1,4 @@
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_mlogid_index;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_relid_index;
DROP TABLE IF EXISTS pg_catalog.gs_matview_log;
DROP TYPE IF EXISTS pg_catalog.gs_matview_log;

View File

@ -0,0 +1,4 @@
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_mlogid_index;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_relid_index;
DROP TABLE IF EXISTS pg_catalog.gs_matview_log;
DROP TYPE IF EXISTS pg_catalog.gs_matview_log;

View File

@ -0,0 +1,18 @@
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 9753, 9756, 0, 0;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_mlogid_index;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_relid_index;
DROP TABLE IF EXISTS pg_catalog.gs_matview_log;
DROP TYPE IF EXISTS pg_catalog.gs_matview_log;
CREATE TABLE IF NOT EXISTS pg_catalog.gs_matview_log
(
mlogid Oid NOCOMPRESS NOT NULL,
relid Oid NOCOMPRESS NOT NULL
);
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 9754;
CREATE UNIQUE INDEX gs_matviewlog_mlogid_index ON pg_catalog.gs_matview_log USING BTREE(mlogid oid_ops);
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 9755;
CREATE UNIQUE INDEX gs_matviewlog_relid_index ON pg_catalog.gs_matview_log USING BTREE(relid oid_ops);
GRANT SELECT ON TABLE pg_catalog.gs_matview_log TO PUBLIC;
INSERT INTO pg_catalog.gs_matview_log SELECT DISTINCT mlogid, relid FROM pg_catalog.gs_matview_dependency;

View File

@ -0,0 +1,18 @@
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 9753, 9756, 0, 0;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_mlogid_index;
DROP INDEX IF EXISTS pg_catalog.gs_matviewlog_relid_index;
DROP TABLE IF EXISTS pg_catalog.gs_matview_log;
DROP TYPE IF EXISTS pg_catalog.gs_matview_log;
CREATE TABLE IF NOT EXISTS pg_catalog.gs_matview_log
(
mlogid Oid NOCOMPRESS NOT NULL,
relid Oid NOCOMPRESS NOT NULL
);
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 9754;
CREATE UNIQUE INDEX gs_matviewlog_mlogid_index ON pg_catalog.gs_matview_log USING BTREE(mlogid oid_ops);
SET LOCAL inplace_upgrade_next_system_object_oids = IUO_CATALOG, false, true, 0, 0, 0, 9755;
CREATE UNIQUE INDEX gs_matviewlog_relid_index ON pg_catalog.gs_matview_log USING BTREE(relid oid_ops);
GRANT SELECT ON TABLE pg_catalog.gs_matview_log TO PUBLIC;
INSERT INTO pg_catalog.gs_matview_log SELECT DISTINCT mlogid, relid FROM pg_catalog.gs_matview_dependency;

View File

@ -67,10 +67,14 @@ extern Oid create_matview_map(Oid intoRelationId);
extern void insert_into_matview_map(Oid mapid, Oid matid, ItemPointer matcitd,
Oid relid, ItemPointer relctid, TransactionId xid);
extern Oid find_matview_mlog_table(Oid relid);
extern bool is_table_in_incre_matview(Oid relid);
extern void insert_into_mlog_table(Relation rel, Oid mlogid, HeapTuple tuple,
ItemPointer tid, TransactionId xid, char action);
extern void create_matview_meta(Query *query, RangeVar *rel, bool incremental);
extern ObjectAddress CreateMatViewLog(CreateMatViewLogStmt* parse_tree);
extern void DropMatViewLog(DropMatViewLogStmt* parse_tree);
extern void check_matview_op_supported(CreateTableAsStmt *ctas);
extern DistributeBy *infer_incmatview_distkey(CreateTableAsStmt *stmt);
extern void check_basetable_permission(Query *query);

View File

@ -246,6 +246,7 @@ extern void ExecuteTimeCapsule(TimeCapsuleStmt* stmt);
extern void truncate_check_rel(Relation rel);
extern void CheckDropViewValidity(ObjectType stmtType, char relKind, const char* relname);
extern int getPartitionElementsIndexByOid(Relation partTableRel, Oid partOid);
extern void DropRelationPermissionCheck(char relkind, Oid relOid, Oid nspOid, const char* relname);
extern void SetPartionIndexType(IndexStmt* stmt, Relation rel, bool is_alter_table);
extern bool ConstraintSatisfyAutoIncrement(HeapTuple tuple, TupleDesc desc, AttrNumber attrnum, char contype);

View File

@ -589,6 +589,8 @@ typedef enum NodeTag {
T_ShrinkStmt,
T_VariableMultiSetStmt,
T_CursorExpression,
T_CreateMatViewLogStmt,
T_DropMatViewLogStmt,
/*
* TAGS FOR PARSE TREE NODES (parsenodes.h)
* note: TAGS FOR PARSE TREE NODES (parsenodes.h) can no longer place new tags,

View File

@ -2188,6 +2188,26 @@ typedef struct RefreshMatViewStmt
RangeVar *relation; /* relation to insert into */
} RefreshMatViewStmt;
/* ----------------------
* CREATE MATERIALIZED VIEW LOG Statement
* ----------------------
*/
typedef struct CreateMatViewLogStmt
{
NodeTag type;
RangeVar* relation; /* relation to create matview log for */
} CreateMatViewLogStmt;
/* ----------------------
* DROP MATERIALIZED VIEW LOG Statement
* ----------------------
*/
typedef struct DropMatViewLogStmt
{
NodeTag type;
RangeVar* relation; /* relation to drop matview log from */
} DropMatViewLogStmt;
/* ----------------------
* Checkpoint Statement
* ----------------------

View File

@ -85,6 +85,7 @@ PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD)
PG_KEYWORD("both", BOTH, RESERVED_KEYWORD)
PG_KEYWORD("bucketcnt", BUCKETCNT, COL_NAME_KEYWORD)
PG_KEYWORD("buckets", BUCKETS, RESERVED_KEYWORD)
PG_KEYWORD("build", BUILD, UNRESERVED_KEYWORD)
PG_KEYWORD("by", BY, UNRESERVED_KEYWORD)
PG_KEYWORD("byte", BYTE_P, UNRESERVED_KEYWORD)
PG_KEYWORD("byteawithoutorder", BYTEAWITHOUTORDER, COL_NAME_KEYWORD)

View File

@ -292,6 +292,7 @@ typedef struct RelationData {
/* double linked list node, partition and bucket relation would be stored in fakerels list of resource owner */
dlist_node node;
/* only valid if has mlog and used by incremental matview */
Oid rd_mlogoid;
/* Is under the context of creating crossbucket index? */
bool newcbi;