Added just another test case.
authorMichael Meskes <meskes@postgresql.org>
Wed, 8 Feb 2006 09:10:05 +0000 (09:10 +0000)
committerMichael Meskes <meskes@postgresql.org>
Wed, 8 Feb 2006 09:10:05 +0000 (09:10 +0000)
 Fixed missing continuation line character.
 Do not translate $-quoting.
 Bit field notation belongs to a variable not a variable list.
 Output of line number only done by one function.

src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/preproc/output.c
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/test/Makefile
src/interfaces/ecpg/test/perftest.pgc
src/interfaces/ecpg/test/test1.pgc
src/interfaces/ecpg/test/test5.pgc
src/interfaces/ecpg/test/test_func.pgc [new file with mode: 0644]

index 6f447bc979245847da89b64ce596a95f1c9665cf..0bc5d78fa7bc7795ee2c80f8b58c44a590c41415 100644 (file)
@@ -1982,6 +1982,17 @@ Sa Feb  4 21:35:03 CET 2006
    - Added C bit fields to ecpg parser.
    - Added some default rules to lexer.
    - Added log output to prepare statement.
+   
+Mo Feb  6 21:21:19 CET 2006
+
+   - Added just another test case.
+   - Fixed missing continuation line character.
+   - Do not translate $-quoting.
+   
+Tu Feb  7 18:48:14 CET 2006
+
+   - Bit field notation belongs to a variable not a variable list.
+   - Output of line number only done by one function.
    - Set ecpg library version to 5.2.
    - Set ecpg version to 4.2.1.
 
index 41625fa758a2188c6a02ef5ea5ce41d592fecce1..c06075ad5f962c32d3decca1e25c32659abef28c 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.93 2005/10/15 02:49:47 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.94 2006/02/08 09:10:04 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -418,7 +418,7 @@ main(int argc, char *const argv[])
                    fprintf(yyout, "/* End of automatic include section */\n");
                }
 
-               fprintf(yyout, "#line 1 \"%s\"\n", input_filename);
+               output_line_number();
 
                /* and parse the source */
                yyparse();
index 2af7fdcaeb94050ad5a6e29067eb2f89ea780973..8e434e18f3cffee20c4148bd5586bd90202ed272 100644 (file)
@@ -2,19 +2,22 @@
 
 #include "extern.h"
 
-static void ouput_escaped_str(char *cmd);
+static void output_escaped_str(char *cmd);
 
 void
 output_line_number(void)
 {
-   if (input_filename)
-       fprintf(yyout, "\n#line %d \"%s\"\n", yylineno, input_filename);
+   char *line = hashline_number();
+   
+   /* output_escaped_str(line); */
+   fprintf(yyout, "%s", line);
+   free(line);
 }
 
 void
 output_simple_statement(char *stmt)
 {
-   ouput_escaped_str(stmt);
+   output_escaped_str(stmt);
    output_line_number();
    free(stmt);
 }
