]> granicus.if.org Git - postgresql/commitdiff
Clean up partcollation handling for OID 0.
authorRobert Haas <rhaas@postgresql.org>
Tue, 6 Jun 2017 15:07:20 +0000 (11:07 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 6 Jun 2017 15:07:20 +0000 (11:07 -0400)
Consistent with what we do for indexes, we shouldn't try to record
dependencies on collation OID 0 or the default collation OID (which
is pinned).  Also, the fact that indcollation and partcollation can
contain zero OIDs when the data type is not collatable should be
documented.

Amit Langote, per a complaint from me.

Discussion: http://postgr.es/m/CA+Tgmoba5mtPgM3NKfG06vv8na5gGbVOj0h4zvivXQwLw8wXXQ@mail.gmail.com

doc/src/sgml/catalogs.sgml
src/backend/catalog/heap.c

index 5723be744d7150d491bb4824d4b5c264c29eed04..61ce12c56009e31a4a0a046c7b54f2b6a6b96bbe 100644 (file)
@@ -3783,7 +3783,8 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
       <entry><literal><link linkend="catalog-pg-collation"><structname>pg_collation</structname></link>.oid</literal></entry>
       <entry>
        For each column in the index key, this contains the OID of the
-       collation to use for the index.
+       the collation to use for the index, or zero if the column is not
+       of a collatable data type.
       </entry>
      </row>
 
@@ -4770,7 +4771,8 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</>:<replaceable>&lt;salt&gt;<
       <entry><literal><link linkend="catalog-pg-opclass"><structname>pg_opclass</structname></link>.oid</literal></entry>
       <entry>
        For each column in the partition key, this contains the OID of the
-       the collation to use for partitioning.
+       the collation to use for partitioning, or zero if the column is not
+       of a collatable data type.
       </entry>
      </row>
 
index 0ce94f346f56d856937ba629ba70d215d7b24680..4e5b79ef941f7262d428e4df8f63cab342514d55 100644 (file)
@@ -3160,9 +3160,14 @@ StorePartitionKey(Relation rel,
 
                recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
-               referenced.classId = CollationRelationId;
-               referenced.objectId = partcollation[i];
-               referenced.objectSubId = 0;
+               /* The default collation is pinned, so don't bother recording it */
+               if (OidIsValid(partcollation[i]) &&
+                       partcollation[i] != DEFAULT_COLLATION_OID)
+               {
+                       referenced.classId = CollationRelationId;
+                       referenced.objectId = partcollation[i];
+                       referenced.objectSubId = 0;
+               }
 
                recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
        }