Code review for FORCE QUOTE * patch: fix error checking to consider FORCE
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Jul 2009 17:04:19 +0000 (17:04 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Jul 2009 17:04:19 +0000 (17:04 +0000)
QUOTE * as a variety of FORCE QUOTE, and update psql documentation to include
the option.  (The actual psql code doesn't seem to need any changes.)

doc/src/sgml/ref/psql-ref.sgml
src/backend/commands/copy.c
src/bin/psql/copy.c

index 56f61349a88a6d681bd4b414871e77b25503abe0..b86c2d089573f1427709fcbc89171ad4208a3751 100644 (file)
@@ -774,7 +774,7 @@ testdb=&gt;
               [ header ]
               [ quote [ as ] '<replaceable class="parameter">character</replaceable>' ]
               [ escape [ as ] '<replaceable class="parameter">character</replaceable>' ]
-              [ force quote <replaceable class="parameter">column_list</replaceable> ]
+              [ force quote <replaceable class="parameter">column_list</replaceable> | * ]
               [ force not null <replaceable class="parameter">column_list</replaceable> ] ]</literal>
         </term>
 
index f74eb3593789ce788a721b3ee5947da303d16f85..41578b74b84ec152b8be4998f206735ac72e11da 100644 (file)
@@ -722,6 +722,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
        List       *attnamelist = stmt->attlist;
        List       *force_quote = NIL;
        List       *force_notnull = NIL;
+       bool            force_quote_all = false;
        AclMode         required_access = (is_from ? ACL_INSERT : ACL_SELECT);
        AclMode         relPerms;
        AclMode         remainingPerms;
@@ -729,8 +730,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
        TupleDesc       tupDesc;
        int                     num_phys_attrs;
        uint64          processed;
-       bool            force_quote_all = false;
-       
+
        /* Allocate workspace and zero all fields */
        cstate = (CopyStateData *) palloc0(sizeof(CopyStateData));
 
@@ -805,12 +805,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
                }
                else if (strcmp(defel->defname, "force_quote") == 0)
                {
-                       if (force_quote)
+                       if (force_quote || force_quote_all)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
                                                 errmsg("conflicting or redundant options")));
-
-                       if (IsA(defel->arg, A_Star))
+                       if (defel->arg && IsA(defel->arg, A_Star))
                                force_quote_all = true;
                        else
                                force_quote = (List *) defel->arg;
@@ -930,11 +929,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
                                 errmsg("COPY escape must be a single one-byte character")));
 
        /* Check force_quote */
-       if (!cstate->csv_mode && force_quote != NIL)
+       if (!cstate->csv_mode && (force_quote != NIL || force_quote_all))
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("COPY force quote available only in CSV mode")));
-       if (force_quote != NIL && is_from)
+       if ((force_quote != NIL || force_quote_all) && is_from)
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("COPY force quote only available using COPY TO")));
index 5b9c6059d9fbfe840d0406a4ba0db8a3b93ce267..2c88520b877de393475877a8d9d3c9d86b16c0bc 100644 (file)
  *     \copy tablename [(columnlist)] from|to filename
  *       [ with ] [ binary ] [ oids ] [ delimiter [as] char ] [ null [as] string ]
  *       [ csv  [ header ] [ quote [ AS ] string ]  escape [as] string
- *             [ force not null column [, ...] | force quote column [, ...] ] ]
+ *             [ force not null column [, ...] | force quote column [, ...] | * ] ]
  *
  *     \copy ( select stmt ) to filename
  *       [ with ] [ binary ] [ delimiter [as] char ] [ null [as] string ]
  *       [ csv  [ header ] [ quote [ AS ] string ]  escape [as] string
- *             [ force quote column [, ...] ] ]
+ *             [ force quote column [, ...] | * ] ]
  *
  * Force quote only applies for copy to; force not null only applies for
  * copy from.