Alvaro,

* Alvaro Herrera (alvhe...@2ndquadrant.com) wrote:
> +     /*
> +      * Make sure that both objname and objargs were passed, or none was.
> +      * Initialize objargs to empty list, which is the most common case.
> +      */
> +     Assert(PointerIsValid(objname) == PointerIsValid(objargs));
> +     if (objargs)
> +             *objargs = NIL;
> + 

I feel like I must be missing something, but you only explicitly reset
objargs, not objnames, and then below you sometimes add to objname and
other times throw away anything which might be there:

> --- 2948,2974 ----
>                               attr = 
> get_relid_attribute_name(object->objectId,
>                                                                               
>                 object->objectSubId);
>                               appendStringInfo(&buffer, ".%s", 
> quote_identifier(attr));
> +                             if (objname)
> +                                     *objname = lappend(*objname, attr);
>                       }
>                       break;

Here's an "add to objname" case, and then:

>               case OCLASS_PROC:
>                       appendStringInfoString(&buffer,
>                                                          
> format_procedure_qualified(object->objectId));
> +                     if (objname)
> +                             format_procedure_parts(object->objectId, 
> objname, objargs);
>                       break;
>   
>               case OCLASS_TYPE:
> !                     {
> !                             char *typeout;
> ! 
> !                             typeout = 
> format_type_be_qualified(object->objectId);
> !                             appendStringInfoString(&buffer, typeout);
> !                             if (objname)
> !                                     *objname = list_make1(typeout);
> !                     }
>                       break;

here's a "throw away whatever was in objname" case.

> ***************
> *** 2745,2750 **** getObjectIdentity(const ObjectAddress *object)
> --- 2991,3000 ----
>                                                         
> format_type_be_qualified(castForm->castsource),
>                                                        
> format_type_be_qualified(castForm->casttarget));
>   
> +                             if (objname)
> +                                     *objname = 
> list_make2(format_type_be_qualified(castForm->castsource),
> +                                                                             
>   format_type_be_qualified(castForm->casttarget));
> + 
>                               heap_close(castRel, AccessShareLock);
>                               break;
>                       }

And another "throw away" case.

> --- 3037,3045 ----
>                               {
>                                       appendStringInfo(&buffer, "%s on ",
>                                                                        
> quote_identifier(NameStr(con->conname)));
> !                                     getRelationIdentity(&buffer, 
> con->conrelid, objname);
> !                                     if (objname)
> !                                             *objname = lappend(*objname, 
> pstrdup(NameStr(con->conname)));
>                               }
>                               else
>                               {

And another "add to existing" case.

Guess I have a bit of a hard time with an API that's "we might add to
this list, or we might replace whatever is there".  I think it would be
best to just initialize both (or assert that they are) and have any
callers who need to merge the list(s) coming back into an existing list
handle that themselves.

I'm also not a huge fan of the big object_type_map, but I also don't
have a better solution.

        Thanks,

                Stephen

Attachment: signature.asc
Description: Digital signature

Reply via email to