Greetings all,
I am updating the :create-table macro to work with Greenplum's CREATE TABLE 
syntax. For the most part, this is identical except for two important table 
attributes:

DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY

These tell Greenplum how to distribute the table across the cluster, and 
getting these right is critical for good performance. Here is a SQL example 
using the FAA dataset:

create table faa.d_airports (
    AirportID      integer,
    Name           text,
    City           text,
    Country        text,
    airport_code   text,
    ICOA_code      text,
    Latitude       float8,
    Longitude      float8,
    Altitude       float8,
    TimeZoneOffset float,
    DST_Flag       text ,
    TZ             text
)
distributed by (airport_code);

The challenge is in emitting the 'distributed by (...)' or 'distributed 
randomly' after the closing parenthesis in the SQL. The S-SQL macro, with the 
correct location is:
(def-sql-op :create-table (name (&rest columns) &rest options)
  (when (null columns)
    (sql-error "No columns defined for table ~A." name))
  `("CREATE TABLE " ,(to-sql-name name) " ("
                    ,@(loop :for ((column-name . args) . rest) :on columns
                            :append (expand-table-column column-name args)
                            :if rest :collect ", ")
                    ,@(loop :for ((option . args)) :on options
                            :collect ", "
                            :append (expand-table-constraint option args))
                    ")"    ; DISTRIBUTED BY needs to go here
))
Initially I thought I could modify expand-table-constraints in a way that would 
do the trick, but I could not find a way to do this without either hardcoding 
these two cases or modifying the function signature. Modifying the signature of 
the :create-table macro seems the best choice, and then add another invocation 
of expand-table-constraint after the closing parentheses, but that is a 
breaking change. Alternatively we could have a :create-gp-table, but I would 
rather not diverge.
So, I am here to ask: am I missing something obvious? If not, what is the 
consensus for moving forward? I supposed I would be most in favor of modifying 
the signature for :create-table.
Regards,    Steve
P.S. There is also an open issue for create table that might have a need for 
something similar. I do not know, but it is worth considering both of them 
whilst making the change.


Reply via email to