summaryrefslogtreecommitdiffstats
path: root/src/interfaces/ecpg/preproc/ecpg_keywords.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:46:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:46:48 +0000
commit311bcfc6b3acdd6fd152798c7f287ddf74fa2a98 (patch)
tree0ec307299b1dada3701e42f4ca6eda57d708261e /src/interfaces/ecpg/preproc/ecpg_keywords.c
parentInitial commit. (diff)
downloadpostgresql-15-upstream.tar.xz
postgresql-15-upstream.zip
Adding upstream version 15.4.upstream/15.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/interfaces/ecpg/preproc/ecpg_keywords.c')
-rw-r--r--src/interfaces/ecpg/preproc/ecpg_keywords.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.c b/src/interfaces/ecpg/preproc/ecpg_keywords.c
new file mode 100644
index 0000000..a2db06f
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/ecpg_keywords.c
@@ -0,0 +1,54 @@
+/*-------------------------------------------------------------------------
+ *
+ * ecpg_keywords.c
+ * lexical token lookup for reserved words in postgres embedded SQL
+ *
+ * IDENTIFICATION
+ * src/interfaces/ecpg/preproc/ecpg_keywords.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+/* ScanKeywordList lookup data for ECPG keywords */
+#include "ecpg_kwlist_d.h"
+#include "preproc_extern.h"
+#include "preproc.h"
+
+/* Token codes for ECPG keywords */
+#define PG_KEYWORD(kwname, value) value,
+
+static const uint16 ECPGScanKeywordTokens[] = {
+#include "ecpg_kwlist.h"
+};
+
+#undef PG_KEYWORD
+
+
+/*
+ * ScanECPGKeywordLookup - see if a given word is a keyword
+ *
+ * Returns the token value of the keyword, or -1 if no match.
+ *
+ * Keywords are matched using the same case-folding rules as in the backend.
+ */
+int
+ScanECPGKeywordLookup(const char *text)
+{
+ int kwnum;
+
+ /* First check SQL symbols defined by the backend. */
+ kwnum = ScanKeywordLookup(text, &ScanKeywords);
+ if (kwnum >= 0)
+ return SQLScanKeywordTokens[kwnum];
+
+ /* Try ECPG-specific keywords. */
+ kwnum = ScanKeywordLookup(text, &ScanECPGKeywords);
+ if (kwnum >= 0)
+ return ECPGScanKeywordTokens[kwnum];
+
+ return -1;
+}