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">
|
<chapter id="functions">
|
||||||
<title>Functions and Operators</title>
|
<title>Functions and Operators</title>
|
||||||
@ -11484,6 +11484,10 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
|
|||||||
<primary>format_type</primary>
|
<primary>format_type</primary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
|
|
||||||
|
<indexterm>
|
||||||
|
<primary>pg_get_keywords</primary>
|
||||||
|
</indexterm>
|
||||||
|
|
||||||
<indexterm>
|
<indexterm>
|
||||||
<primary>pg_get_viewdef</primary>
|
<primary>pg_get_viewdef</primary>
|
||||||
</indexterm>
|
</indexterm>
|
||||||
@ -11538,6 +11542,11 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
|
|||||||
<entry><type>text</type></entry>
|
<entry><type>text</type></entry>
|
||||||
<entry>get SQL name of a data type</entry>
|
<entry>get SQL name of a data type</entry>
|
||||||
</row>
|
</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>
|
<row>
|
||||||
<entry><literal><function>pg_get_constraintdef</function>(<parameter>constraint_oid</parameter>)</literal></entry>
|
<entry><literal><function>pg_get_constraintdef</function>(<parameter>constraint_oid</parameter>)</literal></entry>
|
||||||
<entry><type>text</type></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.
|
for the type modifier if no specific modifier is known.
|
||||||
</para>
|
</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>
|
<para>
|
||||||
<function>pg_get_constraintdef</function>,
|
<function>pg_get_constraintdef</function>,
|
||||||
<function>pg_get_indexdef</function>, <function>pg_get_ruledef</function>,
|
<function>pg_get_indexdef</function>, <function>pg_get_ruledef</function>,
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* !!WARNING!!: This list must be sorted by ASCII name, because binary
|
||||||
* search is used to locate entries.
|
* search is used to locate entries.
|
||||||
*/
|
*/
|
||||||
static const ScanKeyword ScanKeywords[] = {
|
const ScanKeyword ScanKeywords[] = {
|
||||||
/* name, value, category */
|
/* name, value, category */
|
||||||
{"abort", ABORT_P, UNRESERVED_KEYWORD},
|
{"abort", ABORT_P, UNRESERVED_KEYWORD},
|
||||||
{"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD},
|
{"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD},
|
||||||
@ -428,6 +428,9 @@ static const ScanKeyword ScanKeywords[] = {
|
|||||||
{"zone", ZONE, UNRESERVED_KEYWORD},
|
{"zone", ZONE, UNRESERVED_KEYWORD},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* End of ScanKeywords, for use elsewhere */
|
||||||
|
const ScanKeyword *LastScanKeyword = endof(ScanKeywords);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ScanKeywordLookup - see if a given word is a keyword
|
* ScanKeywordLookup - see if a given word is a keyword
|
||||||
*
|
*
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 <math.h>
|
||||||
|
|
||||||
#include "access/xact.h"
|
#include "access/xact.h"
|
||||||
|
#include "catalog/pg_type.h"
|
||||||
#include "catalog/pg_tablespace.h"
|
#include "catalog/pg_tablespace.h"
|
||||||
#include "commands/dbcommands.h"
|
#include "commands/dbcommands.h"
|
||||||
#include "funcapi.h"
|
#include "funcapi.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
|
#include "parser/keywords.h"
|
||||||
#include "postmaster/syslogger.h"
|
#include "postmaster/syslogger.h"
|
||||||
#include "storage/fd.h"
|
#include "storage/fd.h"
|
||||||
#include "storage/pmsignal.h"
|
#include "storage/pmsignal.h"
|
||||||
@ -322,3 +324,72 @@ pg_sleep(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
PG_RETURN_VOID();
|
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) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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 */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 200806241
|
#define CATALOG_VERSION_NO 200807031
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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
|
* NOTES
|
||||||
* The script catalog/genbki.sh reads this file and generates .bki
|
* 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_ ));
|
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");
|
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 */
|
/* 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_ ));
|
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) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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 */
|
int16 category; /* see codes above */
|
||||||
} ScanKeyword;
|
} ScanKeyword;
|
||||||
|
|
||||||
|
extern const ScanKeyword ScanKeywords[];
|
||||||
|
extern const ScanKeyword *LastScanKeyword;
|
||||||
|
|
||||||
extern const ScanKeyword *ScanKeywordLookup(const char *text);
|
extern const ScanKeyword *ScanKeywordLookup(const char *text);
|
||||||
|
|
||||||
#endif /* KEYWORDS_H */
|
#endif /* KEYWORDS_H */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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_tablespace_databases(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);
|
extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_sleep(PG_FUNCTION_ARGS);
|
extern Datum pg_sleep(PG_FUNCTION_ARGS);
|
||||||
|
extern Datum pg_get_keywords(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
/* oid.c */
|
/* oid.c */
|
||||||
extern Datum oidin(PG_FUNCTION_ARGS);
|
extern Datum oidin(PG_FUNCTION_ARGS);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user