On Sat, May 3, 2008 at 9:06 PM, Tom Lane <[EMAIL PROTECTED]> wrote: > "Dave Page" <[EMAIL PROTECTED]> writes: > > Attached is an updated patch, giving the following output. > > Oh, one other thing: dropping externs into random modules unrelated to > their source module is completely awful programming style, because there > is nothing preventing incompatible declarations. Put those externs in > keywords.h instead.
OK. > I suspect you have ignored a compiler warning > about not declaring pg_get_keywords itself, too --- it should be > extern'd in builtins.h. No, no warning (I'm using VC++ today) - but fixed anyway. Update attached, including corrected docs. Note to self - proof read docs *after* putting the kids to bed in future. -- Dave Page EnterpriseDB UK: http://www.enterprisedb.com
Index: doc/src/sgml/func.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/func.sgml,v retrieving revision 1.434 diff -c -r1.434 func.sgml *** doc/src/sgml/func.sgml 28 Apr 2008 14:48:57 -0000 1.434 --- doc/src/sgml/func.sgml 3 May 2008 20:17:47 -0000 *************** *** 10874,10879 **** --- 10874,10885 ---- </row> <row> + <entry><literal><function>pg_get_keywords</function>()</literal></entry> + <entry><type>setof record</type></entry> + <entry>list of keywords and their categories</entry> + </row> + + <row> <entry><literal><function>pg_my_temp_schema</function>()</literal></entry> <entry><type>oid</type></entry> <entry>OID of session's temporary schema, or 0 if none</entry> *************** *** 11009,11014 **** --- 11015,11033 ---- </para> <indexterm> + <primary>pg_get_keywords</primary> + </indexterm> + + <para> + <function>pg_get_keywords</function> returns a set of records describing + the keywords recognized by the server. The <structfield>word</> column + contains the keyword and the <structfield>catcode</> column contains a + category code of 'U' for unreserved, 'C' for column name, 'T' for type + or function name or 'R' for reserved. The <structfield>catdesc</> + column contains a localised string describing the category. + </para> + + <indexterm> <primary>pg_my_temp_schema</primary> </indexterm> Index: src/backend/parser/keywords.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/parser/keywords.c,v retrieving revision 1.195 diff -c -r1.195 keywords.c *** src/backend/parser/keywords.c 27 Mar 2008 03:57:33 -0000 1.195 --- src/backend/parser/keywords.c 2 May 2008 19:32:40 -0000 *************** *** 38,44 **** * !!WARNING!!: This list must be sorted by ASCII name, because binary * search is used to locate entries. */ ! static const ScanKeyword ScanKeywords[] = { /* name, value, category */ {"abort", ABORT_P, UNRESERVED_KEYWORD}, {"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD}, --- 38,44 ---- * !!WARNING!!: This list must be sorted by ASCII name, because binary * search is used to locate entries. */ ! const ScanKeyword ScanKeywords[] = { /* name, value, category */ {"abort", ABORT_P, UNRESERVED_KEYWORD}, {"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD}, *************** *** 423,428 **** --- 423,431 ---- {"zone", ZONE, UNRESERVED_KEYWORD}, }; + /* End of ScanKeywords, for use elsewhere */ + const ScanKeyword *LastScanKeyword = endof(ScanKeywords); + /* * ScanKeywordLookup - see if a given word is a keyword * Index: src/backend/utils/adt/misc.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/misc.c,v retrieving revision 1.62 diff -c -r1.62 misc.c *** src/backend/utils/adt/misc.c 17 Apr 2008 20:56:41 -0000 1.62 --- src/backend/utils/adt/misc.c 3 May 2008 20:33:45 -0000 *************** *** 20,29 **** --- 20,31 ---- #include <math.h> #include "access/xact.h" + #include "catalog/pg_type.h" #include "catalog/pg_tablespace.h" #include "commands/dbcommands.h" #include "funcapi.h" #include "miscadmin.h" + #include "parser/keywords.h" #include "postmaster/syslogger.h" #include "storage/fd.h" #include "storage/pmsignal.h" *************** *** 322,324 **** --- 324,393 ---- PG_RETURN_VOID(); } + + /* Function to return the keywords list */ + Datum + pg_get_keywords(PG_FUNCTION_ARGS) + { + FuncCallContext *funcctx; + + if (SRF_IS_FIRSTCALL()) + { + MemoryContext oldcontext; + TupleDesc tupdesc; + + funcctx = SRF_FIRSTCALL_INIT(); + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + tupdesc = CreateTemplateTupleDesc(3, false); + TupleDescInitEntry(tupdesc, (AttrNumber) 1, "word", + TEXTOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 2, "catcode", + CHAROID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 3, "catdesc", + TEXTOID, -1, 0); + + funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); + + MemoryContextSwitchTo(oldcontext); + } + + funcctx = SRF_PERCALL_SETUP(); + + if (&ScanKeywords[funcctx->call_cntr] < LastScanKeyword) + { + char *values[3]; + HeapTuple tuple; + + values[0] = ScanKeywords[funcctx->call_cntr].name; + + switch (ScanKeywords[funcctx->call_cntr].category) + { + case UNRESERVED_KEYWORD: + values[1] = "U"; + values[2] = _("Unreserved"); + break; + case COL_NAME_KEYWORD: + values[1] = "C"; + values[2] = _("Column name"); + break; + case TYPE_FUNC_NAME_KEYWORD: + values[1] = "T"; + values[2] = _("Type or function name"); + break; + case RESERVED_KEYWORD: + values[1] = "R"; + values[2] = _("Reserved"); + break; + default: + values[1] = ""; + values[2] = _("Unknown"); + } + + tuple = BuildTupleFromCStrings(funcctx->attinmeta, values); + + SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple)); + } + + SRF_RETURN_DONE(funcctx); + } Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_proc.h,v retrieving revision 1.494 diff -c -r1.494 pg_proc.h *** src/include/catalog/pg_proc.h 29 Apr 2008 13:00:22 -0000 1.494 --- src/include/catalog/pg_proc.h 3 May 2008 19:07:32 -0000 *************** *** 3193,3198 **** --- 3193,3201 ---- DATA(insert OID = 2626 ( pg_sleep PGNSP PGUID 12 1 0 f f t f v 1 2278 "701" _null_ _null_ _null_ pg_sleep - _null_ _null_ )); DESCR("sleep for the specified time in seconds"); + DATA(insert OID = 2700 ( pg_get_keywords PGNSP PGUID 12 10 400 f f t t s 0 2249 "" "{25,18,25}" "{o,o,o}" "{word,catcode,catdesc}" pg_get_keywords - _null_ _null_ )); + DESCR("return keyword list"); + DATA(insert OID = 2971 ( text PGNSP PGUID 12 1 0 f f t f i 1 25 "16" _null_ _null_ _null_ booltext - _null_ _null_ )); DESCR("convert boolean to text"); Index: src/include/parser/keywords.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/parser/keywords.h,v retrieving revision 1.24 diff -c -r1.24 keywords.h *** src/include/parser/keywords.h 1 Jan 2008 19:45:58 -0000 1.24 --- src/include/parser/keywords.h 3 May 2008 20:16:24 -0000 *************** *** 29,33 **** --- 29,35 ---- } ScanKeyword; extern const ScanKeyword *ScanKeywordLookup(const char *text); + extern const ScanKeyword ScanKeywords[]; + extern const ScanKeyword *LastScanKeyword; #endif /* KEYWORDS_H */ Index: src/include/utils/builtins.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/utils/builtins.h,v retrieving revision 1.315 diff -c -r1.315 builtins.h *** src/include/utils/builtins.h 17 Apr 2008 20:56:41 -0000 1.315 --- src/include/utils/builtins.h 3 May 2008 20:26:57 -0000 *************** *** 421,426 **** --- 421,427 ---- extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS); extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS); extern Datum pg_sleep(PG_FUNCTION_ARGS); + extern Datum pg_get_keywords(PG_FUNCTION_ARGS); /* oid.c */ extern Datum oidin(PG_FUNCTION_ARGS);
-- Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-patches