diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-07-03 20:58:47 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-07-03 20:58:47 +0000 |
commit | c63147d6f0e86d96ffb315147f36af613a35c2ce (patch) | |
tree | ab767c9fa14153d7fafd45d7fa1350d50265ab89 /src/backend | |
parent | e3d9dceef62e072cf9a433ae6c74a1c5a10d94d3 (diff) | |
download | postgresql-c63147d6f0e86d96ffb315147f36af613a35c2ce.tar.gz postgresql-c63147d6f0e86d96ffb315147f36af613a35c2ce.zip |
Add a function pg_get_keywords() to let clients find out the set of keywords
known to the SQL parser. Dave Page
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/parser/keywords.c | 7 | ||||
-rw-r--r-- | src/backend/utils/adt/misc.c | 73 |
2 files changed, 77 insertions, 3 deletions
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index edb76596623..43013e1e772 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.197 2008/05/21 19:51:01 meskes Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.198 2008/07/03 20:58:46 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -41,7 +41,7 @@ * !!WARNING!!: This list must be sorted by ASCII name, because binary * search is used to locate entries. */ -static const ScanKeyword ScanKeywords[] = { +const ScanKeyword ScanKeywords[] = { /* name, value, category */ {"abort", ABORT_P, UNRESERVED_KEYWORD}, {"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD}, @@ -428,6 +428,9 @@ static const ScanKeyword ScanKeywords[] = { {"zone", ZONE, UNRESERVED_KEYWORD}, }; +/* End of ScanKeywords, for use elsewhere */ +const ScanKeyword *LastScanKeyword = endof(ScanKeywords); + /* * ScanKeywordLookup - see if a given word is a keyword * diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index f99a07a9998..b48c004527c 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.62 2008/04/17 20:56:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.63 2008/07/03 20:58:46 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,10 +20,12 @@ #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,3 +324,72 @@ pg_sleep(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } + +/* Function to return the list of grammar keywords */ +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; + + /* cast-away-const is ugly but alternatives aren't much better */ + values[0] = (char *) 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: /* shouldn't be possible */ + values[1] = NULL; + values[2] = NULL; + break; + } + + tuple = BuildTupleFromCStrings(funcctx->attinmeta, values); + + SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple)); + } + + SRF_RETURN_DONE(funcctx); +} |