On Tue, 6 Jun 2017 13:03:58 +0530
amul sul <sula...@gmail.com> wrote:


> Updated patch attached.

I looked into the latest patch (v13) and have some comments
althogh they might be trivial.

First, I couldn't apply this patch to the latest HEAD due to
a documentation fix and pgintend updates. It needes rebase.

$ git apply /tmp/0002-hash-partitioning_another_design-v13.patch  
error: patch failed: doc/src/sgml/ref/create_table.sgml:87
error: doc/src/sgml/ref/create_table.sgml: patch does not apply
error: patch failed: src/backend/catalog/partition.c:76
error: src/backend/catalog/partition.c: patch does not apply
error: patch failed: src/backend/commands/tablecmds.c:13371
error: src/backend/commands/tablecmds.c: patch does not apply


       <varlistentry>
+       <term>Hash Partitioning</term>
+
+       <listitem>
+        <para>
+         The table is partitioned by specifying modulus and remainder for each
+         partition. Each partition holds rows for which the hash value of
+         partition keys when divided by specified modulus produces specified
+         remainder. For more clarification on modulus and remainder please 
refer
+         <xref linkend="sql-createtable-partition">.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
        <term>Range Partitioning</term>

I think this section should be inserted after List Partitioning section because
the order of the descriptions is Range, List, then Hash in other places of
the documentation. At least, 


-    <firstterm>partition bounds</firstterm>.  Currently supported
-    partitioning methods include range and list, where each partition is
-    assigned a range of keys and a list of keys, respectively.
+    <firstterm>partition bounds</firstterm>.  The currently supported
+    partitioning methods are list, range, and hash.
    </para>

Also in this hunk. I think "The currently supported partitioning methods are
range, list, and hash." is better. We don't need to change the order of
the original description.
 

       <listitem>
        <para>
-        Declarative partitioning only supports list and range partitioning,
-        whereas table inheritance allows data to be divided in a manner of
-        the user's choosing.  (Note, however, that if constraint exclusion is
-        unable to prune partitions effectively, query performance will be very
-        poor.)
+        Declarative partitioning only supports hash, list and range
+        partitioning, whereas table inheritance allows data to be divided in a
+        manner of the user's choosing.  (Note, however, that if constraint
+        exclusion is unable to prune partitions effectively, query performance
+        will be very poor.)

Similarly, I think "Declarative partitioning only supports range, list and hash
partitioning," is better.


+
+  <para>
+   Create a hash partitioned table:
+<programlisting>
+CREATE TABLE orders (
+    order_id     bigint not null,
+    cust_id      bigint not null,
+    status       text
+) PARTITION BY HASH (order_id);
+</programlisting></para>
+

This paragraph should be inserted between "Create a list partitioned table:"
paragraph and "Ceate partition of a range partitioned table:" paragraph
as well as range and list.


                *strategy = PARTITION_STRATEGY_LIST;
        else if (pg_strcasecmp(partspec->strategy, "range") == 0)
                *strategy = PARTITION_STRATEGY_RANGE;
+       else if (pg_strcasecmp(partspec->strategy, "hash") == 0)
+               *strategy = PARTITION_STRATEGY_HASH;
        else
                ereport(ERROR,

In the most of codes, the order is hash, range, then list, but only
in transformPartitionSpec(), the order is list, range, then hash,
as above. Maybe it is better to be uniform.


+                       {
+                               if (strategy == PARTITION_STRATEGY_HASH)
+                                       ereport(ERROR,
+                                                       
(errcode(ERRCODE_UNDEFINED_OBJECT),
+                                                        errmsg("data type %s 
has no default hash operator class",
+                                                                       
format_type_be(atttype)),
+                                                        errhint("You must 
specify a hash operator class or define a default hash operator class for the 
data type.")));
+                               else
+                                       ereport(ERROR,
+                                                       
(errcode(ERRCODE_UNDEFINED_OBJECT),
+                                                        errmsg("data type %s 
has no default btree operator class",
+                                                                       
format_type_be(atttype)),
+                                                        errhint("You must 
specify a btree operator class or define a default btree operator class for the 
data type.")));
+
+

                                                                                
           atttype,
-                                                                               
           "btree",
-                                                                               
           BTREE_AM_OID);
+                                                                               
           am_oid == HASH_AM_OID ? "hash" : "btree",
+                                                                               
           am_oid);

How about writing this part as following to reduce code redundancy?

+       Oid                     am_oid;
+       char       *am_name;

<snip> 

+               if (strategy == PARTITION_STRATEGY_HASH)
+               {
+                       am_oid = HASH_AM_OID;
+                       am_name = pstrdup("hash");
+               }
+               else
+               {
+                       am_oid = BTREE_AM_OID;
+                       am_name = pstrdup("btree");
+               }
+
                if (!pelem->opclass)
                {
-                       partopclass[attn] = GetDefaultOpClass(atttype, 
BTREE_AM_OID);
+                       partopclass[attn] = GetDefaultOpClass(atttype, am_oid);
 
                        if (!OidIsValid(partopclass[attn]))
                                ereport(ERROR,
                                                
(errcode(ERRCODE_UNDEFINED_OBJECT),
-                                  errmsg("data type %s has no default btree 
operator class",
-                                                 format_type_be(atttype)),
-                                                errhint("You must specify a 
btree operator class or define a default btree operator class for the data 
type.")));
+                                                errmsg("data type %s has no 
default %s operator class",
+                                                               
format_type_be(atttype), am_name),
+                                                errhint("You must specify a %s 
operator class or define a default %s operator class for the data type.",
+                                                                am_name, 
am_name)));
+
                }
                else
                        partopclass[attn] = ResolveOpClass(pelem->opclass,
                                                                                
           atttype,
-                                                                               
           "btree",
-                                                                               
           BTREE_AM_OID);
+                                                                               
           am_name,
+                                                                               
           am_oid);


There is meaningless indentation change.

@@ -2021,7 +2370,8 @@ get_partition_for_tuple(PartitionDispatch *pd,
                    /* bsearch in partdesc->boundinfo */
                    cur_offset = partition_bound_bsearch(key,
                                                         partdesc->boundinfo,
-                                                        values, false, &equal);
+                                                     values, false, &equal);
+
                    /*
                     * Offset returned is such that the bound at offset is


Fixing the comment of pg_get_partkeydef() is missing.

 * pg_get_partkeydef
 *
 * Returns the partition key specification, ie, the following:
 *
 * PARTITION BY { RANGE | LIST } (column opt_collation opt_opclass [, ...])
 */
Datum
pg_get_partkeydef(PG_FUNCTION_ARGS)
{

Regards,

> 
> Regards,
> Amul Sul


-- 
Yugo Nagata <nag...@sraoss.co.jp>


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to