Prevent coredump in current_schemas() if someone has just deleted a
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Apr 2003 23:22:13 +0000 (23:22 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Apr 2003 23:22:13 +0000 (23:22 +0000)
schema that was in our search path.

src/backend/utils/adt/name.c

index 746254add59048766d1c847be6813700fb61660e..607f7876a85f6241d59f8ac32056cb10c3f94d87 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.43 2003/03/10 22:28:18 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.44 2003/04/27 23:22:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -246,6 +246,8 @@ current_schema(PG_FUNCTION_ARGS)
    if (search_path == NIL)
        PG_RETURN_NULL();
    nspname = get_namespace_name(lfirsto(search_path));
+   if (!nspname)
+       PG_RETURN_NULL();       /* recently-deleted namespace? */
    PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname)));
 }
 
@@ -253,25 +255,27 @@ Datum
 current_schemas(PG_FUNCTION_ARGS)
 {
    List       *search_path = fetch_search_path(PG_GETARG_BOOL(0));
-   int         nnames = length(search_path);
    Datum      *names;
    int         i;
    ArrayType  *array;
 
    /* +1 here is just to avoid palloc(0) error */
-   names = (Datum *) palloc((nnames + 1) * sizeof(Datum));
+   names = (Datum *) palloc((length(search_path) + 1) * sizeof(Datum));
    i = 0;
    while (search_path)
    {
        char       *nspname;
 
        nspname = get_namespace_name(lfirsto(search_path));
-       names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));
-       i++;
+       if (nspname)            /* watch out for deleted namespace */
+       {
+           names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));
+           i++;
+       }
        search_path = lnext(search_path);
    }
 
-   array = construct_array(names, nnames,
+   array = construct_array(names, i,
                            NAMEOID,
                            NAMEDATALEN,        /* sizeof(Name) */
                            false,      /* Name is not by-val */