Propagate alter stats target

pull/4444/head
Ahmet Gedemenli 2020-12-23 17:45:55 +03:00
parent 5a1607b6c0
commit f7c70f9a63
9 changed files with 230 additions and 0 deletions

View File

@ -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);

View File

@ -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

View File

@ -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)
{ {

View File

@ -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

View File

@ -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:
{ {
/* /*

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;