Merge pull request #2866 from citusdata/fix_83_regression

Do not record relation accessess unnecessarily
pull/2881/head
Önder Kalacı 2019-08-08 18:47:58 +02:00 committed by GitHub
commit e21578f3af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 342 additions and 301 deletions

View File

@ -2346,6 +2346,8 @@ CitusCopyDestReceiverStartup(DestReceiver *dest, int operation,
copyDest->shardStateHash = CreateShardStateHash(TopTransactionContext); copyDest->shardStateHash = CreateShardStateHash(TopTransactionContext);
copyDest->connectionStateHash = CreateConnectionStateHash(TopTransactionContext); copyDest->connectionStateHash = CreateConnectionStateHash(TopTransactionContext);
RecordRelationAccessIfReferenceTable(tableId, PLACEMENT_ACCESS_DML);
} }

View File

@ -418,11 +418,15 @@ PlanAlterTableStmt(AlterTableStmt *alterTableStatement, const char *alterTableCo
command); command);
} }
if (executeSequentially)
{
SetLocalMultiShardModifyModeToSequential();
}
ddlJob = palloc0(sizeof(DDLJob)); ddlJob = palloc0(sizeof(DDLJob));
ddlJob->targetRelationId = leftRelationId; ddlJob->targetRelationId = leftRelationId;
ddlJob->concurrentIndexCmd = false; ddlJob->concurrentIndexCmd = false;
ddlJob->commandString = alterTableCommand; ddlJob->commandString = alterTableCommand;
ddlJob->executeSequentially = executeSequentially;
if (rightRelationId) if (rightRelationId)
{ {

View File

@ -553,7 +553,6 @@ static void
ExecuteDistributedDDLJob(DDLJob *ddlJob) ExecuteDistributedDDLJob(DDLJob *ddlJob)
{ {
bool shouldSyncMetadata = ShouldSyncTableMetadata(ddlJob->targetRelationId); bool shouldSyncMetadata = ShouldSyncTableMetadata(ddlJob->targetRelationId);
int targetPoolSize = ddlJob->executeSequentially ? 1 : MaxAdaptiveExecutorPoolSize;
EnsureCoordinator(); EnsureCoordinator();
EnsurePartitionTableNotReplicated(ddlJob->targetRelationId); EnsurePartitionTableNotReplicated(ddlJob->targetRelationId);
@ -579,8 +578,7 @@ ExecuteDistributedDDLJob(DDLJob *ddlJob)
} }
/* use adaptive executor when enabled */ /* use adaptive executor when enabled */
ExecuteUtilityTaskListWithoutResults(ddlJob->taskList, targetPoolSize, ExecuteUtilityTaskListWithoutResults(ddlJob->taskList);
ddlJob->executeSequentially);
} }
else else
{ {
@ -592,8 +590,7 @@ ExecuteDistributedDDLJob(DDLJob *ddlJob)
PG_TRY(); PG_TRY();
{ {
/* use adaptive executor when enabled */ /* use adaptive executor when enabled */
ExecuteUtilityTaskListWithoutResults(ddlJob->taskList, targetPoolSize, ExecuteUtilityTaskListWithoutResults(ddlJob->taskList);
ddlJob->executeSequentially);
if (shouldSyncMetadata) if (shouldSyncMetadata)
{ {

View File

@ -74,7 +74,6 @@ ProcessVacuumStmt(VacuumStmt *vacuumStmt, const char *vacuumCommand)
{ {
List *vacuumColumnList = NIL; List *vacuumColumnList = NIL;
List *taskList = NIL; List *taskList = NIL;
int targetPoolSize = MaxAdaptiveExecutorPoolSize;
/* /*
* VACUUM commands cannot run inside a transaction block, so we use * VACUUM commands cannot run inside a transaction block, so we use
@ -94,7 +93,7 @@ ProcessVacuumStmt(VacuumStmt *vacuumStmt, const char *vacuumCommand)
taskList = VacuumTaskList(relationId, vacuumStmt->options, vacuumColumnList); taskList = VacuumTaskList(relationId, vacuumStmt->options, vacuumColumnList);
/* use adaptive executor when enabled */ /* use adaptive executor when enabled */
ExecuteUtilityTaskListWithoutResults(taskList, targetPoolSize, false); ExecuteUtilityTaskListWithoutResults(taskList);
executedVacuumCount++; executedVacuumCount++;
} }
relationIndex++; relationIndex++;

View File

@ -366,6 +366,8 @@ AssignPlacementListToConnection(List *placementAccessList, MultiConnection *conn
ConnectionPlacementHashEntry *placementEntry = NULL; ConnectionPlacementHashEntry *placementEntry = NULL;
ConnectionReference *placementConnection = NULL; ConnectionReference *placementConnection = NULL;
Oid relationId = InvalidOid;
if (placement->shardId == INVALID_SHARD_ID) if (placement->shardId == INVALID_SHARD_ID)
{ {
/* /*
@ -452,8 +454,9 @@ AssignPlacementListToConnection(List *placementAccessList, MultiConnection *conn
placementConnection->hadDML = true; placementConnection->hadDML = true;
} }
/* record the relation access mapping */ /* record the relation access */
AssociatePlacementAccessWithRelation(placement, accessType); relationId = RelationIdForShard(placement->shardId);
RecordRelationAccessIfReferenceTable(relationId, accessType);
} }
} }
@ -700,9 +703,6 @@ FindPlacementListConnection(int flags, List *placementAccessList, const char *us
Assert(!placementConnection->hadDML); Assert(!placementConnection->hadDML);
Assert(accessType != PLACEMENT_ACCESS_DDL); Assert(accessType != PLACEMENT_ACCESS_DDL);
} }
/* record the relation access mapping */
AssociatePlacementAccessWithRelation(placement, accessType);
} }
return chosenConnection; return chosenConnection;

View File

@ -657,17 +657,15 @@ AdaptiveExecutor(CustomScanState *node)
* through router executor. * through router executor.
*/ */
void void
ExecuteUtilityTaskListWithoutResults(List *taskList, int targetPoolSize, ExecuteUtilityTaskListWithoutResults(List *taskList)
bool forceSequentialExecution)
{ {
if (TaskExecutorType == MULTI_EXECUTOR_ADAPTIVE) if (TaskExecutorType == MULTI_EXECUTOR_ADAPTIVE)
{ {
ExecuteTaskList(ROW_MODIFY_NONE, taskList, targetPoolSize); ExecuteTaskList(ROW_MODIFY_NONE, taskList, MaxAdaptiveExecutorPoolSize);
} }
else else
{ {
if (MultiShardConnectionType == SEQUENTIAL_CONNECTION || if (MultiShardConnectionType == SEQUENTIAL_CONNECTION)
forceSequentialExecution)
{ {
ExecuteModifyTasksSequentiallyWithoutResults(taskList, ROW_MODIFY_NONE); ExecuteModifyTasksSequentiallyWithoutResults(taskList, ROW_MODIFY_NONE);
} }

View File

@ -77,8 +77,7 @@ citus_truncate_trigger(PG_FUNCTION_ARGS)
{ {
List *taskList = TruncateTaskList(relationId); List *taskList = TruncateTaskList(relationId);
ExecuteUtilityTaskListWithoutResults(taskList, MaxAdaptiveExecutorPoolSize, ExecuteUtilityTaskListWithoutResults(taskList);
false);
} }
PG_RETURN_DATUM(PointerGetDatum(NULL)); PG_RETURN_DATUM(PointerGetDatum(NULL));

View File

@ -82,7 +82,7 @@ static HTAB *RelationAccessHash;
/* functions related to access recording */ /* functions related to access recording */
static void RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType); static void RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType);
static void RecordPlacementAccessToCache(Oid relationId, static void RecordPlacementAccessToCache(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);
static void RecordRelationParallelSelectAccessForTask(Task *task); static void RecordRelationParallelSelectAccessForTask(Task *task);
@ -148,25 +148,32 @@ AllocateRelationAccessHash(void)
/* /*
* AssociatePlacementAccessWithRelation associates the placement access to the * RecordRelationAccessIfReferenceTable marks the relation accessed if it is a
* distributed relation that the placement belongs to. * reference relation.
*
* The function is a wrapper around RecordRelationAccessBase().
*/ */
void void
AssociatePlacementAccessWithRelation(ShardPlacement *placement, RecordRelationAccessIfReferenceTable(Oid relationId, ShardPlacementAccessType accessType)
ShardPlacementAccessType accessType)
{ {
Oid relationId = InvalidOid;
uint64 shardId = INVALID_SHARD_ID;
if (!ShouldRecordRelationAccess()) if (!ShouldRecordRelationAccess())
{ {
return; return;
} }
shardId = placement->shardId; /*
relationId = RelationIdForShard(shardId); * We keep track of relation accesses for the purposes of foreign keys to
* reference tables. So, other distributed tables are not relevant for now.
* Additionally, partitioned tables with lots of partitions might require
* recursively calling RecordRelationAccessBase(), so becareful about
* removing this check.
*/
if (PartitionMethod(relationId) != DISTRIBUTE_BY_NONE)
{
return;
}
RecordRelationAccess(relationId, accessType); RecordRelationAccessBase(relationId, accessType);
} }
@ -205,15 +212,15 @@ PlacementAccessTypeToText(ShardPlacementAccessType accessType)
/* /*
* RecordRelationAccess associates the access to the distributed relation. The * RecordRelationAccessBase associates the access to the distributed relation. The
* function takes partitioned relations into account as well. * function takes partitioned relations into account as well.
* *
* We implemented this function to prevent accessing placement metadata during * We implemented this function to prevent accessing placement metadata during
* recursive calls of the function itself (e.g., avoid * recursive calls of the function itself (e.g., avoid
* AssociatePlacementAccessWithRelation()). * RecordRelationAccessBase()).
*/ */
static void static void
RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType) RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType)
{ {
/* make sure that this is not a conflicting access */ /* make sure that this is not a conflicting access */
CheckConflictingRelationAccesses(relationId, accessType); CheckConflictingRelationAccesses(relationId, accessType);
@ -244,7 +251,7 @@ RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType)
} }
/* recursively call the function to cover multi-level partitioned tables */ /* recursively call the function to cover multi-level partitioned tables */
RecordRelationAccess(partitionOid, accessType); RecordRelationAccessBase(partitionOid, accessType);
} }
} }
else if (PartitionTableNoLock(relationId)) else if (PartitionTableNoLock(relationId))
@ -680,7 +687,7 @@ GetRelationAccessMode(Oid relationId, ShardPlacementAccessType accessType)
} }
else else
{ {
return RELATION_SEQUENTIAL_ACCESSED; return RELATION_REFERENCE_ACCESSED;
} }
} }

