mirror of https://github.com/citusdata/citus.git
Propagate alter stats target
parent
5a1607b6c0
commit
f7c70f9a63
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "distributed/commands.h"
|
#include "distributed/commands.h"
|
||||||
#include "distributed/deparser.h"
|
#include "distributed/deparser.h"
|
||||||
|
#include "distributed/pg_version_constants.h"
|
||||||
|
|
||||||
static DistributeObjectOps NoDistributeOps = {
|
static DistributeObjectOps NoDistributeOps = {
|
||||||
.deparse = NULL,
|
.deparse = NULL,
|
||||||
|
@ -414,6 +415,15 @@ static DistributeObjectOps Schema_Rename = {
|
||||||
.postprocess = NULL,
|
.postprocess = NULL,
|
||||||
.address = AlterSchemaRenameStmtObjectAddress,
|
.address = AlterSchemaRenameStmtObjectAddress,
|
||||||
};
|
};
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
static DistributeObjectOps Statistics_Alter = {
|
||||||
|
.deparse = DeparseAlterStatisticsStmt,
|
||||||
|
.qualify = QualifyAlterStatisticsStmt,
|
||||||
|
.preprocess = PreprocessAlterStatisticsStmt,
|
||||||
|
.postprocess = NULL,
|
||||||
|
.address = NULL,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
static DistributeObjectOps Statistics_AlterObjectSchema = {
|
static DistributeObjectOps Statistics_AlterObjectSchema = {
|
||||||
.deparse = DeparseAlterStatisticsSchemaStmt,
|
.deparse = DeparseAlterStatisticsSchemaStmt,
|
||||||
.qualify = QualifyAlterStatisticsSchemaStmt,
|
.qualify = QualifyAlterStatisticsSchemaStmt,
|
||||||
|
@ -683,6 +693,13 @@ GetDistributeObjectOps(Node *node)
|
||||||
return &Any_AlterRoleSet;
|
return &Any_AlterRoleSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
case T_AlterStatsStmt:
|
||||||
|
{
|
||||||
|
return &Statistics_Alter;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
case T_AlterTableStmt:
|
case T_AlterTableStmt:
|
||||||
{
|
{
|
||||||
AlterTableStmt *stmt = castNode(AlterTableStmt, node);
|
AlterTableStmt *stmt = castNode(AlterTableStmt, node);
|
||||||
|
|
|
@ -318,6 +318,49 @@ AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PreprocessAlterStatisticsStmt is called during the planning phase for
|
||||||
|
* ALTER STATISTICS .. SET STATISTICS command has been executed
|
||||||
|
* by standard process utility.
|
||||||
|
*/
|
||||||
|
List *
|
||||||
|
PreprocessAlterStatisticsStmt(Node *node, const char *queryString)
|
||||||
|
{
|
||||||
|
AlterStatsStmt *stmt = castNode(AlterStatsStmt, node);
|
||||||
|
|
||||||
|
Oid statsOid = get_statistics_object_oid(stmt->defnames, false);
|
||||||
|
Oid relationId = GetRelIdByStatsOid(statsOid);
|
||||||
|
|
||||||
|
if (!IsCitusTable(relationId) || !ShouldPropagate())
|
||||||
|
{
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
EnsureCoordinator();
|
||||||
|
|
||||||
|
QualifyTreeNode((Node *) stmt);
|
||||||
|
|
||||||
|
char *ddlCommand = DeparseTreeNode((Node *) stmt);
|
||||||
|
|
||||||
|
DDLJob *ddlJob = palloc0(sizeof(DDLJob));
|
||||||
|
|
||||||
|
ddlJob->targetRelationId = relationId;
|
||||||
|
ddlJob->concurrentIndexCmd = false;
|
||||||
|
ddlJob->startNewTransaction = false;
|
||||||
|
ddlJob->commandString = ddlCommand;
|
||||||
|
ddlJob->taskList = DDLTaskList(relationId, ddlCommand);
|
||||||
|
|
||||||
|
List *ddlJobs = list_make1(ddlJob);
|
||||||
|
|
||||||
|
return ddlJobs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GetExplicitStatisticsCommandList returns the list of DDL commands to create
|
* GetExplicitStatisticsCommandList returns the list of DDL commands to create
|
||||||
* statistics that are explicitly created for the table with relationId. See
|
* statistics that are explicitly created for the table with relationId. See
|
||||||
|
|
|
@ -24,6 +24,9 @@ static void AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt);
|
||||||
static void AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists);
|
static void AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists);
|
||||||
static void AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt);
|
static void AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt);
|
||||||
static void AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt);
|
static void AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt);
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
static void AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt);
|
||||||
|
#endif
|
||||||
static void AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt);
|
static void AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt);
|
||||||
static void AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt);
|
static void AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt);
|
||||||
static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt);
|
static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt);
|
||||||
|
@ -83,6 +86,24 @@ DeparseAlterStatisticsSchemaStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
char *
|
||||||
|
DeparseAlterStatisticsStmt(Node *node)
|
||||||
|
{
|
||||||
|
AlterStatsStmt *stmt = castNode(AlterStatsStmt, node);
|
||||||
|
|
||||||
|
StringInfoData str;
|
||||||
|
initStringInfo(&str);
|
||||||
|
|
||||||
|
AppendAlterStatisticsStmt(&str, stmt);
|
||||||
|
|
||||||
|
return str.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
|
AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
|
||||||
{
|
{
|
||||||
|
@ -139,6 +160,18 @@ AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
static void
|
||||||
|
AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt)
|
||||||
|
{
|
||||||
|
appendStringInfo(buf, "ALTER STATISTICS %s SET STATISTICS %d", NameListToQuotedString(
|
||||||
|
stmt->defnames), stmt->stxstattarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt)
|
AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -120,3 +120,27 @@ QualifyAlterStatisticsSchemaStmt(Node *node)
|
||||||
stmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
stmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
|
||||||
|
/*
|
||||||
|
* QualifyAlterStatisticsStmt qualifies AlterObjectSchemaStmt's with schema name for
|
||||||
|
* ALTER STATISTICS .. SET STATISTICS statements.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
QualifyAlterStatisticsStmt(Node *node)
|
||||||
|
{
|
||||||
|
AlterStatsStmt *stmt = castNode(AlterStatsStmt, node);
|
||||||
|
|
||||||
|
if (list_length(stmt->defnames) == 1)
|
||||||
|
{
|
||||||
|
RangeVar *stat = makeRangeVarFromNameList(stmt->defnames);
|
||||||
|
Oid schemaOid = RangeVarGetCreationNamespace(stat);
|
||||||
|
stat->schemaname = get_namespace_name(schemaOid);
|
||||||
|
stmt->defnames = MakeNameListFromRangeVar(stat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -111,6 +111,21 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
case T_AlterStatsStmt:
|
||||||
|
{
|
||||||
|
AlterStatsStmt *alterStatsStmt = (AlterStatsStmt *) parseTree;
|
||||||
|
RangeVar *stat = makeRangeVarFromNameList(alterStatsStmt->defnames);
|
||||||
|
|
||||||
|
AppendShardIdToName(&stat->relname, shardId);
|
||||||
|
SetSchemaNameIfNotExist(&stat->schemaname, schemaName);
|
||||||
|
|
||||||
|
alterStatsStmt->defnames = MakeNameListFromRangeVar(stat);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
case T_AlterTableStmt:
|
case T_AlterTableStmt:
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -286,6 +286,7 @@ extern List * PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryS
|
||||||
extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
||||||
extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
||||||
extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk);
|
extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk);
|
||||||
|
extern List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString);
|
||||||
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
||||||
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);
|
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);
|
||||||
|
|
||||||
|
|
|
@ -60,11 +60,13 @@ extern char * DeparseCreateStatisticsStmt(Node *node);
|
||||||
extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists);
|
extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists);
|
||||||
extern char * DeparseAlterStatisticsRenameStmt(Node *node);
|
extern char * DeparseAlterStatisticsRenameStmt(Node *node);
|
||||||
extern char * DeparseAlterStatisticsSchemaStmt(Node *node);
|
extern char * DeparseAlterStatisticsSchemaStmt(Node *node);
|
||||||
|
extern char * DeparseAlterStatisticsStmt(Node *node);
|
||||||
|
|
||||||
extern void QualifyCreateStatisticsStmt(Node *node);
|
extern void QualifyCreateStatisticsStmt(Node *node);
|
||||||
extern void QualifyDropStatisticsStmt(Node *node);
|
extern void QualifyDropStatisticsStmt(Node *node);
|
||||||
extern void QualifyAlterStatisticsRenameStmt(Node *node);
|
extern void QualifyAlterStatisticsRenameStmt(Node *node);
|
||||||
extern void QualifyAlterStatisticsSchemaStmt(Node *node);
|
extern void QualifyAlterStatisticsSchemaStmt(Node *node);
|
||||||
|
extern void QualifyAlterStatisticsStmt(Node *node);
|
||||||
|
|
||||||
/* forward declarations for deparse_type_stmts.c */
|
/* forward declarations for deparse_type_stmts.c */
|
||||||
extern char * DeparseCompositeTypeStmt(Node *stmt);
|
extern char * DeparseCompositeTypeStmt(Node *stmt);
|
||||||
|
|
|
@ -79,6 +79,11 @@ ALTER STATISTICS s6 RENAME TO s7;
|
||||||
CREATE SCHEMA test_alter_schema;
|
CREATE SCHEMA test_alter_schema;
|
||||||
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
DROP STATISTICS test_alter_schema.s7;
|
DROP STATISTICS test_alter_schema.s7;
|
||||||
|
-- test altering stats target
|
||||||
|
ALTER STATISTICS s1 SET STATISTICS 3;
|
||||||
|
-- since max value for target is 10000, this will automatically be lowered
|
||||||
|
ALTER STATISTICS s2 SET STATISTICS 999999;
|
||||||
|
WARNING: lowering statistics target to 10000
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
FROM pg_statistic_ext
|
FROM pg_statistic_ext
|
||||||
|
@ -168,6 +173,82 @@ WHERE stxnamespace IN (
|
||||||
3
|
3
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT stxstattarget
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
)
|
||||||
|
ORDER BY stxstattarget ASC;
|
||||||
|
stxstattarget
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
3
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
10000
|
||||||
|
(64 rows)
|
||||||
|
|
||||||
\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;
|
||||||
|
|
|
@ -67,6 +67,11 @@ CREATE SCHEMA test_alter_schema;
|
||||||
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
DROP STATISTICS test_alter_schema.s7;
|
DROP STATISTICS test_alter_schema.s7;
|
||||||
|
|
||||||
|
-- test altering stats target
|
||||||
|
ALTER STATISTICS s1 SET STATISTICS 3;
|
||||||
|
-- since max value for target is 10000, this will automatically be lowered
|
||||||
|
ALTER STATISTICS s2 SET STATISTICS 999999;
|
||||||
|
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
FROM pg_statistic_ext
|
FROM pg_statistic_ext
|
||||||
|
@ -85,6 +90,15 @@ WHERE stxnamespace IN (
|
||||||
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SELECT stxstattarget
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxnamespace IN (
|
||||||
|
SELECT oid
|
||||||
|
FROM pg_namespace
|
||||||
|
WHERE nspname IN ('public', 'statistics''Test', 'sc1', 'sc2')
|
||||||
|
)
|
||||||
|
ORDER BY stxstattarget ASC;
|
||||||
|
|
||||||
\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;
|
||||||
|
|
Loading…
Reference in New Issue