@@ -83,7 +86,8 @@ whenever_action(int mode)
 char *
 hashline_number(void)
 {
-   if (input_filename)
+   /* do not print line numbers if we are in debug mode */
+   if (input_filename && !yydebug)
    {
        char       *line = mm_alloc(strlen("\n#line %d \"%s\"\n") + 21 + strlen(input_filename));
 
@@ -99,7 +103,7 @@ void
 output_statement(char *stmt, int mode, char *con)
 {
    fprintf(yyout, "{ ECPGdo(__LINE__, %d, %d, %s, \"", compat, force_indicator, con ? con : "NULL");
-   ouput_escaped_str(stmt);
+   output_escaped_str(stmt);
    fputs("\", ", yyout);
 
    /* dump variables to C file */
@@ -118,7 +122,7 @@ output_statement(char *stmt, int mode, char *con)
 
 
 static void
-ouput_escaped_str(char *str)
+output_escaped_str(char *str)
 {
    int         i, len = strlen(str);
 
@@ -128,7 +132,8 @@ ouput_escaped_str(char *str)
        if (str[i] == '"')
            fputs("\\\"", yyout);
        else if (str[i] == '\n')
-           fputs("\\n\\\n", yyout);
+           //fputs("\\n\\\n", yyout);
+           fputs("\\\n", yyout);
        else
            fputc(str[i], yyout);
    }
index d89bbad9782ebce839895641c51d8630142dc0b8..223e108e26d83b965057297c516b706dfb729d6b 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.142 2006/02/04 20:54:42 meskes Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.143 2006/02/08 09:10:04 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -152,7 +152,7 @@ dolq_start      [A-Za-z\200-\377_]
 dolq_cont      [A-Za-z\200-\377_0-9]
 dolqdelim      \$({dolq_start}{dolq_cont}*)?\$
 dolqfailed     \${dolq_start}{dolq_cont}*
-dolqinside     [^$']+
+dolqinside     [^$]+
 
 /* Double quote
  * Allows embedded spaces and other special characters into identifiers.
@@ -437,7 +437,7 @@ cppline         {space}*#(.*\\{space})*.*{newline}
                addlit(yytext, yyleng);
            }
 <xq>{quotecontinue}    { /* ignore */ }
-<xq>.      {
+<xq>{other}        {
               /* This is only needed for \ just before EOF */
               addlitchar(yytext[0]);
            }
@@ -453,14 +453,16 @@ cppline           {space}*#(.*\\{space})*.*{newline}
                dolqstart = mm_strdup(yytext);
                BEGIN(xdolq);
                startlit();
+               addlit(yytext, yyleng);
            }
 <xdolq>{dolqdelim}      {
                if (strcmp(yytext, dolqstart) == 0)
                {
+                   addlit(yytext, yyleng);
                    free(dolqstart);
                    BEGIN(SQL);
                    yylval.str = mm_strdup(literalbuf);
-                   return SCONST;
+                   return DOLCONST;
                }
                else
                {
@@ -475,15 +477,11 @@ cppline           {space}*#(.*\\{space})*.*{newline}
            }
 <xdolq>{dolqinside}    { addlit(yytext, yyleng); }
 <xdolq>{dolqfailed}    { addlit(yytext, yyleng); }
-<xdolq>.   {
-               /* $$ is implemented as a single-quoted string, so double it? */
-               if (yytext[0] == '\'')
-                   addlitchar(yytext[0]);
+<xdolq>{other}     {
                /* single quote or dollar sign */
                addlitchar(yytext[0]);
            }
-<xdolq><<EOF>> { yyerror("unterminated dollar-quoted string"); }
-
+<xdolq><<EOF>>         { yyerror("unterminated dollar-quoted string"); }
 <SQL>{xdstart}     {
                        state_before = YYSTATE;
                        BEGIN(xd);
@@ -625,8 +623,8 @@ cppline         {space}*#(.*\\{space})*.*{newline}
 <SQL>{ip}          {
                        yylval.str = mm_strdup(yytext);
                        return IP;
-                   }
-{decimal}          {
+               }
+<C,SQL>{decimal}   {
                        yylval.str = mm_strdup(yytext);
                        return FCONST;
            }
@@ -797,7 +795,7 @@ cppline         {space}*#(.*\\{space})*.*{newline}
 <C>"-"             { return('-'); }
 <C>"("             { return('('); }
 <C>")"             { return(')'); }
-<C,xskip>{space}   { ECHO; }
+<C,xskip>{space}       { ECHO; }
 <C>\{              { return('{'); }
 <C>\}              { return('}'); }
 <C>\[              { return('['); }
@@ -1037,7 +1035,6 @@ cppline           {space}*#(.*\\{space})*.*{newline}
                             if (strcmp(old, ptr->old) == 0)
                             {
                                free(ptr->new);
-                               /* ptr->new = mm_strdup(scanstr(literalbuf));*/
                                ptr->new = mm_strdup(literalbuf);
                             }
                        }
index 63b18a1ae8ed7a7c52d50a2469d041d4facf0a73..4c07d4218c0a85ca2495651013126eff65062645 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.319 2006/02/04 20:54:42 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.320 2006/02/08 09:10:04 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -433,7 +433,7 @@ add_additional_variables(char *name, bool insert)
 %token UNIONJOIN
 
 /* Special token types, not actually keywords - see the "lex" file */
-%token <str>   IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
+%token <str>   IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST DOLCONST
 %token <ival>  ICONST PARAM
 %token <dval>  FCONST
 
@@ -1519,7 +1519,7 @@ ColConstraintElem:    NOT NULL_P
  * there is no parsing conflict.
  */
 ConstraintAttr: DEFERRABLE     { $$ = make_str("deferrable"); }
-       | NOT DEFERRABLE        { $$ = make_str("not deferrable"); }
+       | NOT DEFERRABLE    { $$ = make_str("not deferrable"); }
        | INITIALLY DEFERRED    { $$ = make_str("initially deferred"); }
        | INITIALLY IMMEDIATE   { $$ = make_str("initially immediate"); }
        ;
@@ -4383,7 +4383,11 @@ Sconst:  SCONST
            $$[strlen($1)+2]='\0';
            free($1);
        }
-       ;
+   | DOLCONST
+       {
+           $$ = $1; 
+       }
+   ;
 
 PosIntConst:   Iconst      { $$ = $1; }
        | civar     { $$ = $1; }
@@ -4740,9 +4744,9 @@ single_var_declaration: storage_declaration
 
            actual_startline[struct_level] = hashline_number();
        }
-       variable_list opt_bit_field';'
+       variable_list ';'
        {
-           $$ = cat_str(6, actual_startline[struct_level], $1, $2.type_str, $4, $5, make_str(";\n"));
+           $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, make_str(";\n"));
        }
        | var_type
        {
@@ -4753,9 +4757,9 @@ single_var_declaration: storage_declaration
 
            actual_startline[struct_level] = hashline_number();
        }
-       variable_list opt_bit_field';'
+       variable_list ';'
        {
-           $$ = cat_str(5, actual_startline[struct_level], $1.type_str, $3, $4, make_str(";\n"));
+           $$ = cat_str(4, actual_startline[struct_level], $1.type_str, $3, make_str(";\n"));
        }
        | struct_union_type_with_symbol ';'
        {
@@ -4799,10 +4803,10 @@ var_type_declarations:  /*EMPTY*/           { $$ = EMPTY; }
        ;
 
 vt_declarations:  var_declaration          { $$ = $1; }
-       | type_declaration                  { $$ = $1; }
+       | type_declaration          { $$ = $1; }
        | vt_declarations var_declaration   { $$ = cat2_str($1, $2); }
        | vt_declarations type_declaration  { $$ = cat2_str($1, $2); }
-       | vt_declarations CPP_LINE          { $$ = cat2_str($1, $2); }
+       | vt_declarations CPP_LINE      { $$ = cat2_str($1, $2); }
        ;
 
 variable_declarations: var_declaration     { $$ = $1; }
@@ -4875,9 +4879,9 @@ var_declaration: storage_declaration
 
            actual_startline[struct_level] = hashline_number();
        }
-       variable_list opt_bit_field';'
+       variable_list ';'
        {
-           $$ = cat_str(6, actual_startline[struct_level], $1, $2.type_str, $4, $5, make_str(";\n"));
+           $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, make_str(";\n"));
        }
        | var_type
        {
@@ -4888,9 +4892,9 @@ var_declaration: storage_declaration
 
            actual_startline[struct_level] = hashline_number();
        }
-       variable_list opt_bit_field';'
+       variable_list ';'
        {
-           $$ = cat_str(5, actual_startline[struct_level], $1.type_str, $3, $4, make_str(";\n"));
+           $$ = cat_str(4, actual_startline[struct_level], $1.type_str, $3, make_str(";\n"));
        }
        | struct_union_type_with_symbol ';'
        {
@@ -5266,7 +5270,7 @@ variable_list: variable
            { $$ = cat_str(3, $1, make_str(","), $3); }
        ;
 
-variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
+variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initializer
        {
            struct ECPGtype * type;
            char *dimension = $3.index1; /* dimension of array */
@@ -5284,7 +5288,7 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
                    else
                        type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_sizeof), dimension);
 
-                   $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
+                   $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
                    break;
 
                case ECPGt_varchar:
@@ -5302,9 +5306,9 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
                        mmerror(PARSE_ERROR, ET_ERROR, "pointer to varchar are not implemented");
 
                    if (strcmp(dimension, "0") == 0)
-                       $$ = cat_str(6, make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } *"), mm_strdup($2), $4);
+                       $$ = cat_str(7, make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } *"), mm_strdup($2), $4, $5);
                    else
-                       $$ = cat_str(7, make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } "), mm_strdup($2), mm_strdup(dim), $4);
+                       $$ = cat_str(8, make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } "), mm_strdup($2), mm_strdup(dim), $4, $5);
                    break;
 
                case ECPGt_char:
@@ -5314,7 +5318,7 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
                    else
                        type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
 
-                   $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
+                   $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
                    break;
 
                default:
@@ -5323,7 +5327,7 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
                    else
                        type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, make_str("1")), dimension);
 
