On 2026-Jan-06, VASUKI M wrote:

> Sorry,it was an incremental patch.
> The attached v5 is the fresh patch against Master.

I have pushed this, but I felt the completion for RESET was not ready
yet, so I left it out.  I also removed a bunch of useless comments and
braces and stuff that I felt added no value.  (LLM-generated code should
not be treated as being in final submittable state -- you need to
examine it critically and remove the crap.)

On this part:

> +     /* ALTER USER/ROLE <name> IN DATABASE <dbname> RESET */
> +     else if (Matches("ALTER", "USER|ROLE", MatchAny, "IN", "DATABASE", 
> MatchAny, "RESET"))
> +     {
> +             if (!pset.db || PQstatus(pset.db) != CONNECTION_OK)
> +             {
> +                     COMPLETE_WITH("ALL");
> +             }
> +             else
> +             {
> +                     /*
> +                      * Extract tokens: prev5 = role name prev2 = database 
> name
> +                      */
> +                     char       *role = prev5_wd;
> +                     char       *dbname = prev2_wd;
> +                     char       *q_role;
> +                     char       *q_dbname;
> +                     char       *query;
> +
> +                     /* Safe SQL literal quoting using libpq */
> +                     q_role = PQescapeLiteral(pset.db, role, strlen(role));
> +                     q_dbname = PQescapeLiteral(pset.db, dbname, 
> strlen(dbname));
> +                     if (!q_role || !q_dbname)
> +                     {
> +                             /* If quoting fails, just fall back to ALL */
> +                             if (q_role)
> +                                     PQfreemem(q_role);
> +                             if (q_dbname)
> +                                     PQfreemem(q_dbname);
> +                             COMPLETE_WITH("ALL");
> +                     }
> +                     else
> +                     {
> +                             query = psprintf(
> +                                                              " SELECT 
> split_part(unnest(setconfig), \'=\', 1) "
> +                                                              "  FROM 
> pg_db_role_setting "
> +                                                              " WHERE 
> setdatabase = "
> +                                                              "       
> (SELECT oid FROM pg_database WHERE datname = %s) "
> +                                                              "   AND 
> setrole = %s::regrole",
> +                                                              q_dbname, 
> q_role);
> +                             COMPLETE_WITH_QUERY_PLUS(query, "ALL");
> +                             PQfreemem(q_role);
> +                             PQfreemem(q_dbname);
> +                             pfree(query);
> +                     }
> +             }
> +     }

Nice attempt, not yet ready.

There's nowhere else in match_previous_words() that does anything this
complicated, and I didn't want to add the first one, because this occurs
between the GEN_TABCOMPLETE markers, which means the code is going to be
rewritten by a Perl script -- here be dragons -- happy to leave it
undisturbed.  If we need this complexity, let's create a separate
function for it.

Speaking of functions -- there are some function calls in that query,
and they are not schema-qualified.  That's unacceptable in psql.  Add
pg_catalog. schema quals there, like all other queries in that file.

pfree() looks out of place in psql.  I would use stock free(), like we
do for the pg_strdup() calls.

I'm unsure about this novel use of COMPLETE_WITH_QUERY.  It seems if we
have
  ALTER ROLE foo IN DATABASE bar RESET enable<tab>
then we'll dismiss the "enable" part if we have multiple variables set
that start with "enable", which is not very nice.  (I checked -- yes, it's
broken).  Maybe we need a new generator for COMPLETE_WITH_GENERATOR, or
maybe we need more features in complete_from_query().


Anyway, this is pretty much what Ian submitted at the start of the
thread, so I've set it as committed in the CF app.

Thanks!

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/


Reply via email to