View File

@ -37,7 +37,6 @@ typedef struct DDLJob
{ {
Oid targetRelationId; /* oid of the target distributed relation */ Oid targetRelationId; /* oid of the target distributed relation */
bool concurrentIndexCmd; /* related to a CONCURRENTLY index command? */ bool concurrentIndexCmd; /* related to a CONCURRENTLY index command? */
bool executeSequentially;
const char *commandString; /* initial (coordinator) DDL command string */ const char *commandString; /* initial (coordinator) DDL command string */
List *taskList; /* worker DDL tasks to execute */ List *taskList; /* worker DDL tasks to execute */
} DDLJob; } DDLJob;

View File

@ -42,8 +42,7 @@ extern uint64 ExecuteTaskListExtended(RowModifyLevel modLevel, List *taskList,
TupleDesc tupleDescriptor, TupleDesc tupleDescriptor,
Tuplestorestate *tupleStore, Tuplestorestate *tupleStore,
bool hasReturning, int targetPoolSize); bool hasReturning, int targetPoolSize);
extern void ExecuteUtilityTaskListWithoutResults(List *taskList, int targetPoolSize, extern void ExecuteUtilityTaskListWithoutResults(List *taskList);
bool forceSequentialExecution);
extern uint64 ExecuteTaskList(RowModifyLevel modLevel, List *taskList, int extern uint64 ExecuteTaskList(RowModifyLevel modLevel, List *taskList, int
targetPoolSize); targetPoolSize);
extern TupleTableSlot * CitusExecScan(CustomScanState *node); extern TupleTableSlot * CitusExecScan(CustomScanState *node);