-                   $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
+                   $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
                    break;
            }
 
@@ -5824,7 +5828,7 @@ ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action
        {
            when_warn.code = $<action>3.code;
            when_warn.command = $<action>3.command;
-           $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */\n"));
+           $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */"));
        }
        ;
 
@@ -6517,7 +6521,7 @@ c_stuff_item: c_anything          { $$ = $1; }
            { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
        ;
 
-c_stuff: c_stuff_item  { $$ = $1; }
+c_stuff: c_stuff_item          { $$ = $1; }
        | c_stuff c_stuff_item
            { $$ = cat2_str($1, $2); }
        ;
@@ -6530,15 +6534,14 @@ c_term:  c_stuff            { $$ = $1; }
        | '{' c_list '}'    { $$ = cat_str(3, make_str("{"), $2, make_str("}")); }
        ;
 
-c_thing:   c_anything  { $$ = $1; }
-       |   '('         { $$ = make_str("("); }
-       |   ')'         { $$ = make_str(")"); }
-       |   ','         { $$ = make_str(","); }
-       |   ';'         { $$ = make_str(";"); }
-       |   ':'         { $$ = make_str(":"); }
+c_thing:   c_anything      { $$ = $1; }
+       |   '('     { $$ = make_str("("); }
+       |   ')'     { $$ = make_str(")"); }
+       |   ','     { $$ = make_str(","); }
+       |   ';'     { $$ = make_str(";"); }
        ;
 
-c_anything:  IDENT         { $$ = $1; }
+c_anything:  IDENT             { $$ = $1; }
        | CSTRING           { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
        | Iconst            { $$ = $1; }
        | Fconst            { $$ = $1; }
@@ -6551,28 +6554,28 @@ c_anything:  IDENT          { $$ = $1; }
        | NULL_P            { $$ = make_str("NULL"); }
        | S_ADD             { $$ = make_str("+="); }
        | S_AND             { $$ = make_str("&&"); }
-       | S_ANYTHING        { $$ = make_name(); }
+       | S_ANYTHING            { $$ = make_name(); }
        | S_AUTO            { $$ = make_str("auto"); }
        | S_CONST           { $$ = make_str("const"); }
        | S_DEC             { $$ = make_str("--"); }
        | S_DIV             { $$ = make_str("/="); }
-       | S_DOTPOINT        { $$ = make_str(".*"); }
+       | S_DOTPOINT            { $$ = make_str(".*"); }
        | S_EQUAL           { $$ = make_str("=="); }
        | S_EXTERN          { $$ = make_str("extern"); }
        | S_INC             { $$ = make_str("++"); }
        | S_LSHIFT          { $$ = make_str("<<"); }
        | S_MEMBER          { $$ = make_str("->"); }
-       | S_MEMPOINT        { $$ = make_str("->*"); }
+       | S_MEMPOINT            { $$ = make_str("->*"); }
        | S_MOD             { $$ = make_str("%="); }
        | S_MUL             { $$ = make_str("*="); }
        | S_NEQUAL          { $$ = make_str("!="); }
        | S_OR              { $$ = make_str("||"); }
-       | S_REGISTER        { $$ = make_str("register"); }
+       | S_REGISTER            { $$ = make_str("register"); }
        | S_RSHIFT          { $$ = make_str(">>"); }
        | S_STATIC          { $$ = make_str("static"); }
        | S_SUB             { $$ = make_str("-="); }
        | S_TYPEDEF         { $$ = make_str("typedef"); }
-       | S_VOLATILE        { $$ = make_str("volatile"); }
+       | S_VOLATILE            { $$ = make_str("volatile"); }
        | SQL_BOOL          { $$ = make_str("bool"); }
        | SQL_ENUM          { $$ = make_str("enum"); }
        | HOUR_P            { $$ = make_str("hour"); }
@@ -6582,9 +6585,9 @@ c_anything:  IDENT            { $$ = $1; }
        | MONTH_P           { $$ = make_str("month"); }
        | SECOND_P          { $$ = make_str("second"); }
        | SQL_SHORT         { $$ = make_str("short"); }
-       | SQL_SIGNED        { $$ = make_str("signed"); }
-       | SQL_STRUCT        { $$ = make_str("struct"); }
-       | SQL_UNSIGNED      { $$ = make_str("unsigned"); }
+       | SQL_SIGNED            { $$ = make_str("signed"); }
+       | SQL_STRUCT            { $$ = make_str("struct"); }
+       | SQL_UNSIGNED          { $$ = make_str("unsigned"); }
        | YEAR_P            { $$ = make_str("year"); }
        | CHAR_P            { $$ = make_str("char"); }
        | FLOAT_P           { $$ = make_str("float"); }
@@ -6594,6 +6597,7 @@ c_anything:  IDENT            { $$ = $1; }
        | '['               { $$ = make_str("["); }
        | ']'               { $$ = make_str("]"); }
        | '='               { $$ = make_str("="); }
+       | ':'               { $$ = make_str(":"); }
        ;
 
 %%
index b1f51eeae8881b8bf9adc38d7cc660dd07638f1d..c88f43896c107958304b2138c9fb2858c0aad889 100644 (file)
@@ -1,4 +1,4 @@
-# $PostgreSQL: pgsql/src/interfaces/ecpg/test/Makefile,v 1.52 2006/02/04 20:54:44 meskes Exp $
+# $PostgreSQL: pgsql/src/interfaces/ecpg/test/Makefile,v 1.53 2006/02/08 09:10:05 meskes Exp $
 
 subdir = src/interfaces/ecpg/test
 top_builddir = ../../../..
@@ -11,7 +11,7 @@ ECPG = ../preproc/ecpg -I$(srcdir)/../include
 
 TESTS = test1 test2 test3 test4 test5 perftest dyntest dyntest2 test_notice \
    test_code100 test_init testdynalloc num_test dt_test test_informix \
-   test_informix2 test_desc
+   test_informix2 test_desc test_func
 ifeq ($(enable_thread_safety), yes)
 TESTS += test_thread test_thread_implicit
 endif
index 0c5b1478aae820e60d4033fa8a8ed21967c697bb..7fb22588c87d3a6e17b4b26d29ef6e28a233c9a8 100644 (file)
@@ -15,7 +15,7 @@ print_result(long sec, long usec, char *text)
        sec--;
        usec+=1000000;
    }
-   printf("I needed %ld seconds and %ld microseconds for the %s test.\n", sec, usec, text);
+   printf("%ld seconds and %ld microseconds for test %s\n", sec, usec, text);
    exec sql vacuum;
    sleep(1);
 }
