Department of second thoughts: even if we can't run the full parser on
authorTom Lane
Tue, 1 Jul 2003 01:28:32 +0000 (01:28 +0000)
committerTom Lane
Tue, 1 Jul 2003 01:28:32 +0000 (01:28 +0000)
a SQL function with polymorphic inputs, we can at least run the raw
parser to catch silly syntactic errors.

src/backend/catalog/pg_proc.c

index 4ec4c44bd402f0a30e6c73c3e1e58fdc46667d07..897ae682a3482c6c73d4a24f382f64cac2e1935a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.98 2003/07/01 00:04:37 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.99 2003/07/01 01:28:32 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -639,24 +639,32 @@ fmgr_sql_validator(PG_FUNCTION_ARGS)
        }
    }
 
+   tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull);
+   if (isnull)
+       elog(ERROR, "null prosrc");
+
+   prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp));
+
    /*
-    * We can't precheck the function definition if there are any polymorphic
-    * input types, because actual datatypes of expression results will be
-    * unresolvable.  The check will be done at runtime instead.
+    * We can't do full prechecking of the function definition if there are
+    * any polymorphic input types, because actual datatypes of expression
+    * results will be unresolvable.  The check will be done at runtime
+    * instead.
+    *
+    * We can run the text through the raw parser though; this will at
+    * least catch silly syntactic errors.
     */
    if (!haspolyarg)
    {
-       tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull);
-       if (isnull)
-           elog(ERROR, "null prosrc");
-
-       prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp));
-
        querytree_list = pg_parse_and_rewrite(prosrc,
                                              proc->proargtypes,
                                              proc->pronargs);
        check_sql_fn_retval(proc->prorettype, functyptype, querytree_list);
    }
+   else
+   {
+       querytree_list = pg_parse_query(prosrc);
+   }
 
    ReleaseSysCache(tuple);