From: Michael Meskes
authorMarc G. Fournier
Mon, 21 Sep 1998 05:52:55 +0000 (05:52 +0000)
committerMarc G. Fournier
Mon, 21 Sep 1998 05:52:55 +0000 (05:52 +0000)
+ Mon Aug 31 09:40:04 CEST 1998
+
+       - Minor patch to Makefile
+       - Put pgc.l in sync with scan.l
+
+ Tue Sep  1 11:31:05 CEST 1998
+
+       - Fixed another bug in preproc.y
+
+ Thu Sep  3 12:21:16 CEST 1998
+
+       - Sync preproc.y with gram.y
+
+ Mon Sep 14 09:21:02 CEST 1998
+
+       - Sync preproc.y with gram.y yet again
+
+ Thu Sep 17 08:55:33 CEST 1998
+
+       - Synced preproc.y and gram.y one more time
+
+ Thu Sep 17 19:23:24 CEST 1998
+
+       - Added missing ´;´ in preproc.y
+       - Set version to 2.4.2

src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/Makefile
src/interfaces/ecpg/preproc/keywords.c
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/preproc.y

index 71ac693da3828c9d908051ab59f23199b0730728..da0cdaa0b3e4c715477ed792720cd7183ef8c4c0 100644 (file)
@@ -311,3 +311,29 @@ Fri Aug 28 15:36:58 CEST 1998
    - Removed one line of code that AIX complains about since it was not
      needed anyway
    - Set library version to 2.6.1
+
+Mon Aug 31 09:40:04 CEST 1998
+
+   - Minor patch to Makefile
+   - Put pgc.l in sync with scan.l
+
+Tue Sep  1 11:31:05 CEST 1998
+
+   - Fixed another bug in preproc.y
+
+Thu Sep  3 12:21:16 CEST 1998
+
+   - Sync preproc.y with gram.y
+
+Mon Sep 14 09:21:02 CEST 1998
+
+   - Sync preproc.y with gram.y yet again
+
+Thu Sep 17 08:55:33 CEST 1998
+
+   - Synced preproc.y and gram.y one more time
+
+Thu Sep 17 19:23:24 CEST 1998
+
+   - Added missing ´;´ in preproc.y
+   - Set version to 2.4.2
index 9ddd1fdd18fd6bf1af29782b6191c216f77f51fb..c35817fd3e049f1070b277437c55a91a60c029ee 100644 (file)
@@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global
 
 MAJOR_VERSION=2
 MINOR_VERSION=4
-PATCHLEVEL=1
+PATCHLEVEL=2
 
 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \
    -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \
