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.