aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/misc.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-07-03 20:58:47 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-07-03 20:58:47 +0000
commitc63147d6f0e86d96ffb315147f36af613a35c2ce (patch)
treeab767c9fa14153d7fafd45d7fa1350d50265ab89 /src/backend/utils/adt/misc.c
parente3d9dceef62e072cf9a433ae6c74a1c5a10d94d3 (diff)
downloadpostgresql-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/utils/adt/misc.c')
-rw-r--r--src/backend/utils/adt/misc.c73
1 files changed, 72 insertions, 1 deletions
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);
+}