Re: [HACKERS] patches for items from TODO list - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] patches for items from TODO list
Date
Msg-id 200505280408.j4S48nM02458@candle.pha.pa.us
Whole thread Raw
List pgsql-patches
I have extracted the COPY \x part of your patch, and have attached it
for later application to CVS for 8.1.

---------------------------------------------------------------------------

Sergey Ten wrote:
> Hello all,
>
> Thank you to all who replied for suggestions and help. Enclosed please find
> code changes for the following items:
> - Allow COPY to understand \x as a hex byte, and
> - Add XML output to COPY
> The changes include implementation of the features as well as modification
> of the copy regression test.
>
> After a careful consideration we decided to
> - put XML implementation in the backend and
> - use XML format described below, with justification of our decision.
>
> The XML schema used by the COPY TO command was designed for ease of use and
> to avoid the problem of column names appearing in XML element names.
> XML doesn't allow spaces and punctuation in element names but Postgres does
> allow these characters in column names; therefore, a direct mapping would be
> problematic.
>
> The solution selected places the column names into attribute fields where
> any special characters they contain can be properly escaped using XML
> entities.  An additional attribute is used to distinguish null fields from
> empty ones.
>
> The example below is taken from the test suite.  It demonstrates some basic
> XML escaping in row 2.  Row 3 demonstrates the difference between an empty
> string (in col2) and a null string (in col3).  If a field is null it will
> always be empty but a field which is empty may or may not be null.
> Always check the value of the 'null' attribute to be sure when a field is
> truly null.
>
> <?xml version='1.0'?>
> <table>
>     <row>
>         <col name='col1' null='n'>Jackson, Sam</col>
>         <col name='col2' null='n'>\h</col>
>     </row>
>     <row>
>         <col name='col1' null='n'>It is "perfect".</col>
>         <col name='col2' null='n'>	</col>
>     </row>
>     <row>
>         <col name='col1' null='n'></col>
>         <col name='col2' null='y'></col>
>     </row>
> </table>
>
> Please let us know if about any concerns, objections the proposed change may
> cause.
>
> Best regards,
> Jason Lucas, Sergey Ten
> SourceLabs
>
> > -----Original Message-----
> > From: Bruce Momjian [mailto:pgman@candle.pha.pa.us]
> > Sent: Wednesday, May 11, 2005 7:11 PM
> > To: Sergey Ten
> > Cc: pgsql-hackers@postgresql.org; jason@sourcelabs.com
> > Subject: Re: [HACKERS] patches for items from TODO list
> >
> > Sergey Ten wrote:
> > > Hello all,
> > >
> > > We would like to contribute to the Postgresql community by implementing
> > > the following items from the TODO list
> > > (http://developer.postgresql.org/todo.php):
> > > . Allow COPY to understand \x as a hex byte . Allow COPY to optionally
> > > include column headings in the first line . Add XML output to COPY
> > >
> > > The changes are straightforward and include implementation of the
> > > features as well as modification of the regression tests and
> > documentation.
> > >
> > > Before sending a diff file with the changes, we would like to know if
> > > these features have been already implemented.
> >
> > Please check the web site version.  Someone has already implemented
> > "Allow COPY to optionally include column headings in the first line".
> >
> > As far as XML, there has been discussion on where that should be done?
> > In the backend, libpq, or psql.  It will need discussion on hackers.  I
> > assume you have read the developer's FAQ too.
> >
> > --
> >   Bruce Momjian                        |  http://candle.pha.pa.us
> >   pgman@candle.pha.pa.us               |  (610) 359-1001
> >   +  If your life is a hard drive,     |  13 Roberts Road
> >   +  Christ can be your backup.        |  Newtown Square, Pennsylvania
> > 19073

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>                http://archives.postgresql.org

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/ref/copy.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/copy.sgml,v
retrieving revision 1.65
diff -c -c -r1.65 copy.sgml
*** doc/src/sgml/ref/copy.sgml    7 May 2005 02:22:45 -0000    1.65
--- doc/src/sgml/ref/copy.sgml    28 May 2005 03:49:10 -0000
***************
*** 424,436 ****
         <entry>Backslash followed by one to three octal digits specifies
         the character with that numeric code</entry>
        </row>
       </tbody>
      </tgroup>
     </informaltable>

!     Presently, <command>COPY TO</command> will never emit an octal-digits
!     backslash sequence, but it does use the other sequences listed above
!     for those control characters.
     </para>

     <para>
--- 424,441 ----
         <entry>Backslash followed by one to three octal digits specifies
         the character with that numeric code</entry>
        </row>
+       <row>
+        <entry><literal>\x</><replaceable>digits</></entry>
+        <entry>Backslash <literal>x</> followed by one or two hex digits specifies
+        the character with that numeric code</entry>
+       </row>
       </tbody>
      </tgroup>
     </informaltable>

!     Presently, <command>COPY TO</command> will never emit an octal or
!     hex-digits backslash sequence, but it does use the other sequences
!     listed above for those control characters.
     </para>

     <para>
Index: src/backend/commands/copy.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/copy.c,v
retrieving revision 1.244
diff -c -c -r1.244 copy.c
*** src/backend/commands/copy.c    7 May 2005 02:22:46 -0000    1.244
--- src/backend/commands/copy.c    28 May 2005 03:49:12 -0000
***************
*** 2274,2279 ****
--- 2274,2294 ----
      return result;
  }

+ /*
+  *    Return decimal value for a hexadecimal digit
+  */
+ static
+ int GetDecimalFromHex(char hex)
+ {
+     if (isdigit(hex))
+         return hex - '0';
+     else
+     {
+         hex = tolower(hex);
+         return hex - 'a' + 10;
+     }
+ }
+
  /*----------
   * Read the value of a single attribute, performing de-escaping as needed.
   *
***************
*** 2335,2340 ****
--- 2350,2356 ----
                  case '5':
                  case '6':
                  case '7':
+                     /* handle \013 */
                      {
                          int            val;

***************
*** 2360,2365 ****
--- 2376,2405 ----
                          c = val & 0377;
                      }
                      break;
+                 case 'x':
+                     /* Handle \x3F */
+                     if (line_buf.cursor < line_buf.len)
+                     {
+                         char hexchar = line_buf.data[line_buf.cursor];
+
+                         if (isxdigit(hexchar))
+                         {
+                             int val = GetDecimalFromHex(hexchar);
+
+                             line_buf.cursor++;
+                             if (line_buf.cursor < line_buf.len)
+                             {
+                                 hexchar = line_buf.data[line_buf.cursor];
+                                 if (isxdigit(hexchar))
+                                 {
+                                     line_buf.cursor++;
+                                     val = (val << 4) + GetDecimalFromHex(hexchar);
+                                 }
+                             }
+                             c = val & 0xff;
+                         }
+                     }
+                     break;
                  case 'b':
                      c = '\b';
                      break;

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: hash index work
Next
From: Tom Lane
Date:
Subject: Re: [HACKERS] Fix PID file location?