index 9f784ac79944bd465c2e370b59ddcefc1dc7d475..91124bbdc29b0459ae0ba22f95dc867769e4ce3d 100644 (file)
@@ -42,6 +42,9 @@ exec sql ifdef NAMELEN;
        int amount;
        char letter;
    } name_letter[AMOUNT];
+#if 0
+   int not_used;
+#endif
 exec sql endif;
         struct ind_struct
         {
index 08fcef3e0e759618f1a2380bb3898f587856eccd..841b0e379fe15f85046482803b2ed8012dbf9e0f 100644 (file)
@@ -56,7 +56,10 @@ main (void)
       exit (sqlca.sqlcode);
     }
 
-  EXEC SQL select name, accs, byte into:empl.name,:empl.accs,:empl.byte from empl where idnum =:empl.idnum;
+  EXEC SQL select name, accs, byte
+   into :empl.name, :empl.accs, :empl.byte
+   from empl
+   where idnum =:empl.idnum;
   if (sqlca.sqlcode)
     {
       printf ("select error = %ld\n", sqlca.sqlcode);
diff --git a/src/interfaces/ecpg/test/test_func.pgc b/src/interfaces/ecpg/test/test_func.pgc
new file mode 100644 (file)
index 0000000..466512a
--- /dev/null
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char* argv[]) {
+ FILE *dbgs;
+
+            if ((dbgs = fopen("log", "w")) != NULL)
+                        ECPGdebug(1, dbgs);
+  EXEC SQL CONNECT TO mm;
+
+  EXEC SQL SET AUTOCOMMIT TO ON;
+  EXEC SQL WHENEVER SQLWARNING SQLPRINT;
+  EXEC SQL WHENEVER SQLERROR SQLPRINT;
+
+  EXEC SQL CREATE TABLE My_Table ( Item1 int, Item2 text );
+
+  EXEC SQL CREATE FUNCTION My_Table_Check() RETURNS trigger
+    AS $test$
+    BEGIN
+       RAISE NOTICE 'TG_NAME=%, TG WHEN=%', TG_NAME, TG_WHEN;
+   RETURN NEW;
+    END; $test$
+    LANGUAGE 'plpgsql';
+
+  EXEC SQL CREATE TRIGGER My_Table_Check_Trigger
+    BEFORE INSERT
+    ON My_Table
+    FOR EACH ROW
+    EXECUTE PROCEDURE My_Table_Check();
+
+  EXEC SQL INSERT INTO My_Table VALUES (1234, 'Some random text');
+  EXEC SQL INSERT INTO My_Table VALUES (5678, 'The Quick Brown');
+
+  EXEC SQL DROP TRIGGER My_Table_Check_Trigger ON My_Table;
+  EXEC SQL DROP FUNCTION My_Table_Check();
+  EXEC SQL DROP TABLE My_Table;
+
+  EXEC SQL DISCONNECT ALL;
+  if (dbgs != NULL)
+                  fclose(dbgs);
+
+
+  return 0;
+}