Обсуждение: postgres bug

Поиск
Список
Период
Сортировка

postgres bug

От
Norman Stevens
Дата:
============================================================================
                        POSTGRESQL BUG REPORT TEMPLATE
============================================================================


Your name        :        NF Stevens
Your email address    :    norman@arcady.u-net.com


System Configuration
---------------------
  Architecture (example: Intel Pentium)      :

    processor    : 0
    vendor_id    : CyrixInstead
    cpu family    : 5
    model        : 4
    model name    : 6x86L 2x Core/Bus Clock
    stepping    : 2
    fdiv_bug    : no
    hlt_bug        : no
    sep_bug        : no
    f00f_bug    : no
    coma_bug    : yes
    fpu        : yes
    fpu_exception    : yes
    cpuid level    : 1
    wp        : yes
    flags        : fpu de cx8 mtrr
    bogomips    : 149.50

  Operating System (example: Linux 2.0.26 ELF)     :

    Linux arcady 2.2.10 #2 Sat Jul 17 15:52:35 BST 1999 i586 unknown

  PostgreSQL version (example: PostgreSQL-6.5.1):   PostgreSQL-6.5.1

  Compiler used (example:  gcc 2.8.0)        :

    gcc version egcs-2.91.60 19981201 (egcs-1.1.1 release)

  Libc version : glibc-2.1.1

Please enter a FULL description of your problem:
------------------------------------------------

Inserts into a varchar field where the value contains a quote character
(') fail when the statement has been dynamically prepared.


Please describe a way to repeat the problem.   Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

EXEC SQL INCLUDE sqlca;

int main (void)
{

    EXEC SQL BEGIN DECLARE SECTION;
    char Query [128] = "INSERT into e (name,size) values (:name,:size)";
    char name [1024];
    int size = 64;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT norman;

    /* Don't complain about table existing the second time it's run */
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL CREATE TABLE e (name varchar (32), size integer);
    EXEC SQL COMMIT;
    sqlca.sqlcode = 0;

    EXEC SQL WHENEVER SQLERROR Goto Error;
    EXEC SQL PREPARE Stmt FROM :Query;
    printf ("Prepared\n");

    strcpy (name, "abcdef");
    EXEC SQL EXECUTE Stmt USING :name,:size;
    printf ("Executed 1\n");

    strcpy (name, "abc'ef");
    EXEC SQL EXECUTE Stmt USING :name,:size;
    printf ("Executed 2\n");

    EXEC SQL COMMIT;

    printf ("Committed\n");
    return 0;
Error:
    printf ("Oops \"%s\"\n", name);
    printf ("%*.*s\n", sqlca.sqlerrm.sqlerrml,
         sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    return 2;
}

The output of this program is

Prepared
Executed 1
Oops "abc'ef"
Too many arguments line 34.

If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------

Unknown at this time.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

EXEC SQL INCLUDE sqlca;

int main (void)
{

    EXEC SQL BEGIN DECLARE SECTION;
    char Query [128] = "INSERT into e (name,size) values (:name,:size)";
    char name [1024];
    int size = 64;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT norman;

    /* Don't complain about table existing the second time it's run */
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL CREATE TABLE e (name varchar (32), size integer);
    EXEC SQL COMMIT;
    sqlca.sqlcode = 0;

    EXEC SQL WHENEVER SQLERROR Goto Error;
    EXEC SQL PREPARE Stmt FROM :Query;
    printf ("Prepared\n");

    strcpy (name, "abcdef");
    EXEC SQL EXECUTE Stmt USING :name,:size;
    printf ("Executed 1\n");

    strcpy (name, "abc'ef");
    EXEC SQL EXECUTE Stmt USING :name,:size;
    printf ("Executed 2\n");

    EXEC SQL COMMIT;

    printf ("Committed\n");
    return 0;
Error:
    printf ("Oops \"%s\"\n", name);
    printf ("%*.*s\n", sqlca.sqlerrm.sqlerrml,
             sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    return 2;
}