Re: psql tab completion enhancements - Mailing list pgsql-patches

From Joachim Wieland
Subject Re: psql tab completion enhancements
Date
Msg-id 20060108122742.GA6938@mcknight.de
Whole thread Raw
In response to Re: psql tab completion enhancements  (Neil Conway <neilc@samurai.com>)
List pgsql-patches
Neil,

thanks for your review. I accepted what you wrote for all items I don't
mention in this reply.

On Sat, Jan 07, 2006 at 10:59:27PM -0500, Neil Conway wrote:
> > + #define COMPLETE_WITH_MALLOCED_LIST(list) \
> > +       do { COMPLETE_WITH_LIST((const char**) list); free(list); list
> > = (char**) 0; } while(0)

> NULL is better style than 0 in a pointer context. Also, why are the
> casts necessary?

The cast "(const char**) list" is necessary because completion_charpp is
declared to be const. Removing the const means that you have to remove it
in a lot of other places as well, do you think this would be cleaner?


> > !               /* if we have only seen LOCK but not LOCK TABLE so
> > far, offer
> > !                * the TABLE keyword as well */

> Is this actually useful? The "TABLE" keyword is just noise.

Yeah, but it is valid SQL, so why not support it? I got used to use long
forms sometimes and get confused with psqls completion not supporting this
sometimes, for example in:

template1=# alter TABLE test ALTER column <TAB>
DROP DEFAULT    SET DEFAULT     SET STATISTICS  TYPE
DROP NOT NULL   SET NOT NULL    SET STORAGE



> > + static char**
> > + get_query_list(const char *text,
> > +                          const char *query,
> > +                          const char* completion_info)
> > + {
> > +       return _get_query_list(0, text, query, completion_info);
> > + }

> The difference between get_query_list() and _get_query_list() is not
> reflected in the names of the methods. An "_internal" suffix would be
> better, for example.

There are

static char *complete_from_query(const char *text, int state);
static char *complete_from_schema_query(const char *text, int state);
static char *_complete_from_query(int is_schema_query,
                     const char *text, int state);

already, so I made analogous versions for

static char **get_query_list(const char *text, const char *query,
                             const char *completion_info);
static char **get_schema_query_list(const char *text, const SchemaQuery* squery,
                                    const char *completion_info);
static char **_get_query_list(int is_schema_query,
                              const char *text, const char *query,
                              const char *completion_info);


> "bool" for boolean variables rather than "int", and consistent parameter
> declarations ("char *" not "char*").

See above, I used the "int is_schema_query" because of
_complete_from_query().

I could change both to bool in a new patch if you want to?


> > + static char**
> > + list_add_item(char **list, char *item)
> > + {
> > +       int size = 0;
> > +       while (list[size])
> > +               size++;
> > +       list = realloc(list, sizeof(char*) * (size + 1 + 1));
> > +       list[size] = item;
> > +       list[size+1] = NULL;
> > +       return list;
> > + }

> That's a terribly inefficient implementation.

It's not terribly inefficient, it just scales terribly. However psql limits
its queries to return 1000 items at most. At this size even a PII 300 adds
1000 items in

:/tmp$ time ./test
real    0m0.007s
user    0m0.000s
sys     0m0.000s

Program startup overhead for this example and doing the loop without any
work takes 0m0.004s already.

If the consensus is that it has to be better, I'll supply another version,
but I thought that it's not necessary.


Joachim


pgsql-patches by date:

Previous
From: Neil Conway
Date:
Subject: Re: TODO item: list prepared queries
Next
From: Qingqing Zhou
Date:
Subject: Change BgWriterCommLock to spinlock