View File

@ -23,13 +23,20 @@ struct ShardPlacement;
typedef enum RelationAccessMode typedef enum RelationAccessMode
{ {
RELATION_NOT_ACCESSED, RELATION_NOT_ACCESSED,
RELATION_SEQUENTIAL_ACCESSED,
/* only valid for reference tables */
RELATION_REFERENCE_ACCESSED,
/*
* Only valid for distributed tables and set
* if table is accessed in parallel mode
*/
RELATION_PARALLEL_ACCESSED RELATION_PARALLEL_ACCESSED
} RelationAccessMode; } RelationAccessMode;
extern void AllocateRelationAccessHash(void); extern void AllocateRelationAccessHash(void);
extern void ResetRelationAccessHash(void); extern void ResetRelationAccessHash(void);
extern void AssociatePlacementAccessWithRelation(ShardPlacement *placement, extern void RecordRelationAccessIfReferenceTable(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);
extern void RecordParallelRelationAccessForTaskList(List *taskList); extern void RecordParallelRelationAccessForTaskList(List *taskList);
extern void RecordParallelSelectAccess(Oid relationId); extern void RecordParallelSelectAccess(Oid relationId);

View File

@ -1064,8 +1064,6 @@ ADD CONSTRAINT
fkey_delete FOREIGN KEY(value_1) fkey_delete FOREIGN KEY(value_1)
REFERENCES REFERENCES
reference_table(id) ON DELETE CASCADE; reference_table(id) ON DELETE CASCADE;
DEBUG: switching to sequential query execution mode
DETAIL: Reference relation "reference_table" is modified, which might lead to data inconsistencies or distributed deadlocks via parallel accesses to hash distributed relations due to foreign keys. Any parallel modification to those hash distributed relations in the same transaction can only be executed in sequential query execution mode
INSERT INTO reference_table SELECT i FROM generate_series(0, 10) i; INSERT INTO reference_table SELECT i FROM generate_series(0, 10) i;
DEBUG: distributed INSERT ... SELECT can only select from distributed tables DEBUG: distributed INSERT ... SELECT can only select from distributed tables
DEBUG: Collecting INSERT ... SELECT results on coordinator DEBUG: Collecting INSERT ... SELECT results on coordinator

View File

@ -1064,8 +1064,6 @@ ADD CONSTRAINT
fkey_delete FOREIGN KEY(value_1) fkey_delete FOREIGN KEY(value_1)
REFERENCES REFERENCES
reference_table(id) ON DELETE CASCADE; reference_table(id) ON DELETE CASCADE;
DEBUG: switching to sequential query execution mode
DETAIL: Reference relation "reference_table" is modified, which might lead to data inconsistencies or distributed deadlocks via parallel accesses to hash distributed relations due to foreign keys. Any parallel modification to those hash distributed relations in the same transaction can only be executed in sequential query execution mode
INSERT INTO reference_table SELECT i FROM generate_series(0, 10) i; INSERT INTO reference_table SELECT i FROM generate_series(0, 10) i;
DEBUG: distributed INSERT ... SELECT can only select from distributed tables DEBUG: distributed INSERT ... SELECT can only select from distributed tables
DEBUG: Collecting INSERT ... SELECT results on coordinator DEBUG: Collecting INSERT ... SELECT results on coordinator

View File

@ -22,14 +22,30 @@ CREATE OR REPLACE FUNCTION relation_ddl_access_mode(relationId Oid)
RETURNS int RETURNS int
LANGUAGE C STABLE STRICT LANGUAGE C STABLE STRICT
AS 'citus', $$relation_ddl_access_mode$$; AS 'citus', $$relation_ddl_access_mode$$;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relationShardAccess int) CREATE OR REPLACE FUNCTION distributed_relation(relation_name text)
RETURNS bool AS
$$
DECLARE
part_method char;
BEGIN
select partmethod INTO part_method from pg_dist_partition WHERE logicalrelid = relation_name::regclass;
IF part_method = 'h' THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relation_name text, relationShardAccess int)
RETURNS text AS RETURNS text AS
$$ $$
BEGIN BEGIN
IF relationShardAccess = 0 THEN IF relationShardAccess = 0 and distributed_relation(relation_name) THEN
RETURN 'not_parallel_accessed';
ELSIF relationShardAccess = 0 and NOT distributed_relation(relation_name) THEN
RETURN 'not_accessed'; RETURN 'not_accessed';
ELSIF relationShardAccess = 1 THEN ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access'; RETURN 'reference_table_access';
ELSE ELSE
RETURN 'parallel_access'; RETURN 'parallel_access';
END IF; END IF;
@ -37,9 +53,9 @@ END;
$$ LANGUAGE 'plpgsql' IMMUTABLE; $$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS CREATE VIEW relation_acesses AS
SELECT table_name, SELECT table_name,
relation_access_mode_to_text(relation_select_access_mode(table_name::regclass)) as select_access, relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(relation_dml_access_mode(table_name::regclass)) as dml_access, relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(relation_ddl_access_mode(table_name::regclass)) as ddl_access relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
FROM FROM
((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables; ((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables;
SET citus.shard_replication_factor TO 1; SET citus.shard_replication_factor TO 1;
@ -102,8 +118,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_7') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_7') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_7 | not_accessed | not_accessed | parallel_access table_7 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
COMMIT; COMMIT;
@ -116,8 +132,8 @@ SELECT count(*) FROM table_1;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
-- a very simple test that first checks sequential -- a very simple test that first checks sequential
@ -125,8 +141,8 @@ SELECT * FROM relation_acesses WHERE table_name = 'table_1';
BEGIN; BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 1; SELECT count(*) FROM table_1 WHERE key = 1;
@ -137,8 +153,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 1 OR key = 2; SELECT count(*) FROM table_1 WHERE key = 1 OR key = 2;
@ -149,30 +165,30 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1); INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | sequential_access | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1), (2,2); INSERT INTO table_1 VALUES (1,1), (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | sequential_access | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ALTER TABLE table_1 ADD COLUMN test_col INT; ALTER TABLE table_1 ADD COLUMN test_col INT;
-- now see that the other tables are not accessed at all -- now see that the other tables are not accessed at all
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+----------------- ------------+-----------------+-----------------------+-----------------
table_1 | parallel_access | sequential_access | parallel_access table_1 | parallel_access | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -187,8 +203,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 2; SELECT count(*) FROM table_1 WHERE key = 2;
@ -199,22 +215,22 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1); INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (2,2); INSERT INTO table_1 VALUES (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -223,8 +239,8 @@ BEGIN;
ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key); ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -245,14 +261,14 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | sequential_access | not_accessed | not_accessed table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_4 | sequential_access | not_accessed | not_accessed table_4 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_5 | sequential_access | not_accessed | not_accessed table_5 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows) (7 rows)
ROLLBACK; ROLLBACK;
@ -271,9 +287,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -294,9 +310,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -321,14 +337,14 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_accessed | not_accessed table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_4 | parallel_access | not_accessed | not_accessed table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_5 | parallel_access | not_accessed | not_accessed table_5 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows) (7 rows)
ROLLBACK; ROLLBACK;
@ -339,17 +355,17 @@ BEGIN;
UPDATE table_1 SET value = 15; UPDATE table_1 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
SET LOCAL citus.multi_shard_modify_mode = 'sequential'; SET LOCAL citus.multi_shard_modify_mode = 'sequential';
UPDATE table_2 SET value = 15; UPDATE table_2 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | sequential_access | sequential_access | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -360,10 +376,10 @@ BEGIN;
WHERE key IN (SELECT key FROM table_2 JOIN table_3 USING (key) WHERE table_2.value = 15); WHERE key IN (SELECT key FROM table_2 JOIN table_3 USING (key) WHERE table_2.value = 15);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_accessed | not_accessed table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -372,9 +388,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1; INSERT INTO table_2 SELECT * FROM table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | parallel_access | not_accessed table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -384,9 +400,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1; INSERT INTO table_2 SELECT * FROM table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | sequential_access | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -395,9 +411,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1 OFFSET 0; INSERT INTO table_2 SELECT * FROM table_1 OFFSET 0;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | parallel_access | not_accessed table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -423,9 +439,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -446,10 +462,10 @@ BEGIN;
) as foo; ) as foo;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | not_accessed | parallel_access | not_accessed table_3 | not_parallel_accessed | parallel_access | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -472,10 +488,10 @@ BEGIN;
) as foo; ) as foo;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | not_accessed | sequential_access | not_accessed table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -498,11 +514,11 @@ BEGIN;
) AND value IN (SELECT key FROM table_4); ) AND value IN (SELECT key FROM table_4);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3', 'table_4') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3', 'table_4') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | parallel_access | not_accessed table_3 | parallel_access | parallel_access | not_parallel_accessed
table_4 | parallel_access | not_accessed | not_accessed table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
(4 rows) (4 rows)
ROLLBACK; ROLLBACK;
@ -514,8 +530,8 @@ BEGIN;
3 3 3 3
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -524,8 +540,8 @@ BEGIN;
COPY table_1 FROM STDIN WITH CSV; COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+-------------- ------------+-----------------------+-----------------+-----------------------
table_1 | not_accessed | parallel_access | not_accessed table_1 | not_parallel_accessed | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -534,8 +550,8 @@ BEGIN;
COPY table_1 FROM STDIN WITH CSV; COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -549,22 +565,22 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+------------------------+--------------+--------------
table_6 | sequential_access | not_accessed | not_accessed table_6 | reference_table_access | not_accessed | not_accessed
(1 row) (1 row)
UPDATE table_6 SET value = 15; UPDATE table_6 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+------------------------+------------------------+--------------
table_6 | sequential_access | sequential_access | not_accessed table_6 | reference_table_access | reference_table_access | not_accessed
(1 row) (1 row)
ALTER TABLE table_6 ADD COLUMN x INT; ALTER TABLE table_6 ADD COLUMN x INT;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+------------------- ------------+------------------------+------------------------+------------------------
table_6 | sequential_access | sequential_access | sequential_access table_6 | reference_table_access | reference_table_access | reference_table_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -578,8 +594,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6', 'table_1') ORDER BY 1,2; SELECT * FROM relation_acesses WHERE table_name IN ('table_6', 'table_1') ORDER BY 1,2;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | parallel_access | not_accessed | not_accessed table_6 | parallel_access | not_accessed | not_accessed
(2 rows) (2 rows)
@ -589,8 +605,8 @@ BEGIN;
TRUNCATE table_1; TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -600,8 +616,8 @@ BEGIN;
TRUNCATE table_1; TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | sequential_access table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -610,8 +626,8 @@ BEGIN;
TRUNCATE table_6; TRUNCATE table_6;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_6') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+---------------+--------------+------------------------
table_6 | not_accessed | not_accessed | sequential_access table_6 | not_accessed | not_accessed | reference_table_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -621,9 +637,9 @@ BEGIN;
ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key); ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -634,9 +650,9 @@ BEGIN;
ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key); ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | sequential_access table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | not_accessed | sequential_access table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -652,9 +668,9 @@ BEGIN;
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -664,9 +680,9 @@ BEGIN;
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2009 FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2009 FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
COMMIT; COMMIT;
@ -682,9 +698,9 @@ BEGIN;
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2010 FOR VALUES FROM ('2010-01-01') TO ('2011-01-01'); ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2010 FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
COMMIT; COMMIT;
@ -698,10 +714,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+--------------+-------------- ------------------------+-----------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_accessed | not_accessed partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | parallel_access | not_accessed | not_accessed partitioning_test_2010 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -716,10 +732,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | not_accessed | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | sequential_access | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -728,10 +744,10 @@ BEGIN;
UPDATE partitioning_test SET time = now(); UPDATE partitioning_test SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+-------------- ------------------------+-----------------+-----------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_accessed partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | parallel_access | parallel_access | not_accessed partitioning_test_2010 | parallel_access | parallel_access | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -741,10 +757,10 @@ BEGIN;
UPDATE partitioning_test SET time = now(); UPDATE partitioning_test SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | sequential_access | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | sequential_access | sequential_access | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -753,10 +769,10 @@ BEGIN;
ALTER TABLE partitioning_test ADD COLUMN X INT; ALTER TABLE partitioning_test ADD COLUMN X INT;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -766,10 +782,10 @@ BEGIN;
ALTER TABLE partitioning_test ADD COLUMN X INT; ALTER TABLE partitioning_test ADD COLUMN X INT;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+------------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | sequential_access partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_accessed | not_accessed | sequential_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | sequential_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -783,10 +799,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_accessed | not_accessed partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -801,10 +817,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | not_accessed | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -813,10 +829,10 @@ BEGIN;
UPDATE partitioning_test_2009 SET time = now(); UPDATE partitioning_test_2009 SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_accessed partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -826,10 +842,10 @@ BEGIN;
UPDATE partitioning_test_2009 SET time = now(); UPDATE partitioning_test_2009 SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | sequential_access | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -838,10 +854,10 @@ BEGIN;
CREATE INDEX i1000000 ON partitioning_test_2009 (id); CREATE INDEX i1000000 ON partitioning_test_2009 (id);
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -851,10 +867,10 @@ BEGIN;
CREATE INDEX i1000000 ON partitioning_test_2009 (id); CREATE INDEX i1000000 ON partitioning_test_2009 (id);
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+------------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | sequential_access partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_accessed | not_accessed | sequential_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -865,9 +881,9 @@ BEGIN;
NOTICE: truncate cascades to table "table_2" NOTICE: truncate cascades to table "table_2"
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -883,8 +899,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
COMMIT; COMMIT;
@ -900,8 +916,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
COMMIT; COMMIT;
@ -919,8 +935,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -936,8 +952,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -953,8 +969,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -973,18 +989,19 @@ NOTICE: Copying data from local table...
SELECT * FROM relation_acesses WHERE table_name IN ('table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+----------------- ------------+-----------------------+-----------------+-----------------
table_3 | not_accessed | parallel_access | parallel_access table_3 | not_parallel_accessed | parallel_access | parallel_access
(1 row) (1 row)
COMMIT; COMMIT;
SET search_path TO 'public'; SET search_path TO 'public';
DROP SCHEMA access_tracking CASCADE; DROP SCHEMA access_tracking CASCADE;
NOTICE: drop cascades to 13 other objects NOTICE: drop cascades to 14 other objects
DETAIL: drop cascades to function access_tracking.relation_select_access_mode(oid) DETAIL: drop cascades to function access_tracking.relation_select_access_mode(oid)
drop cascades to function access_tracking.relation_dml_access_mode(oid) drop cascades to function access_tracking.relation_dml_access_mode(oid)
drop cascades to function access_tracking.relation_ddl_access_mode(oid) drop cascades to function access_tracking.relation_ddl_access_mode(oid)
drop cascades to function access_tracking.relation_access_mode_to_text(integer) drop cascades to function access_tracking.distributed_relation(text)
drop cascades to function access_tracking.relation_access_mode_to_text(text,integer)
drop cascades to view access_tracking.relation_acesses drop cascades to view access_tracking.relation_acesses
drop cascades to table access_tracking.table_1 drop cascades to table access_tracking.table_1
drop cascades to table access_tracking.table_2 drop cascades to table access_tracking.table_2

View File

@ -23,15 +23,32 @@ CREATE OR REPLACE FUNCTION relation_ddl_access_mode(relationId Oid)
LANGUAGE C STABLE STRICT LANGUAGE C STABLE STRICT
AS 'citus', $$relation_ddl_access_mode$$; AS 'citus', $$relation_ddl_access_mode$$;
CREATE OR REPLACE FUNCTION distributed_relation(relation_name text)
RETURNS bool AS
$$
DECLARE
part_method char;
BEGIN
select partmethod INTO part_method from pg_dist_partition WHERE logicalrelid = relation_name::regclass;
IF part_method = 'h' THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relationShardAccess int)
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relation_name text, relationShardAccess int)
RETURNS text AS RETURNS text AS
$$ $$
BEGIN BEGIN
IF relationShardAccess = 0 THEN IF relationShardAccess = 0 and distributed_relation(relation_name) THEN
RETURN 'not_parallel_accessed';
ELSIF relationShardAccess = 0 and NOT distributed_relation(relation_name) THEN
RETURN 'not_accessed'; RETURN 'not_accessed';
ELSIF relationShardAccess = 1 THEN ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access'; RETURN 'reference_table_access';
ELSE ELSE
RETURN 'parallel_access'; RETURN 'parallel_access';
END IF; END IF;
@ -42,9 +59,9 @@ $$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS CREATE VIEW relation_acesses AS
SELECT table_name, SELECT table_name,
relation_access_mode_to_text(relation_select_access_mode(table_name::regclass)) as select_access, relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(relation_dml_access_mode(table_name::regclass)) as dml_access, relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(relation_ddl_access_mode(table_name::regclass)) as ddl_access relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
FROM FROM
((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables; ((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables;