If we're gonna check for array overrun, we really should do so before
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Feb 2005 18:21:59 +0000 (18:21 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Feb 2005 18:21:59 +0000 (18:21 +0000)
overrunning the array, not after.

src/pl/plpgsql/src/gram.y

index a080e53adec724b0a38ea933cbc2c7e1cb3c7c7f..a4fa1546b9096c28b1028dd609fa9fb76bac6ba5 100644 (file)
@@ -4,7 +4,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.64.4.2 2005/02/07 03:52:22 neilc Exp $
+ *   $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.64.4.3 2005/02/08 18:21:59 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -1766,8 +1766,19 @@ read_sql_construct(int until,
                         errmsg("missing \"%s\" at end of SQL statement",
                                expected)));
        }
+
        if (plpgsql_SpaceScanned)
            plpgsql_dstring_append(&ds, " ");
+
+       /* Check for array overflow */
+       if (nparams >= 1024)
+       {
+           plpgsql_error_lineno = lno;
+           ereport(ERROR,
+                   (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                    errmsg("too many variables specified in SQL statement")));
+       }
+
        switch (tok)
        {
            case T_SCALAR:
@@ -1792,15 +1803,6 @@ read_sql_construct(int until,
                plpgsql_dstring_append(&ds, yytext);
                break;
        }
-
-       /* Check for array overflow */
-       if (nparams >= 1024)
-       {
-           plpgsql_error_lineno = lno;
-           ereport(ERROR,
-                   (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
-                    errmsg("too many variables specified in SQL statement")));
-       }
    }
 
    if (endtoken)
@@ -2008,6 +2010,16 @@ make_select_stmt(void)
 
        if (plpgsql_SpaceScanned)
            plpgsql_dstring_append(&ds, " ");
+
+       /* Check for array overflow */
+       if (nparams >= 1024)
+       {
+           plpgsql_error_lineno = plpgsql_scanner_lineno();
+           ereport(ERROR,
+                   (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                    errmsg("too many variables specified in SQL statement")));
+       }
+
        switch (tok)
        {
            case T_SCALAR:
@@ -2032,15 +2044,6 @@ make_select_stmt(void)
                plpgsql_dstring_append(&ds, yytext);
                break;
        }
-
-       /* Check for array overflow */
-       if (nparams >= 1024)
-       {
-           plpgsql_error_lineno = plpgsql_scanner_lineno();
-           ereport(ERROR,
-                   (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
-                    errmsg("too many variables specified in SQL statement")));
-       }
    }
 
    expr = malloc(sizeof(PLpgSQL_expr) + sizeof(int) * nparams - sizeof(int));