index 79ba20f628e496f0fbb41ea809066c9d435054e4..30918b9fc9046ed49ff6766403521634e367efcc 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.4 1998/09/01 03:28:41 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.5 1998/09/21 05:52:53 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -150,6 +150,7 @@ static ScanKeyword ScanKeywords[] = {
    {"notnull", NOTNULL},
    {"null", NULL_P},
    {"numeric", NUMERIC},
+   {"of", OF},
    {"oids", OIDS},
    {"on", ON},
    {"operator", OPERATOR},
index 57712699c8a770bd5c28357b580c1945944269f9..a7794cfbb0ca6e8eebedf798d7c8c52ea7846199 100644 (file)
@@ -340,6 +340,9 @@ cppline     {space}*#.*(\\{space}*\n)*\n*
                        if (isascii((unsigned char)yytext[i]) && isupper(yytext[i]))
                            yytext[i] = tolower(yytext[i]);
 
+                   if (i >= NAMEDATALEN)
+                       yytext[NAMEDATALEN-1] = '\0';
+
                    keyword = ScanKeywordLookup((char*)yytext);
                    if (keyword != NULL) {
                        return keyword->value;
@@ -478,6 +481,9 @@ cppline     {space}*#.*(\\{space}*\n)*\n*
                        if (isascii((unsigned char)yytext[i]) && isupper(yytext[i]))
                            yytext[i] = tolower(yytext[i]);
 
+                   if (i >= NAMEDATALEN)
+                       yytext[NAMEDATALEN-1] = '\0';
+
                    keyword = ScanKeywordLookup((char*)yytext);
                    if (keyword != NULL) {
                        return keyword->value;
index 63389405c2d3061d5d1f431ae97286500df98bd7..17a370aaebfb69cb205a3e835fe6cea491485874 100644 (file)
@@ -528,7 +528,7 @@ output_statement(char * stmt, int mode)
 %token     TYPECAST
 
 /* Keywords (in SQL92 reserved words) */
-%token  ACTION, ADD, ALL, ALTER, AND, ANY AS, ASC,
+%token  ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY AS, ASC,
                 BEGIN_TRANS, BETWEEN, BOTH, BY,
                 CASCADE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COLLATE, COLUMN, COMMIT, 
                 CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME, 
@@ -537,14 +537,14 @@ output_statement(char * stmt, int mode)
                 END_TRANS, EXECUTE, EXISTS, EXTRACT,
                 FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
                 GRANT, GROUP, HAVING, HOUR_P,
-                IN, INNER_P, INSERT, INTERVAL, INTO, IS,
+                IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS,
                 JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL,
                 MATCH, MINUTE_P, MONTH_P, NAMES,
-                NATIONAL, NATURAL, NCHAR, NO, NOT, NOTIFY, NULL_P, NUMERIC,
-                ON, OPTION, OR, ORDER, OUTER_P,
-                PARTIAL, POSITION, PRECISION, PRIMARY, PRIVILEGES, PROCEDURE, PUBLIC,
-                REFERENCES, REVOKE, RIGHT, ROLLBACK,
-                SECOND_P, SELECT, SET, SUBSTRING,
+                NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NOTIFY, NULL_P, NUMERIC,
+                OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
+                PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
+                READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
+                SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
                 TABLE, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
        TO, TRAILING, TRANSACTION, TRIM,
                 UNION, UNIQUE, UPDATE, USER, USING,
@@ -620,7 +620,7 @@ output_statement(char * stmt, int mode)
 %type     ColId default_expr ColQualifier columnDef ColQualList
 %type      ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
 %type      OptTableElementList OptTableElement TableConstraint
-%type      ConstraintElem key_actions constraint_list
+%type      ConstraintElem key_actions constraint_list ColPrimaryKey
 %type      res_target_list res_target_el res_target_list2
 %type      res_target_el2 opt_id relation_name database_name
 %type      access_method attr_name class index_name name func_name
@@ -667,6 +667,7 @@ output_statement(char * stmt, int mode)
 %type      ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location
 %type      DestroydbStmt ClusterStmt grantee RevokeStmt encoding
 %type     GrantStmt privileges operation_commalist operation
+%type     cursor_clause, opt_cursor, opt_readonly, opt_of
 
 %type     ECPGWhenever ECPGConnect connection_target ECPGOpen open_opts
 %type     indicator ECPGExecute ecpg_expr dotext
@@ -1083,9 +1084,9 @@ columnDef:  ColId Typename ColQualifier
                {
                    $$ = cat3_str($1, $2, $3);
                }
-   | ColId SERIAL
+   | ColId SERIAL ColPrimaryKey
        {
-           $$ = make2_str($1, make1_str(" serial"));
+           $$ = make3_str($1, make1_str(" serial "), $3);
        }
        ;
 
@@ -1097,6 +1098,16 @@ ColQualList:  ColQualList ColConstraint  { $$ = cat2_str($1,$2); }
            | ColConstraint     { $$ = $1; }
        ;
 
+ColPrimaryKey:  PRIMARY KEY
+                {
+           $$ = make1_str("primary key");
+                }
+              | /*EMPTY*/
+       {
+           $$ = make1_str("");
+       }
+                ;
+
 ColConstraint:
        CONSTRAINT name ColConstraintElem
                {
@@ -1106,10 +1117,29 @@ ColConstraint:
                { $$ = $1; }
        ;
 
+/* The column constraint WITH NULL gives a shift/reduce error
+ * because it requires yacc to look more than one token ahead to
+ * resolve WITH TIME ZONE and WITH NULL.
+ * So, leave it out of the syntax for now.
+                       | WITH NULL_P
+                               {
+                                       $$ = NULL;
+                               }
+ * - thomas 1998-09-12
+ *
+ * DEFAULT NULL is already the default for Postgres.
+ * Bue define it here and carry it forward into the system
+ * to make it explicit.
+ * - thomas 1998-09-13
+ */
 ColConstraintElem:  CHECK '(' constraint_expr ')'
                {
                    $$ = make3_str(make1_str("check("), $3, make1_str(")"));
                }
+           | DEFAULT NULL_P
+               {
+                   $$ = make1_str("default null");
+               }
            | DEFAULT default_expr
                {
                    $$ = cat2_str(make1_str("default"), $2);
@@ -1143,10 +1173,16 @@ default_list:  default_list ',' default_expr
                }
        ;
 
+/* The Postgres default column value is NULL.
+ * Rather than carrying DEFAULT NULL forward as a clause,
+ * let's just have it be a no-op.
+                        | NULL_P
+               {   $$ = make1_str("null"); }
+ * - thomas 1998-09-13
+ */
+
 default_expr:  AexprConst
                {   $$ = $1; }
-           | NULL_P
-               {   $$ = make1_str("null"); }
            | '-' default_expr %prec UMINUS
                {   $$ = cat2_str(make1_str("-"), $2); }
            | default_expr '+' default_expr
@@ -1559,7 +1595,7 @@ TriggerForType:  ROW                  { $$ = make1_str("row"); }
        ;
 
 TriggerFuncArgs:  TriggerFuncArg
-               { $$ = $1 }
+               { $$ = $1; }
            | TriggerFuncArgs ',' TriggerFuncArg
                { $$ = cat3_str($1, make1_str(","), $3); }
            | /*EMPTY*/
@@ -1667,12 +1703,17 @@ DestroyStmt:  DROP TABLE relation_name_list
 /*****************************************************************************
  *
  *     QUERY:
- *         fetch/move [forward | backward] [number | all ] [ in  ]
+ *                     fetch/move [forward | backward] [ # | all ] [ in  ]
+ *                     fetch [ forward | backward | absolute | relative ]
+ *                           [ # | all | next | prior ] [ [ in | from ]  ]
  *
  *****************************************************************************/
 
 FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
                {
+                   if (strncmp($2, "relative", strlen("relative")) == 0 && atol($3) == 0L)
+                       yyerror("FETCH/RELATIVE at current position is not supported");
+
                    $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
                }
        |   MOVE opt_direction fetch_how_many opt_portal_name
@@ -1683,18 +1724,26 @@ FetchStmt:  FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
 
 opt_direction: FORWARD     { $$ = make1_str("forward"); }
        | BACKWARD  { $$ = make1_str("backward"); }
+       | RELATIVE      { $$ = make1_str("relative"); }
+                | ABSOLUTE
+               {
+                   fprintf(stderr, "FETCH/ABSOLUTE not supported, using RELATIVE");
+                   $$ = make1_str("absolute");
+               }
        | /*EMPTY*/ { $$ = make1_str(""); /* default */ }
        ;
 
-fetch_how_many:  Iconst
-              { $$ = $1;
-                if (atol($1) <= 0) yyerror("Please specify nonnegative count for fetch"); }
+fetch_how_many:   Iconst        { $$ = $1; }
+       | '-' Iconst    { $$ = make2_str(make1_str("-"), $2); }
        | ALL       { $$ = make1_str("all"); }
+       | NEXT      { $$ = make1_str("next"); }
+       | PRIOR     { $$ = make1_str("prior"); }
        | /*EMPTY*/ { $$ = make1_str(""); /*default*/ }
        ;
 
 opt_portal_name:  IN name      { $$ = cat2_str(make1_str("in"), $2); }
-       | name          { $$ = cat2_str(make1_str("in"), $1); }
+       | FROM name     { $$ = cat2_str(make1_str("from"), $2); }
+/*     | name          { $$ = cat2_str(make1_str("in"), $1); */
        | /*EMPTY*/     { $$ = make1_str(""); }
        ;
 
@@ -2328,6 +2377,10 @@ insert_rest:  VALUES '(' res_target_list2 ')'
                {
                    $$ = make3_str(make1_str("values("), $3, make1_str(")"));
                }
+       | DEFAULT VALUES
+               {
+                   $$ = make1_str("default values");
+               }
        | SELECT opt_unique res_target_list2
             from_clause where_clause
             group_clause having_clause
@@ -2404,11 +2457,12 @@ UpdateStmt:  UPDATE relation_name
  *             CURSOR STATEMENTS
  *
  *****************************************************************************/
-CursorStmt:  DECLARE name opt_binary CURSOR FOR
+CursorStmt:  DECLARE name opt_cursor CURSOR FOR
             SELECT opt_unique res_target_list2
             from_clause where_clause
             group_clause having_clause
             union_clause sort_clause
+            cursor_clause
                {
                    struct cursor *ptr, *this;
    
@@ -2438,7 +2492,26 @@ CursorStmt:  DECLARE name opt_binary CURSOR FOR
                }
        ;
 
+opt_cursor:  BINARY             { $$ = make1_str("binary"); }
+               | INSENSITIVE   { $$ = make1_str("insensitive"); }
+               | SCROLL         { $$ = make1_str("scroll"); }
+               | INSENSITIVE SCROLL    { $$ = make1_str("insensitive scroll"); }
+               | /*EMPTY*/      { $$ = make1_str(""); }
+               ;
+
+cursor_clause:  FOR opt_readonly   { $$ = cat2_str(make1_str("for"), $2); }
+               | /*EMPTY*/              { $$ = make1_str(""); }
+
+               ;
+
+opt_readonly:  READ ONLY       { $$ = make1_str("read only"); }
+               | UPDATE opt_of
+                       {
+                               yyerror("DECLARE/UPDATE not supported; Cursors must be READ ONLY.");
+                       }
+               ;
 
+opt_of:  OF columnList { $$ = make2_str(make1_str("of"), $2); }
 
 /*****************************************************************************
  *
@@ -3776,6 +3849,7 @@ TypeId:  ColId
  */
 ColId:  ident                          { $$ = $1; }
        | datetime                      { $$ = $1; }
+       | ABSOLUTE                      { $$ = make1_str("absolute"); }
        | ACTION                        { $$ = make1_str("action"); }
        | CACHE                         { $$ = make1_str("cache"); }
        | CYCLE                         { $$ = make1_str("cycle"); }
@@ -3787,18 +3861,26 @@ ColId:  ident                           { $$ = $1; }
        | FUNCTION                      { $$ = make1_str("function"); }
        | INCREMENT                     { $$ = make1_str("increment"); }
        | INDEX                         { $$ = make1_str("index"); }
+       | INSENSITIVE                       { $$ = make1_str("insensitive"); }
        | KEY                           { $$ = make1_str("key"); }
        | LANGUAGE                      { $$ = make1_str("language"); }
        | LOCATION                      { $$ = make1_str("location"); }
        | MATCH                         { $$ = make1_str("match"); }
        | MAXVALUE                      { $$ = make1_str("maxvalue"); }
        | MINVALUE                      { $$ = make1_str("minvalue"); }
+       | NEXT                          { $$ = make1_str("next"); }
+       | OF                            { $$ = make1_str("of"); }
+       | ONLY                          { $$ = make1_str("only"); }
        | OPERATOR                      { $$ = make1_str("operator"); }
        | OPTION                        { $$ = make1_str("option"); }
        | PASSWORD                      { $$ = make1_str("password"); }
-       | PRIVILEGES                    { $$ = make1_str("privileges"); }
+       | PRIOR                         { $$ = make1_str("prior"); }
+       | PRIVILEGES                        { $$ = make1_str("privileges"); }
+       | READ                          { $$ = make1_str("read"); }
        | RECIPE                        { $$ = make1_str("recipe"); }
+       | RELATIVE                      { $$ = make1_str("relative"); }
        | ROW                           { $$ = make1_str("row"); }
+       | SCROLL                        { $$ = make1_str("scroll"); }
        | SERIAL                        { $$ = make1_str("serial"); }
        | START                         { $$ = make1_str("start"); }
        | STATEMENT                     { $$ = make1_str("statement"); }
@@ -4006,7 +4088,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer
                                switch(dimension)
                                {
                                   case 0:
-                                      strcpy("[]", dim);
+                                      strcpy(dim, "[]");
                                       break;
                                   case 1:
                                       *dim = '\0';