BUG #17142: COPY ignores client_encoding for octal digit characters - Mailing list pgsql-bugs

From PG Bug reporting form
Subject BUG #17142: COPY ignores client_encoding for octal digit characters
Date
Msg-id 17142-9181542ca1df75ab@postgresql.org
Whole thread Raw
Responses Re: BUG #17142: COPY ignores client_encoding for octal digit characters  (Heikki Linnakangas <hlinnaka@iki.fi>)
List pgsql-bugs
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.


pgsql-bugs by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: BUG #17141: SELECT LIMIT WITH TIES FOR UPDATE SKIP LOCKED returns wrong number of rows
Next
From: David Christensen
Date:
Subject: Re: BUG #17141: SELECT LIMIT WITH TIES FOR UPDATE SKIP LOCKED returns wrong number of rows