pg.ddx.io  pgsql-bugs@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: vilarion@illarion.org
Subject: BUG #17142: COPY ignores client_encoding for octal digit characters
Date: Wed, 11 Aug 2021 21:24:45 +0000
Message-ID: <17142-9181542ca1df75ab@postgresql.org> (raw)

The following bug has been logged on the website:

Bug reference:      17142
Logged by:          Andreas Grob
Email address:      vilarion@illarion.org
PostgreSQL version: 13.3
Operating system:   Debian GNU/Linux 11 (bullseye)
Description:        

Test db and table:
```
CREATE DATABASE test WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE
= 'C' LC_CTYPE = 'C';
CREATE TABLE test (text character varying(50));
```

Test program in C:
```
#include <postgresql/libpq-fe.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    const char *conninfo;
    char *errmsg;
    PGconn     *conn;
    PGresult   *res;
    int a, b;
    ExecStatusType status;
    int enc;

    char buffer[] = "\\304\\366\\337"; //Äöß
    // char buffer[] = "\304\366\337"; //Äöß

    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "user=postgres dbname=test port=5433
client_encoding=LATIN1";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s"
                , PQerrorMessage(conn));
        PQfinish(conn);
        exit(1);
    }

    res = PQexec(conn, "BEGIN");

    res = PQexec(conn, "COPY public.test(text) from STDIN;");
    a = PQputCopyData(conn, buffer, strlen(buffer));
    b = PQputCopyEnd(conn, NULL);
    res = PQgetResult(conn);
    status = PQresultStatus(res);
    enc = PQclientEncoding(conn);
    errmsg = PQresultErrorMessage(res);

    printf("status=%d a=%d,b=%d, enc=%d\n", status, a, b, enc);

    if (status != PGRES_COMMAND_OK)
        printf("%s\n", errmsg);
    else
        printf("worked.\n");

    res = PQexec(conn, "COMMIT");

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}
```

Output:
```
status=7 a=1,b=1, enc=8
ERROR:  invalid byte sequence for encoding "UTF8": 0xc4 0xf6
CONTEXT:  COPY test, line 1: "\304\366\337"
```

Expected output:
```
status=1 a=1,b=1, enc=8
worked.
```
(Äöß got inserted into the table.)


Characters in octal digits should be possible as per
https://www.postgresql.org/docs/13/sql-copy.html
When using characters directly (char buffer[] = "\304\366\337") the expected
output is displayed.

My apologies if I misunderstood something.



view thread (4+ messages)  latest in thread

Message-ID: <17142-9181542ca1df75ab@postgresql.org>
Permalink:  ../17142-9181542ca1df75ab@postgresql.org/
Also on:    postgresql.org/message-id/17142-9181542ca1df75ab@postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-bugs@postgresql.org
  Cc: noreply@postgresql.org, pgsql-bugs@lists.postgresql.org, vilarion@illarion.org
  Subject: Re: BUG #17142: COPY ignores client_encoding for octal digit characters
  In-Reply-To: <17142-9181542ca1df75ab@postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox