mirror of https://github.com/citusdata/citus.git
Add dependencies for stat schemas
parent
6c0465566a
commit
770d3da1ca
|
@ -144,10 +144,6 @@ GetExplicitStatisticsCommandList(Oid relationId)
|
||||||
Oid statisticsId = InvalidOid;
|
Oid statisticsId = InvalidOid;
|
||||||
foreach_oid(statisticsId, statisticsIdList)
|
foreach_oid(statisticsId, statisticsIdList)
|
||||||
{
|
{
|
||||||
ObjectAddress address = { 0 };
|
|
||||||
ObjectAddressSet(address, StatisticExtRelationId, statisticsId);
|
|
||||||
EnsureDependenciesExistOnAllNodes(&address);
|
|
||||||
|
|
||||||
char *createStatisticsCommand = pg_get_statisticsobj_worker(statisticsId, false);
|
char *createStatisticsCommand = pg_get_statisticsobj_worker(statisticsId, false);
|
||||||
|
|
||||||
createStatisticsCommandList = lappend(
|
createStatisticsCommandList = lappend(
|
||||||
|
@ -162,6 +158,51 @@ GetExplicitStatisticsCommandList(Oid relationId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GetExplicitStatisticsSchemaIdList returns the list of schema ids of statistics'
|
||||||
|
* which are created on relation with given relation id.
|
||||||
|
*/
|
||||||
|
List *
|
||||||
|
GetExplicitStatisticsSchemaIdList(Oid relationId)
|
||||||
|
{
|
||||||
|
List *schemaIdList = NIL;
|
||||||
|
|
||||||
|
Relation pgStatistics = table_open(StatisticExtRelationId, AccessShareLock);
|
||||||
|
|
||||||
|
int scanKeyCount = 1;
|
||||||
|
ScanKeyData scanKey[1];
|
||||||
|
|
||||||
|
ScanKeyInit(&scanKey[0], Anum_pg_statistic_ext_stxrelid,
|
||||||
|
BTEqualStrategyNumber, F_OIDEQ, relationId);
|
||||||
|
|
||||||
|
bool useIndex = true;
|
||||||
|
SysScanDesc scanDescriptor = systable_beginscan(pgStatistics,
|
||||||
|
StatisticExtRelidIndexId,
|
||||||
|
useIndex, NULL, scanKeyCount,
|
||||||
|
scanKey);
|
||||||
|
|
||||||
|
HeapTuple heapTuple = systable_getnext(scanDescriptor);
|
||||||
|
while (HeapTupleIsValid(heapTuple))
|
||||||
|
{
|
||||||
|
FormData_pg_statistic_ext *statisticsForm =
|
||||||
|
(FormData_pg_statistic_ext *) GETSTRUCT(heapTuple);
|
||||||
|
|
||||||
|
Oid schemaId = statisticsForm->stxnamespace;
|
||||||
|
if (!list_member_oid(schemaIdList, schemaId))
|
||||||
|
{
|
||||||
|
schemaIdList = lappend_oid(schemaIdList, schemaId);
|
||||||
|
}
|
||||||
|
|
||||||
|
heapTuple = systable_getnext(scanDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
systable_endscan(scanDescriptor);
|
||||||
|
table_close(pgStatistics, NoLock);
|
||||||
|
|
||||||
|
return schemaIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetExplicitStatisticsIdList returns a list of OIDs corresponding to the statistics
|
* GetExplicitStatisticsIdList returns a list of OIDs corresponding to the statistics
|
||||||
* that are explicitly created on the relation with relationId. That means,
|
* that are explicitly created on the relation with relationId. That means,
|
||||||
|
|
|
@ -258,7 +258,7 @@ PreprocessCreateEnumStmt(Node *node, const char *queryString)
|
||||||
QualifyTreeNode(node);
|
QualifyTreeNode(node);
|
||||||
|
|
||||||
/* reconstruct creation statement in a portable fashion */
|
/* reconstruct creation statement in a portable fashion */
|
||||||
const char *createEnumStmtSql = DeparseTreeNode((Node *) node);
|
const char *createEnumStmtSql = DeparseCreateEnumStmt(node);
|
||||||
createEnumStmtSql = WrapCreateOrReplace(createEnumStmtSql);
|
createEnumStmtSql = WrapCreateOrReplace(createEnumStmtSql);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "catalog/indexing.h"
|
#include "catalog/indexing.h"
|
||||||
#include "catalog/pg_class.h"
|
#include "catalog/pg_class.h"
|
||||||
#include "catalog/pg_depend.h"
|
#include "catalog/pg_depend.h"
|
||||||
|
#include "catalog/pg_namespace.h"
|
||||||
#include "catalog/pg_proc_d.h"
|
#include "catalog/pg_proc_d.h"
|
||||||
#include "catalog/pg_rewrite.h"
|
#include "catalog/pg_rewrite.h"
|
||||||
#include "catalog/pg_rewrite_d.h"
|
#include "catalog/pg_rewrite_d.h"
|
||||||
|
@ -119,6 +120,7 @@ typedef struct ViewDependencyNode
|
||||||
|
|
||||||
|
|
||||||
static List * GetRelationTriggerFunctionDepencyList(Oid relationId);
|
static List * GetRelationTriggerFunctionDepencyList(Oid relationId);
|
||||||
|
static List * GetRelationStatsSchemaDependencyList(Oid relationId);
|
||||||
static DependencyDefinition * CreateObjectAddressDependencyDef(Oid classId, Oid objectId);
|
static DependencyDefinition * CreateObjectAddressDependencyDef(Oid classId, Oid objectId);
|
||||||
static ObjectAddress DependencyDefinitionObjectAddress(DependencyDefinition *definition);
|
static ObjectAddress DependencyDefinitionObjectAddress(DependencyDefinition *definition);
|
||||||
|
|
||||||
|
@ -926,6 +928,17 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe
|
||||||
List *triggerFunctionDepencyList =
|
List *triggerFunctionDepencyList =
|
||||||
GetRelationTriggerFunctionDepencyList(relationId);
|
GetRelationTriggerFunctionDepencyList(relationId);
|
||||||
result = list_concat(result, triggerFunctionDepencyList);
|
result = list_concat(result, triggerFunctionDepencyList);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Statistics' both depend to the relations and to the schemas they belong
|
||||||
|
* to. Also, pg_depend records dependencies from statistics to their schemas
|
||||||
|
* but not from relations to their statistics' schemas. Given above two,
|
||||||
|
* we directly expand dependencies for the relations to schemas of
|
||||||
|
* statistics.
|
||||||
|
*/
|
||||||
|
List *statisticsSchemaDependencyList =
|
||||||
|
GetRelationStatsSchemaDependencyList(relationId);
|
||||||
|
result = list_concat(result, statisticsSchemaDependencyList);
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -938,6 +951,28 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GetRelationStatsSchemaDependencyList returns a list of DependencyDefinition
|
||||||
|
* objects for the schemas that statistics' of the relation with relationId depends.
|
||||||
|
*/
|
||||||
|
static List *
|
||||||
|
GetRelationStatsSchemaDependencyList(Oid relationId)
|
||||||
|
{
|
||||||
|
List *dependencyList = NIL;
|
||||||
|
|
||||||
|
List *schemaIds = GetExplicitStatisticsSchemaIdList(relationId);
|
||||||
|
Oid schemaId = InvalidOid;
|
||||||
|
foreach_oid(schemaId, schemaIds)
|
||||||
|
{
|
||||||
|
DependencyDefinition *dependency =
|
||||||
|
CreateObjectAddressDependencyDef(NamespaceRelationId, schemaId);
|
||||||
|
dependencyList = lappend(dependencyList, dependency);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dependencyList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetRelationTriggerFunctionDepencyList returns a list of DependencyDefinition
|
* GetRelationTriggerFunctionDepencyList returns a list of DependencyDefinition
|
||||||
* objects for the functions that triggers of the relation with relationId depends.
|
* objects for the functions that triggers of the relation with relationId depends.
|
||||||
|
|
|
@ -244,6 +244,7 @@ extern List * PreprocessCreateStatisticsStmt(Node *node, const char *queryString
|
||||||
extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString);
|
extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString);
|
||||||
extern ObjectAddress CreateStatisticsStmtObjectAddress(Node *node, bool missingOk);
|
extern ObjectAddress CreateStatisticsStmtObjectAddress(Node *node, bool missingOk);
|
||||||
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
||||||
|
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);
|
||||||
|
|
||||||
/* subscription.c - forward declarations */
|
/* subscription.c - forward declarations */
|
||||||
extern Node * ProcessCreateSubscriptionStmt(CreateSubscriptionStmt *createSubStmt);
|
extern Node * ProcessCreateSubscriptionStmt(CreateSubscriptionStmt *createSubStmt);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
CREATE SCHEMA "statistics'test";
|
CREATE SCHEMA "statistics'Test";
|
||||||
SET search_path TO "statistics'test";
|
SET search_path TO "statistics'Test";
|
||||||
SET citus.next_shard_id TO 980000;
|
SET citus.next_shard_id TO 980000;
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
SET citus.shard_count TO 32;
|
SET citus.shard_count TO 32;
|
||||||
|
@ -17,12 +17,12 @@ SELECT create_distributed_table('test_stats', 'a');
|
||||||
|
|
||||||
CREATE STATISTICS s1 (dependencies) ON a, b FROM test_stats;
|
CREATE STATISTICS s1 (dependencies) ON a, b FROM test_stats;
|
||||||
-- test for distributing an already existing statistics
|
-- test for distributing an already existing statistics
|
||||||
CREATE TABLE test_stats2 (
|
CREATE TABLE "test'stats2" (
|
||||||
a int,
|
a int,
|
||||||
b int
|
b int
|
||||||
);
|
);
|
||||||
CREATE STATISTICS s2 (dependencies) ON a, b FROM test_stats2;
|
CREATE STATISTICS s2 (dependencies) ON a, b FROM "test'stats2";
|
||||||
SELECT create_distributed_table('test_stats2', 'a');
|
SELECT create_distributed_table('test''stats2', 'a');
|
||||||
create_distributed_table
|
create_distributed_table
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -30,18 +30,54 @@ SELECT create_distributed_table('test_stats2', 'a');
|
||||||
|
|
||||||
-- test when stats is on a different schema
|
-- test when stats is on a different schema
|
||||||
CREATE SCHEMA sc1;
|
CREATE SCHEMA sc1;
|
||||||
CREATE TABLE tbl (a int, b int);
|
CREATE TABLE tbl (a int, "B" text);
|
||||||
SELECT create_distributed_table ('tbl', 'a');
|
SELECT create_distributed_table ('tbl', 'a');
|
||||||
create_distributed_table
|
create_distributed_table
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
CREATE STATISTICS sc1.st1 ON a, b FROM tbl;
|
CREATE STATISTICS sc1.st1 ON a, "B" FROM tbl;
|
||||||
\c - - - :worker_1_port
|
-- test distributing table with already created stats on a new schema
|
||||||
SELECT stxname FROM pg_statistic_ext ORDER BY stxname ASC;
|
CREATE TABLE test_stats3 (
|
||||||
stxname
|
a int,
|
||||||
|
b int
|
||||||
|
);
|
||||||
|
CREATE SCHEMA sc2;
|
||||||
|
CREATE STATISTICS sc2."neW'Stat" ON a,b FROM test_stats3;
|
||||||
|
SELECT create_distributed_table ('test_stats3','a');
|
||||||
|
create_distributed_table
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
\c - - - :worker_1_port
|
||||||
|
SELECT stxname
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
)
|
||||||
|
ORDER BY stxname ASC;
|
||||||
|
stxname
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
neW'Stat_980096
|
||||||
|
neW'Stat_980098
|
||||||
|
neW'Stat_980100
|
||||||
|
neW'Stat_980102
|
||||||
|
neW'Stat_980104
|
||||||
|
neW'Stat_980106
|
||||||
|
neW'Stat_980108
|
||||||
|
neW'Stat_980110
|
||||||
|
neW'Stat_980112
|
||||||
|
neW'Stat_980114
|
||||||
|
neW'Stat_980116
|
||||||
|
neW'Stat_980118
|
||||||
|
neW'Stat_980120
|
||||||
|
neW'Stat_980122
|
||||||
|
neW'Stat_980124
|
||||||
|
neW'Stat_980126
|
||||||
s1_980000
|
s1_980000
|
||||||
s1_980002
|
s1_980002
|
||||||
s1_980004
|
s1_980004
|
||||||
|
@ -90,15 +126,22 @@ SELECT stxname FROM pg_statistic_ext ORDER BY stxname ASC;
|
||||||
st1_980090
|
st1_980090
|
||||||
st1_980092
|
st1_980092
|
||||||
st1_980094
|
st1_980094
|
||||||
(48 rows)
|
(64 rows)
|
||||||
|
|
||||||
SELECT count(DISTINCT stxnamespace) FROM pg_statistic_ext;
|
SELECT count(DISTINCT stxnamespace)
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
);
|
||||||
count
|
count
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
2
|
3
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
DROP SCHEMA "statistics'test" CASCADE;
|
DROP SCHEMA "statistics'Test" CASCADE;
|
||||||
DROP SCHEMA sc1 CASCADE;
|
DROP SCHEMA sc1 CASCADE;
|
||||||
|
DROP SCHEMA sc2 CASCADE;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CREATE SCHEMA "statistics'test";
|
CREATE SCHEMA "statistics'Test";
|
||||||
|
|
||||||
SET search_path TO "statistics'test";
|
SET search_path TO "statistics'Test";
|
||||||
SET citus.next_shard_id TO 980000;
|
SET citus.next_shard_id TO 980000;
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
SET citus.shard_count TO 32;
|
SET citus.shard_count TO 32;
|
||||||
|
@ -17,27 +17,51 @@ SELECT create_distributed_table('test_stats', 'a');
|
||||||
CREATE STATISTICS s1 (dependencies) ON a, b FROM test_stats;
|
CREATE STATISTICS s1 (dependencies) ON a, b FROM test_stats;
|
||||||
|
|
||||||
-- test for distributing an already existing statistics
|
-- test for distributing an already existing statistics
|
||||||
CREATE TABLE test_stats2 (
|
CREATE TABLE "test'stats2" (
|
||||||
a int,
|
a int,
|
||||||
b int
|
b int
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE STATISTICS s2 (dependencies) ON a, b FROM test_stats2;
|
CREATE STATISTICS s2 (dependencies) ON a, b FROM "test'stats2";
|
||||||
|
|
||||||
SELECT create_distributed_table('test_stats2', 'a');
|
SELECT create_distributed_table('test''stats2', 'a');
|
||||||
|
|
||||||
-- test when stats is on a different schema
|
-- test when stats is on a different schema
|
||||||
CREATE SCHEMA sc1;
|
CREATE SCHEMA sc1;
|
||||||
CREATE TABLE tbl (a int, b int);
|
CREATE TABLE tbl (a int, "B" text);
|
||||||
SELECT create_distributed_table ('tbl', 'a');
|
SELECT create_distributed_table ('tbl', 'a');
|
||||||
|
|
||||||
CREATE STATISTICS sc1.st1 ON a, b FROM tbl;
|
CREATE STATISTICS sc1.st1 ON a, "B" FROM tbl;
|
||||||
|
|
||||||
|
-- test distributing table with already created stats on a new schema
|
||||||
|
CREATE TABLE test_stats3 (
|
||||||
|
a int,
|
||||||
|
b int
|
||||||
|
);
|
||||||
|
CREATE SCHEMA sc2;
|
||||||
|
CREATE STATISTICS sc2."neW'Stat" ON a,b FROM test_stats3;
|
||||||
|
SELECT create_distributed_table ('test_stats3','a');
|
||||||
|
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname FROM pg_statistic_ext ORDER BY stxname ASC;
|
SELECT stxname
|
||||||
SELECT count(DISTINCT stxnamespace) FROM pg_statistic_ext;
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
)
|
||||||
|
ORDER BY stxname ASC;
|
||||||
|
|
||||||
|
SELECT count(DISTINCT stxnamespace)
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
);
|
||||||
|
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
DROP SCHEMA "statistics'test" CASCADE;
|
DROP SCHEMA "statistics'Test" CASCADE;
|
||||||
DROP SCHEMA sc1 CASCADE;
|
DROP SCHEMA sc1 CASCADE;
|
||||||
|
DROP SCHEMA sc2 CASCADE;
|
||||||
|
|
Loading…
Reference in New Issue