mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Add a function pg_get_keywords() to let clients find out the set of keywords
known to the SQL parser. Dave Page
This commit is contained in:
parent
e3d9dceef6
commit
c63147d6f0
@ -1,4 +1,4 @@
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.437 2008/05/19 18:08:15 tgl Exp $ -->
|
||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.438 2008/07/03 20:58:46 tgl Exp $ -->
|
||||
|
||||
<chapter id="functions">
|
||||
<title>Functions and Operators</title>
|
||||
@ -11484,6 +11484,10 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
|
||||
<primary>format_type</primary>
|
||||
</indexterm>
|
||||
|
||||
<indexterm>
|
||||
<primary>pg_get_keywords</primary>
|
||||
</indexterm>
|
||||
|
||||
<indexterm>
|
||||
<primary>pg_get_viewdef</primary>
|
||||
</indexterm>
|
||||
@ -11538,6 +11542,11 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
|
||||
<entry><type>text</type></entry>
|
||||
<entry>get SQL name of a data type</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><literal><function>pg_get_keywords</function>()</literal></entry>
|
||||
<entry><type>setof record</type></entry>
|
||||
<entry>get list of SQL keywords and their categories</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><literal><function>pg_get_constraintdef</function>(<parameter>constraint_oid</parameter>)</literal></entry>
|
||||
<entry><type>text</type></entry>
|
||||
@ -11633,6 +11642,16 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
|
||||
for the type modifier if no specific modifier is known.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<function>pg_get_keywords</function> returns a set of records describing
|
||||
the SQL keywords recognized by the server. The <structfield>word</> column
|
||||
contains the keyword. The <structfield>catcode</> column contains a
|
||||
category code: <literal>U</> for unreserved, <literal>C</> for column name,
|
||||
<literal>T</> for type or function name, or <literal>R</> for reserved.
|
||||
The <structfield>catdesc</> column contains a possibly-localized string
|
||||
describing the category.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<function>pg_get_constraintdef</function>,
|
||||
<function>pg_get_indexdef</function>, <function>pg_get_ruledef</function>,
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.464 2008/06/24 17:58:27 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.465 2008/07/03 20:58:46 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 200806241
|
||||
#define CATALOG_VERSION_NO 200807031
|
||||
|
||||
#endif
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.503 2008/06/17 19:10:56 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.504 2008/07/03 20:58:46 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* The script catalog/genbki.sh reads this file and generates .bki
|
||||
@ -2288,6 +2288,9 @@ DESCR("deparse an encoded expression");
|
||||
DATA(insert OID = 1665 ( pg_get_serial_sequence PGNSP PGUID 12 1 0 f f t f s 2 25 "25 25" _null_ _null_ _null_ pg_get_serial_sequence - _null_ _null_ ));
|
||||
DESCR("name of sequence for a serial column");
|
||||
|
||||
DATA(insert OID = 1686 ( 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("list of SQL keywords");
|
||||
|
||||
|
||||
/* Generic referential integrity constraint triggers */
|
||||
DATA(insert OID = 1644 ( RI_FKey_check_ins PGNSP PGUID 12 1 0 f f t f v 0 2279 "" _null_ _null_ _null_ RI_FKey_check_ins - _null_ _null_ ));
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/parser/keywords.h,v 1.24 2008/01/01 19:45:58 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/parser/keywords.h,v 1.25 2008/07/03 20:58:46 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -28,6 +28,9 @@ typedef struct ScanKeyword
|
||||
int16 category; /* see codes above */
|
||||
} ScanKeyword;
|
||||
|
||||
extern const ScanKeyword ScanKeywords[];
|
||||
extern const ScanKeyword *LastScanKeyword;
|
||||
|
||||
extern const ScanKeyword *ScanKeywordLookup(const char *text);
|
||||
|
||||
#endif /* KEYWORDS_H */
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.317 2008/06/17 19:10:56 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.318 2008/07/03 20:58:47 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -411,6 +411,7 @@ extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user