]> granicus.if.org Git - postgresql/commitdiff
Fix bogus Name assignment in CreateStatistics
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 6 Mar 2018 16:17:13 +0000 (13:17 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 6 Mar 2018 16:21:04 +0000 (13:21 -0300)
Apparently, it doesn't work to use a plain cstring as a Name datum: you
may end up having random bytes because of failing to zero the bytes
after the terminating \0, as indicated by valgrind.  I introduced this
bug in 5564c1181548, so backpatch this fix to REL_10_STABLE, like that
commit.

While at it, fix a slightly misleading comment, pointed out by David
Rowley.

src/backend/commands/statscmds.c
src/backend/parser/parse_utilcmd.c

index 9f963ddee981265d0388e6136cb0bed64b302298..1a9890509846dfbc5da0ba4092178d71164329f5 100644 (file)
@@ -56,6 +56,7 @@ CreateStatistics(CreateStatsStmt *stmt)
        int16           attnums[STATS_MAX_DIMENSIONS];
        int                     numcols = 0;
        char       *namestr;
+       NameData        stxname;
        Oid                     statoid;
        Oid                     namespaceId;
        Oid                     stxowner = GetUserId();
@@ -134,7 +135,8 @@ CreateStatistics(CreateStatsStmt *stmt)
         * object in the same namespace as the relation, and cons up a name for it.
         */
        if (stmt->defnames)
-               namespaceId = QualifiedNameGetCreationNamespace(stmt->defnames, &namestr);
+               namespaceId = QualifiedNameGetCreationNamespace(stmt->defnames,
+                                                                                                               &namestr);
        else
        {
                namespaceId = RelationGetNamespace(rel);
@@ -143,6 +145,7 @@ CreateStatistics(CreateStatsStmt *stmt)
                                                                                          "stat",
                                                                                          namespaceId);
        }
+       namestrcpy(&stxname, namestr);
 
        /*
         * Deal with the possibility that the statistics object already exists.
@@ -306,7 +309,7 @@ CreateStatistics(CreateStatsStmt *stmt)
        memset(values, 0, sizeof(values));
        memset(nulls, false, sizeof(nulls));
        values[Anum_pg_statistic_ext_stxrelid - 1] = ObjectIdGetDatum(relid);
-       values[Anum_pg_statistic_ext_stxname - 1] = CStringGetDatum(namestr);
+       values[Anum_pg_statistic_ext_stxname - 1] = NameGetDatum(&stxname);
        values[Anum_pg_statistic_ext_stxnamespace - 1] = ObjectIdGetDatum(namespaceId);
        values[Anum_pg_statistic_ext_stxowner - 1] = ObjectIdGetDatum(stxowner);
        values[Anum_pg_statistic_ext_stxkeys - 1] = PointerGetDatum(stxkeys);
index ed7b79d42307ece2b557cf86710700c65ec5be23..b3367f0cd4b15c01ab0a2c1c93ff4ae38b00efae 100644 (file)
@@ -2255,7 +2255,8 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt)
  * transformExtendedStatistics
  *     Handle extended statistic objects
  *
- * Right now, there's nothing to do here, so we just copy the list.
+ * Right now, there's nothing to do here, so we just append the list to
+ * the existing "after" list.
  */
 static void
 transformExtendedStatistics(CreateStmtContext *cxt)