building pg_dump doesn't work

Started by Alvaro Herreraalmost 17 years ago17 messages
#1Alvaro Herrera
alvherre@commandprompt.com

Hi,

I noticed that if you start from a clean tree, it doesn't work to build
pg_dump because gram.h has not been generated yet:

make -C ../../../src/backend/parser keywords.o
make[1]: Entering directory `/home/alvherre/Code/CVS/pgsql/build/00head/src/backend/parser'
gcc -O0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -g -I/pgsql/source/00head/src/backend/parser -I../../../src/include -I/pgsql/source/00head/src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o keywords.o /pgsql/source/00head/src/backend/parser/keywords.c -MMD -MP -MF .deps/keywords.Po
/pgsql/source/00head/src/backend/parser/keywords.c:33:25: error: parser/gram.h: No such file or directory
/pgsql/source/00head/src/backend/parser/keywords.c:46: error: 'ABORT_P' undeclared here (not in a function)

I notice that there's a line in backend/parser that makes keywords.o
depend on gram.h, but apparently it doesn't work:

# Force these dependencies to be known even without dependency info built:
gram.o keywords.o parser.o: $(srcdir)/gram.h

The pg_dump Makefile appears to be expecting the file to be in
src/include/parser. This works for src/backend/parser because it adds
the current srcdir as -I to CPPFLAGS.

(Actually I see, and vaguely remember, that this has been broken for a
long time.)

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#2Alvaro Herrera
alvherre@commandprompt.com
In reply to: Alvaro Herrera (#1)
1 attachment(s)
Re: building pg_dump doesn't work

Alvaro Herrera wrote:

Hi,

I noticed that if you start from a clean tree, it doesn't work to build
pg_dump because gram.h has not been generated yet:

make -C ../../../src/backend/parser keywords.o
make[1]: Entering directory `/home/alvherre/Code/CVS/pgsql/build/00head/src/backend/parser'
gcc -O0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -g -I/pgsql/source/00head/src/backend/parser -I../../../src/include -I/pgsql/source/00head/src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o keywords.o /pgsql/source/00head/src/backend/parser/keywords.c -MMD -MP -MF .deps/keywords.Po
/pgsql/source/00head/src/backend/parser/keywords.c:33:25: error: parser/gram.h: No such file or directory
/pgsql/source/00head/src/backend/parser/keywords.c:46: error: 'ABORT_P' undeclared here (not in a function)

This patch fixes it.

The fmgroids.h bits are not needed for pg_dump, but they are if you
start building on the parser directory. I don't care strongly for that
one, so if people don't like it I'll just go ahead with the gram.h bit,
unless anyone has a better idea.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Attachments:

pgdump-parser-dep.patchtext/x-diff; charset=us-asciiDownload
Index: src/backend/parser/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/Makefile,v
retrieving revision 1.48
diff -c -p -r1.48 Makefile
*** src/backend/parser/Makefile	4 Oct 2008 21:56:54 -0000	1.48
--- src/backend/parser/Makefile	3 Mar 2009 21:18:17 -0000
*************** subdir = src/backend/parser
*** 10,17 ****
  top_builddir = ../../..
  include $(top_builddir)/src/Makefile.global
  
- override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
- 
  OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_cte.o parse_clause.o \
        parse_expr.o parse_func.o parse_node.o parse_oper.o parse_relation.o \
        parse_type.o parse_coerce.o parse_target.o parse_utilcmd.o scansup.o
--- 10,15 ----
*************** endif
*** 52,57 ****
--- 50,63 ----
  
  # Force these dependencies to be known even without dependency info built:
  gram.o keywords.o parser.o: $(srcdir)/gram.h
+ keywords.o: $(top_builddir)/src/include/parser/gram.h
+ parse_func.o: $(top_builddir)/src/include/utils/fmgroids.h
+ parse_coerce.o: $(top_builddir)/src/include/utils/fmgroids.h
+ 
+ $(top_builddir)/src/include/parser/gram.h:
+ 	$(MAKE) -C $(top_builddir)/src/backend ../../src/include/parser/gram.h
+ $(top_builddir)/src/include/utils/fmgroids.h:
+ 	$(MAKE) -C $(top_builddir)/src/backend ../../src/include/utils/fmgroids.h
  
  
  # gram.c, gram.h, and scan.c are in the distribution tarball, so they
#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#2)
Re: building pg_dump doesn't work

Alvaro Herrera <alvherre@commandprompt.com> writes:

Alvaro Herrera wrote:

I noticed that if you start from a clean tree, it doesn't work to build
pg_dump because gram.h has not been generated yet:

This patch fixes it.

I think this is probably going in the wrong direction. The reason
gram.h isn't already in the main include tree is that we don't *want*
all and sundry depending on it --- we have very carefully minimized
the number of files that depend on the grammar's symbol codes.

ISTM that pg_dump doesn't actually care about the symbol codes, it
just needs a list of known keywords. Can we refactor things so that
the frontend-side version of the keyword list doesn't include the
grammar symbols at all?

One idea that comes to mind is to replace the entries like

{"abort", ABORT_P, UNRESERVED_KEYWORD},

with macro calls

PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),

and then the frontend build of the file could define the macro
to ignore its second argument.

The way we do it now seems to have other disadvantages too: we are
incorporating a backend .o file into pg_dump as-is, which would lead
to large problems if there were differences in say the compiler flags
needed. In fact, I thought Zdenek had been working on decoupling
that sort of thing, so I'm a bit surprised it's still like this at all.

regards, tom lane

#4Alvaro Herrera
alvherre@commandprompt.com
In reply to: Tom Lane (#3)
Re: building pg_dump doesn't work

Tom Lane wrote:

I think this is probably going in the wrong direction. The reason
gram.h isn't already in the main include tree is that we don't *want*
all and sundry depending on it --- we have very carefully minimized
the number of files that depend on the grammar's symbol codes.

ISTM that pg_dump doesn't actually care about the symbol codes, it
just needs a list of known keywords.

Hmm, I had thought that pg_dump only wanted the header file, not the
keywords.o object file. I now see that I was wrong. I agree that your
proposed solution is a lot better. I'll see about it.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#5Alvaro Herrera
alvherre@commandprompt.com
In reply to: Alvaro Herrera (#4)
1 attachment(s)
Re: building pg_dump doesn't work

Alvaro Herrera wrote:

Hmm, I had thought that pg_dump only wanted the header file, not the
keywords.o object file. I now see that I was wrong. I agree that your
proposed solution is a lot better. I'll see about it.

Here it is. The #ifdef parts seem a bit ugly, but I'm not sure how can
this be improved, given that ECPG is already using this file.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Attachments:

pgdump-parser-dep-2.patchtext/x-diff; charset=us-asciiDownload
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.210
diff -c -p -r1.210 keywords.c
*** src/backend/parser/keywords.c	24 Feb 2009 10:06:33 -0000	1.210
--- src/backend/parser/keywords.c	4 Mar 2009 14:34:53 -0000
***************
*** 29,41 ****
  #define YYSTYPE int
  
  #include "parser/keywords.h"
  #ifndef ECPG_COMPILE
  #include "parser/gram.h"
! #else
  #include "preproc.h"
  #endif
  
  /*
   * List of keyword (name, token-value, category) entries.
   *
   * !!WARNING!!: This list must be sorted by ASCII name, because binary
--- 29,54 ----
  #define YYSTYPE int
  
  #include "parser/keywords.h"
+ 
  #ifndef ECPG_COMPILE
+ #ifndef FRONTEND
  #include "parser/gram.h"
! #endif
! #else /* ECPG_COMPILE */
  #include "preproc.h"
  #endif
  
  /*
+  * We don't want to include the gram.h file on frontend builds, except ECPG, so
+  * leave out the second struct member in that case.
+  */
+ #if !defined FRONTEND || defined ECPG_COMPILE
+ #define PG_KEYWORD(a,b,c) {a,b,c}
+ #else
+ #define PG_KEYWORD(a,b,c) {a,c}
+ #endif
+ 
+ /*
   * List of keyword (name, token-value, category) entries.
   *
   * !!WARNING!!: This list must be sorted by ASCII name, because binary
***************
*** 43,439 ****
   */
  const ScanKeyword ScanKeywords[] = {
  	/* name, value, category */
! 	{"abort", ABORT_P, UNRESERVED_KEYWORD},
! 	{"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD},
! 	{"access", ACCESS, UNRESERVED_KEYWORD},
! 	{"action", ACTION, UNRESERVED_KEYWORD},
! 	{"add", ADD_P, UNRESERVED_KEYWORD},
! 	{"admin", ADMIN, UNRESERVED_KEYWORD},
! 	{"after", AFTER, UNRESERVED_KEYWORD},
! 	{"aggregate", AGGREGATE, UNRESERVED_KEYWORD},
! 	{"all", ALL, RESERVED_KEYWORD},
! 	{"also", ALSO, UNRESERVED_KEYWORD},
! 	{"alter", ALTER, UNRESERVED_KEYWORD},
! 	{"always", ALWAYS, UNRESERVED_KEYWORD},
! 	{"analyse", ANALYSE, RESERVED_KEYWORD},		/* British spelling */
! 	{"analyze", ANALYZE, RESERVED_KEYWORD},
! 	{"and", AND, RESERVED_KEYWORD},
! 	{"any", ANY, RESERVED_KEYWORD},
! 	{"array", ARRAY, RESERVED_KEYWORD},
! 	{"as", AS, RESERVED_KEYWORD},
! 	{"asc", ASC, RESERVED_KEYWORD},
! 	{"assertion", ASSERTION, UNRESERVED_KEYWORD},
! 	{"assignment", ASSIGNMENT, UNRESERVED_KEYWORD},
! 	{"asymmetric", ASYMMETRIC, RESERVED_KEYWORD},
! 	{"at", AT, UNRESERVED_KEYWORD},
! 	{"authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD},
! 	{"backward", BACKWARD, UNRESERVED_KEYWORD},
! 	{"before", BEFORE, UNRESERVED_KEYWORD},
! 	{"begin", BEGIN_P, UNRESERVED_KEYWORD},
! 	{"between", BETWEEN, TYPE_FUNC_NAME_KEYWORD},
! 	{"bigint", BIGINT, COL_NAME_KEYWORD},
! 	{"binary", BINARY, TYPE_FUNC_NAME_KEYWORD},
! 	{"bit", BIT, COL_NAME_KEYWORD},
! 	{"boolean", BOOLEAN_P, COL_NAME_KEYWORD},
! 	{"both", BOTH, RESERVED_KEYWORD},
! 	{"by", BY, UNRESERVED_KEYWORD},
! 	{"cache", CACHE, UNRESERVED_KEYWORD},
! 	{"called", CALLED, UNRESERVED_KEYWORD},
! 	{"cascade", CASCADE, UNRESERVED_KEYWORD},
! 	{"cascaded", CASCADED, UNRESERVED_KEYWORD},
! 	{"case", CASE, RESERVED_KEYWORD},
! 	{"cast", CAST, RESERVED_KEYWORD},
! 	{"catalog", CATALOG_P, UNRESERVED_KEYWORD},
! 	{"chain", CHAIN, UNRESERVED_KEYWORD},
! 	{"char", CHAR_P, COL_NAME_KEYWORD},
! 	{"character", CHARACTER, COL_NAME_KEYWORD},
! 	{"characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD},
! 	{"check", CHECK, RESERVED_KEYWORD},
! 	{"checkpoint", CHECKPOINT, UNRESERVED_KEYWORD},
! 	{"class", CLASS, UNRESERVED_KEYWORD},
! 	{"close", CLOSE, UNRESERVED_KEYWORD},
! 	{"cluster", CLUSTER, UNRESERVED_KEYWORD},
! 	{"coalesce", COALESCE, COL_NAME_KEYWORD},
! 	{"collate", COLLATE, RESERVED_KEYWORD},
! 	{"column", COLUMN, RESERVED_KEYWORD},
! 	{"comment", COMMENT, UNRESERVED_KEYWORD},
! 	{"commit", COMMIT, UNRESERVED_KEYWORD},
! 	{"committed", COMMITTED, UNRESERVED_KEYWORD},
! 	{"concurrently", CONCURRENTLY, UNRESERVED_KEYWORD},
! 	{"configuration", CONFIGURATION, UNRESERVED_KEYWORD},
! 	{"connection", CONNECTION, UNRESERVED_KEYWORD},
! 	{"constraint", CONSTRAINT, RESERVED_KEYWORD},
! 	{"constraints", CONSTRAINTS, UNRESERVED_KEYWORD},
! 	{"content", CONTENT_P, UNRESERVED_KEYWORD},
! 	{"continue", CONTINUE_P, UNRESERVED_KEYWORD},
! 	{"conversion", CONVERSION_P, UNRESERVED_KEYWORD},
! 	{"copy", COPY, UNRESERVED_KEYWORD},
! 	{"cost", COST, UNRESERVED_KEYWORD},
! 	{"create", CREATE, RESERVED_KEYWORD},
! 	{"createdb", CREATEDB, UNRESERVED_KEYWORD},
! 	{"createrole", CREATEROLE, UNRESERVED_KEYWORD},
! 	{"createuser", CREATEUSER, UNRESERVED_KEYWORD},
! 	{"cross", CROSS, TYPE_FUNC_NAME_KEYWORD},
! 	{"csv", CSV, UNRESERVED_KEYWORD},
! 	{"ctype", CTYPE, UNRESERVED_KEYWORD},
! 	{"current", CURRENT_P, UNRESERVED_KEYWORD},
! 	{"current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD},
! 	{"current_date", CURRENT_DATE, RESERVED_KEYWORD},
! 	{"current_role", CURRENT_ROLE, RESERVED_KEYWORD},
! 	{"current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD},
! 	{"current_time", CURRENT_TIME, RESERVED_KEYWORD},
! 	{"current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD},
! 	{"current_user", CURRENT_USER, RESERVED_KEYWORD},
! 	{"cursor", CURSOR, UNRESERVED_KEYWORD},
! 	{"cycle", CYCLE, UNRESERVED_KEYWORD},
! 	{"data", DATA_P, UNRESERVED_KEYWORD},
! 	{"database", DATABASE, UNRESERVED_KEYWORD},
! 	{"day", DAY_P, UNRESERVED_KEYWORD},
! 	{"deallocate", DEALLOCATE, UNRESERVED_KEYWORD},
! 	{"dec", DEC, COL_NAME_KEYWORD},
! 	{"decimal", DECIMAL_P, COL_NAME_KEYWORD},
! 	{"declare", DECLARE, UNRESERVED_KEYWORD},
! 	{"default", DEFAULT, RESERVED_KEYWORD},
! 	{"defaults", DEFAULTS, UNRESERVED_KEYWORD},
! 	{"deferrable", DEFERRABLE, RESERVED_KEYWORD},
! 	{"deferred", DEFERRED, UNRESERVED_KEYWORD},
! 	{"definer", DEFINER, UNRESERVED_KEYWORD},
! 	{"delete", DELETE_P, UNRESERVED_KEYWORD},
! 	{"delimiter", DELIMITER, UNRESERVED_KEYWORD},
! 	{"delimiters", DELIMITERS, UNRESERVED_KEYWORD},
! 	{"desc", DESC, RESERVED_KEYWORD},
! 	{"dictionary", DICTIONARY, UNRESERVED_KEYWORD},
! 	{"disable", DISABLE_P, UNRESERVED_KEYWORD},
! 	{"discard", DISCARD, UNRESERVED_KEYWORD},
! 	{"distinct", DISTINCT, RESERVED_KEYWORD},
! 	{"do", DO, RESERVED_KEYWORD},
! 	{"document", DOCUMENT_P, UNRESERVED_KEYWORD},
! 	{"domain", DOMAIN_P, UNRESERVED_KEYWORD},
! 	{"double", DOUBLE_P, UNRESERVED_KEYWORD},
! 	{"drop", DROP, UNRESERVED_KEYWORD},
! 	{"each", EACH, UNRESERVED_KEYWORD},
! 	{"else", ELSE, RESERVED_KEYWORD},
! 	{"enable", ENABLE_P, UNRESERVED_KEYWORD},
! 	{"encoding", ENCODING, UNRESERVED_KEYWORD},
! 	{"encrypted", ENCRYPTED, UNRESERVED_KEYWORD},
! 	{"end", END_P, RESERVED_KEYWORD},
! 	{"enum", ENUM_P, UNRESERVED_KEYWORD},
! 	{"escape", ESCAPE, UNRESERVED_KEYWORD},
! 	{"except", EXCEPT, RESERVED_KEYWORD},
! 	{"excluding", EXCLUDING, UNRESERVED_KEYWORD},
! 	{"exclusive", EXCLUSIVE, UNRESERVED_KEYWORD},
! 	{"execute", EXECUTE, UNRESERVED_KEYWORD},
! 	{"exists", EXISTS, COL_NAME_KEYWORD},
! 	{"explain", EXPLAIN, UNRESERVED_KEYWORD},
! 	{"external", EXTERNAL, UNRESERVED_KEYWORD},
! 	{"extract", EXTRACT, COL_NAME_KEYWORD},
! 	{"false", FALSE_P, RESERVED_KEYWORD},
! 	{"family", FAMILY, UNRESERVED_KEYWORD},
! 	{"fetch", FETCH, RESERVED_KEYWORD},
! 	{"first", FIRST_P, UNRESERVED_KEYWORD},
! 	{"float", FLOAT_P, COL_NAME_KEYWORD},
! 	{"following", FOLLOWING, UNRESERVED_KEYWORD},
! 	{"for", FOR, RESERVED_KEYWORD},
! 	{"force", FORCE, UNRESERVED_KEYWORD},
! 	{"foreign", FOREIGN, RESERVED_KEYWORD},
! 	{"forward", FORWARD, UNRESERVED_KEYWORD},
! 	{"freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD},
! 	{"from", FROM, RESERVED_KEYWORD},
! 	{"full", FULL, TYPE_FUNC_NAME_KEYWORD},
! 	{"function", FUNCTION, UNRESERVED_KEYWORD},
! 	{"global", GLOBAL, UNRESERVED_KEYWORD},
! 	{"grant", GRANT, RESERVED_KEYWORD},
! 	{"granted", GRANTED, UNRESERVED_KEYWORD},
! 	{"greatest", GREATEST, COL_NAME_KEYWORD},
! 	{"group", GROUP_P, RESERVED_KEYWORD},
! 	{"handler", HANDLER, UNRESERVED_KEYWORD},
! 	{"having", HAVING, RESERVED_KEYWORD},
! 	{"header", HEADER_P, UNRESERVED_KEYWORD},
! 	{"hold", HOLD, UNRESERVED_KEYWORD},
! 	{"hour", HOUR_P, UNRESERVED_KEYWORD},
! 	{"identity", IDENTITY_P, UNRESERVED_KEYWORD},
! 	{"if", IF_P, UNRESERVED_KEYWORD},
! 	{"ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD},
! 	{"immediate", IMMEDIATE, UNRESERVED_KEYWORD},
! 	{"immutable", IMMUTABLE, UNRESERVED_KEYWORD},
! 	{"implicit", IMPLICIT_P, UNRESERVED_KEYWORD},
! 	{"in", IN_P, RESERVED_KEYWORD},
! 	{"including", INCLUDING, UNRESERVED_KEYWORD},
! 	{"increment", INCREMENT, UNRESERVED_KEYWORD},
! 	{"index", INDEX, UNRESERVED_KEYWORD},
! 	{"indexes", INDEXES, UNRESERVED_KEYWORD},
! 	{"inherit", INHERIT, UNRESERVED_KEYWORD},
! 	{"inherits", INHERITS, UNRESERVED_KEYWORD},
! 	{"initially", INITIALLY, RESERVED_KEYWORD},
! 	{"inner", INNER_P, TYPE_FUNC_NAME_KEYWORD},
! 	{"inout", INOUT, COL_NAME_KEYWORD},
! 	{"input", INPUT_P, UNRESERVED_KEYWORD},
! 	{"insensitive", INSENSITIVE, UNRESERVED_KEYWORD},
! 	{"insert", INSERT, UNRESERVED_KEYWORD},
! 	{"instead", INSTEAD, UNRESERVED_KEYWORD},
! 	{"int", INT_P, COL_NAME_KEYWORD},
! 	{"integer", INTEGER, COL_NAME_KEYWORD},
! 	{"intersect", INTERSECT, RESERVED_KEYWORD},
! 	{"interval", INTERVAL, COL_NAME_KEYWORD},
! 	{"into", INTO, RESERVED_KEYWORD},
! 	{"invoker", INVOKER, UNRESERVED_KEYWORD},
! 	{"is", IS, TYPE_FUNC_NAME_KEYWORD},
! 	{"isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD},
! 	{"isolation", ISOLATION, UNRESERVED_KEYWORD},
! 	{"join", JOIN, TYPE_FUNC_NAME_KEYWORD},
! 	{"key", KEY, UNRESERVED_KEYWORD},
! 	{"lancompiler", LANCOMPILER, UNRESERVED_KEYWORD},
! 	{"language", LANGUAGE, UNRESERVED_KEYWORD},
! 	{"large", LARGE_P, UNRESERVED_KEYWORD},
! 	{"last", LAST_P, UNRESERVED_KEYWORD},
! 	{"leading", LEADING, RESERVED_KEYWORD},
! 	{"least", LEAST, COL_NAME_KEYWORD},
! 	{"left", LEFT, TYPE_FUNC_NAME_KEYWORD},
! 	{"level", LEVEL, UNRESERVED_KEYWORD},
! 	{"like", LIKE, TYPE_FUNC_NAME_KEYWORD},
! 	{"limit", LIMIT, RESERVED_KEYWORD},
! 	{"listen", LISTEN, UNRESERVED_KEYWORD},
! 	{"load", LOAD, UNRESERVED_KEYWORD},
! 	{"local", LOCAL, UNRESERVED_KEYWORD},
! 	{"localtime", LOCALTIME, RESERVED_KEYWORD},
! 	{"localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD},
! 	{"location", LOCATION, UNRESERVED_KEYWORD},
! 	{"lock", LOCK_P, UNRESERVED_KEYWORD},
! 	{"login", LOGIN_P, UNRESERVED_KEYWORD},
! 	{"mapping", MAPPING, UNRESERVED_KEYWORD},
! 	{"match", MATCH, UNRESERVED_KEYWORD},
! 	{"maxvalue", MAXVALUE, UNRESERVED_KEYWORD},
! 	{"minute", MINUTE_P, UNRESERVED_KEYWORD},
! 	{"minvalue", MINVALUE, UNRESERVED_KEYWORD},
! 	{"mode", MODE, UNRESERVED_KEYWORD},
! 	{"month", MONTH_P, UNRESERVED_KEYWORD},
! 	{"move", MOVE, UNRESERVED_KEYWORD},
! 	{"name", NAME_P, UNRESERVED_KEYWORD},
! 	{"names", NAMES, UNRESERVED_KEYWORD},
! 	{"national", NATIONAL, COL_NAME_KEYWORD},
! 	{"natural", NATURAL, TYPE_FUNC_NAME_KEYWORD},
! 	{"nchar", NCHAR, COL_NAME_KEYWORD},
! 	{"new", NEW, RESERVED_KEYWORD},
! 	{"next", NEXT, UNRESERVED_KEYWORD},
! 	{"no", NO, UNRESERVED_KEYWORD},
! 	{"nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD},
! 	{"nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD},
! 	{"nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD},
! 	{"noinherit", NOINHERIT, UNRESERVED_KEYWORD},
! 	{"nologin", NOLOGIN_P, UNRESERVED_KEYWORD},
! 	{"none", NONE, COL_NAME_KEYWORD},
! 	{"nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD},
! 	{"not", NOT, RESERVED_KEYWORD},
! 	{"nothing", NOTHING, UNRESERVED_KEYWORD},
! 	{"notify", NOTIFY, UNRESERVED_KEYWORD},
! 	{"notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD},
! 	{"nowait", NOWAIT, UNRESERVED_KEYWORD},
! 	{"null", NULL_P, RESERVED_KEYWORD},
! 	{"nullif", NULLIF, COL_NAME_KEYWORD},
! 	{"nulls", NULLS_P, UNRESERVED_KEYWORD},
! 	{"numeric", NUMERIC, COL_NAME_KEYWORD},
! 	{"object", OBJECT_P, UNRESERVED_KEYWORD},
! 	{"of", OF, UNRESERVED_KEYWORD},
! 	{"off", OFF, RESERVED_KEYWORD},
! 	{"offset", OFFSET, RESERVED_KEYWORD},
! 	{"oids", OIDS, UNRESERVED_KEYWORD},
! 	{"old", OLD, RESERVED_KEYWORD},
! 	{"on", ON, RESERVED_KEYWORD},
! 	{"only", ONLY, RESERVED_KEYWORD},
! 	{"operator", OPERATOR, UNRESERVED_KEYWORD},
! 	{"option", OPTION, UNRESERVED_KEYWORD},
! 	{"options", OPTIONS, UNRESERVED_KEYWORD},
! 	{"or", OR, RESERVED_KEYWORD},
! 	{"order", ORDER, RESERVED_KEYWORD},
! 	{"out", OUT_P, COL_NAME_KEYWORD},
! 	{"outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD},
! 	{"over", OVER, TYPE_FUNC_NAME_KEYWORD},
! 	{"overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD},
! 	{"overlay", OVERLAY, COL_NAME_KEYWORD},
! 	{"owned", OWNED, UNRESERVED_KEYWORD},
! 	{"owner", OWNER, UNRESERVED_KEYWORD},
! 	{"parser", PARSER, UNRESERVED_KEYWORD},
! 	{"partial", PARTIAL, UNRESERVED_KEYWORD},
! 	{"partition", PARTITION, UNRESERVED_KEYWORD},
! 	{"password", PASSWORD, UNRESERVED_KEYWORD},
! 	{"placing", PLACING, RESERVED_KEYWORD},
! 	{"plans", PLANS, UNRESERVED_KEYWORD},
! 	{"position", POSITION, COL_NAME_KEYWORD},
! 	{"preceding", PRECEDING, UNRESERVED_KEYWORD},
! 	{"precision", PRECISION, COL_NAME_KEYWORD},
! 	{"prepare", PREPARE, UNRESERVED_KEYWORD},
! 	{"prepared", PREPARED, UNRESERVED_KEYWORD},
! 	{"preserve", PRESERVE, UNRESERVED_KEYWORD},
! 	{"primary", PRIMARY, RESERVED_KEYWORD},
! 	{"prior", PRIOR, UNRESERVED_KEYWORD},
! 	{"privileges", PRIVILEGES, UNRESERVED_KEYWORD},
! 	{"procedural", PROCEDURAL, UNRESERVED_KEYWORD},
! 	{"procedure", PROCEDURE, UNRESERVED_KEYWORD},
! 	{"quote", QUOTE, UNRESERVED_KEYWORD},
! 	{"range", RANGE, UNRESERVED_KEYWORD},
! 	{"read", READ, UNRESERVED_KEYWORD},
! 	{"real", REAL, COL_NAME_KEYWORD},
! 	{"reassign", REASSIGN, UNRESERVED_KEYWORD},
! 	{"recheck", RECHECK, UNRESERVED_KEYWORD},
! 	{"recursive", RECURSIVE, UNRESERVED_KEYWORD},
! 	{"references", REFERENCES, RESERVED_KEYWORD},
! 	{"reindex", REINDEX, UNRESERVED_KEYWORD},
! 	{"relative", RELATIVE_P, UNRESERVED_KEYWORD},
! 	{"release", RELEASE, UNRESERVED_KEYWORD},
! 	{"rename", RENAME, UNRESERVED_KEYWORD},
! 	{"repeatable", REPEATABLE, UNRESERVED_KEYWORD},
! 	{"replace", REPLACE, UNRESERVED_KEYWORD},
! 	{"replica", REPLICA, UNRESERVED_KEYWORD},
! 	{"reset", RESET, UNRESERVED_KEYWORD},
! 	{"restart", RESTART, UNRESERVED_KEYWORD},
! 	{"restrict", RESTRICT, UNRESERVED_KEYWORD},
! 	{"returning", RETURNING, RESERVED_KEYWORD},
! 	{"returns", RETURNS, UNRESERVED_KEYWORD},
! 	{"revoke", REVOKE, UNRESERVED_KEYWORD},
! 	{"right", RIGHT, TYPE_FUNC_NAME_KEYWORD},
! 	{"role", ROLE, UNRESERVED_KEYWORD},
! 	{"rollback", ROLLBACK, UNRESERVED_KEYWORD},
! 	{"row", ROW, COL_NAME_KEYWORD},
! 	{"rows", ROWS, UNRESERVED_KEYWORD},
! 	{"rule", RULE, UNRESERVED_KEYWORD},
! 	{"savepoint", SAVEPOINT, UNRESERVED_KEYWORD},
! 	{"schema", SCHEMA, UNRESERVED_KEYWORD},
! 	{"scroll", SCROLL, UNRESERVED_KEYWORD},
! 	{"search", SEARCH, UNRESERVED_KEYWORD},
! 	{"second", SECOND_P, UNRESERVED_KEYWORD},
! 	{"security", SECURITY, UNRESERVED_KEYWORD},
! 	{"select", SELECT, RESERVED_KEYWORD},
! 	{"sequence", SEQUENCE, UNRESERVED_KEYWORD},
! 	{"serializable", SERIALIZABLE, UNRESERVED_KEYWORD},
! 	{"server", SERVER, UNRESERVED_KEYWORD},
! 	{"session", SESSION, UNRESERVED_KEYWORD},
! 	{"session_user", SESSION_USER, RESERVED_KEYWORD},
! 	{"set", SET, UNRESERVED_KEYWORD},
! 	{"setof", SETOF, COL_NAME_KEYWORD},
! 	{"share", SHARE, UNRESERVED_KEYWORD},
! 	{"show", SHOW, UNRESERVED_KEYWORD},
! 	{"similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD},
! 	{"simple", SIMPLE, UNRESERVED_KEYWORD},
! 	{"smallint", SMALLINT, COL_NAME_KEYWORD},
! 	{"some", SOME, RESERVED_KEYWORD},
! 	{"stable", STABLE, UNRESERVED_KEYWORD},
! 	{"standalone", STANDALONE_P, UNRESERVED_KEYWORD},
! 	{"start", START, UNRESERVED_KEYWORD},
! 	{"statement", STATEMENT, UNRESERVED_KEYWORD},
! 	{"statistics", STATISTICS, UNRESERVED_KEYWORD},
! 	{"stdin", STDIN, UNRESERVED_KEYWORD},
! 	{"stdout", STDOUT, UNRESERVED_KEYWORD},
! 	{"storage", STORAGE, UNRESERVED_KEYWORD},
! 	{"strict", STRICT_P, UNRESERVED_KEYWORD},
! 	{"strip", STRIP_P, UNRESERVED_KEYWORD},
! 	{"substring", SUBSTRING, COL_NAME_KEYWORD},
! 	{"superuser", SUPERUSER_P, UNRESERVED_KEYWORD},
! 	{"symmetric", SYMMETRIC, RESERVED_KEYWORD},
! 	{"sysid", SYSID, UNRESERVED_KEYWORD},
! 	{"system", SYSTEM_P, UNRESERVED_KEYWORD},
! 	{"table", TABLE, RESERVED_KEYWORD},
! 	{"tablespace", TABLESPACE, UNRESERVED_KEYWORD},
! 	{"temp", TEMP, UNRESERVED_KEYWORD},
! 	{"template", TEMPLATE, UNRESERVED_KEYWORD},
! 	{"temporary", TEMPORARY, UNRESERVED_KEYWORD},
! 	{"text", TEXT_P, UNRESERVED_KEYWORD},
! 	{"then", THEN, RESERVED_KEYWORD},
! 	{"time", TIME, COL_NAME_KEYWORD},
! 	{"timestamp", TIMESTAMP, COL_NAME_KEYWORD},
! 	{"to", TO, RESERVED_KEYWORD},
! 	{"trailing", TRAILING, RESERVED_KEYWORD},
! 	{"transaction", TRANSACTION, UNRESERVED_KEYWORD},
! 	{"treat", TREAT, COL_NAME_KEYWORD},
! 	{"trigger", TRIGGER, UNRESERVED_KEYWORD},
! 	{"trim", TRIM, COL_NAME_KEYWORD},
! 	{"true", TRUE_P, RESERVED_KEYWORD},
! 	{"truncate", TRUNCATE, UNRESERVED_KEYWORD},
! 	{"trusted", TRUSTED, UNRESERVED_KEYWORD},
! 	{"type", TYPE_P, UNRESERVED_KEYWORD},
! 	{"unbounded", UNBOUNDED, UNRESERVED_KEYWORD},
! 	{"uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD},
! 	{"unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD},
! 	{"union", UNION, RESERVED_KEYWORD},
! 	{"unique", UNIQUE, RESERVED_KEYWORD},
! 	{"unknown", UNKNOWN, UNRESERVED_KEYWORD},
! 	{"unlisten", UNLISTEN, UNRESERVED_KEYWORD},
! 	{"until", UNTIL, UNRESERVED_KEYWORD},
! 	{"update", UPDATE, UNRESERVED_KEYWORD},
! 	{"user", USER, RESERVED_KEYWORD},
! 	{"using", USING, RESERVED_KEYWORD},
! 	{"vacuum", VACUUM, UNRESERVED_KEYWORD},
! 	{"valid", VALID, UNRESERVED_KEYWORD},
! 	{"validator", VALIDATOR, UNRESERVED_KEYWORD},
! 	{"value", VALUE_P, UNRESERVED_KEYWORD},
! 	{"values", VALUES, COL_NAME_KEYWORD},
! 	{"varchar", VARCHAR, COL_NAME_KEYWORD},
! 	{"variadic", VARIADIC, RESERVED_KEYWORD},
! 	{"varying", VARYING, UNRESERVED_KEYWORD},
! 	{"verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD},
! 	{"version", VERSION_P, UNRESERVED_KEYWORD},
! 	{"view", VIEW, UNRESERVED_KEYWORD},
! 	{"volatile", VOLATILE, UNRESERVED_KEYWORD},
! 	{"when", WHEN, RESERVED_KEYWORD},
! 	{"where", WHERE, RESERVED_KEYWORD},
! 	{"whitespace", WHITESPACE_P, UNRESERVED_KEYWORD},
! 	{"window", WINDOW, RESERVED_KEYWORD},
! 	{"with", WITH, RESERVED_KEYWORD},
! 	{"without", WITHOUT, UNRESERVED_KEYWORD},
! 	{"work", WORK, UNRESERVED_KEYWORD},
! 	{"wrapper", WRAPPER, UNRESERVED_KEYWORD},
! 	{"write", WRITE, UNRESERVED_KEYWORD},
! 	{"xml", XML_P, UNRESERVED_KEYWORD},
! 	{"xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD},
! 	{"xmlconcat", XMLCONCAT, COL_NAME_KEYWORD},
! 	{"xmlelement", XMLELEMENT, COL_NAME_KEYWORD},
! 	{"xmlforest", XMLFOREST, COL_NAME_KEYWORD},
! 	{"xmlparse", XMLPARSE, COL_NAME_KEYWORD},
! 	{"xmlpi", XMLPI, COL_NAME_KEYWORD},
! 	{"xmlroot", XMLROOT, COL_NAME_KEYWORD},
! 	{"xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD},
! 	{"year", YEAR_P, UNRESERVED_KEYWORD},
! 	{"yes", YES_P, UNRESERVED_KEYWORD},
! 	{"zone", ZONE, UNRESERVED_KEYWORD},
  };
  
  /* End of ScanKeywords, for use elsewhere */
--- 56,452 ----
   */
  const ScanKeyword ScanKeywords[] = {
  	/* name, value, category */
! 	PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("add", ADD_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("admin", ADMIN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("after", AFTER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("aggregate", AGGREGATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("all", ALL, RESERVED_KEYWORD),
! 	PG_KEYWORD("also", ALSO, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("alter", ALTER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("always", ALWAYS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("analyse", ANALYSE, RESERVED_KEYWORD),		/* British spelling */
! 	PG_KEYWORD("analyze", ANALYZE, RESERVED_KEYWORD),
! 	PG_KEYWORD("and", AND, RESERVED_KEYWORD),
! 	PG_KEYWORD("any", ANY, RESERVED_KEYWORD),
! 	PG_KEYWORD("array", ARRAY, RESERVED_KEYWORD),
! 	PG_KEYWORD("as", AS, RESERVED_KEYWORD),
! 	PG_KEYWORD("asc", ASC, RESERVED_KEYWORD),
! 	PG_KEYWORD("assertion", ASSERTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("assignment", ASSIGNMENT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD),
! 	PG_KEYWORD("at", AT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("between", BETWEEN, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("bigint", BIGINT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("binary", BINARY, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("bit", BIT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("both", BOTH, RESERVED_KEYWORD),
! 	PG_KEYWORD("by", BY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cascaded", CASCADED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("case", CASE, RESERVED_KEYWORD),
! 	PG_KEYWORD("cast", CAST, RESERVED_KEYWORD),
! 	PG_KEYWORD("catalog", CATALOG_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("chain", CHAIN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("char", CHAR_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("character", CHARACTER, COL_NAME_KEYWORD),
! 	PG_KEYWORD("characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("check", CHECK, RESERVED_KEYWORD),
! 	PG_KEYWORD("checkpoint", CHECKPOINT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("class", CLASS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("close", CLOSE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cluster", CLUSTER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("coalesce", COALESCE, COL_NAME_KEYWORD),
! 	PG_KEYWORD("collate", COLLATE, RESERVED_KEYWORD),
! 	PG_KEYWORD("column", COLUMN, RESERVED_KEYWORD),
! 	PG_KEYWORD("comment", COMMENT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("concurrently", CONCURRENTLY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD),
! 	PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("content", CONTENT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("continue", CONTINUE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("conversion", CONVERSION_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("copy", COPY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cost", COST, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("create", CREATE, RESERVED_KEYWORD),
! 	PG_KEYWORD("createdb", CREATEDB, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("createrole", CREATEROLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("createuser", CREATEUSER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("ctype", CTYPE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD),
! 	PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD),
! 	PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD),
! 	PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD),
! 	PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD),
! 	PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD),
! 	PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD),
! 	PG_KEYWORD("decimal", DECIMAL_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("declare", DECLARE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("default", DEFAULT, RESERVED_KEYWORD),
! 	PG_KEYWORD("defaults", DEFAULTS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("deferrable", DEFERRABLE, RESERVED_KEYWORD),
! 	PG_KEYWORD("deferred", DEFERRED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("definer", DEFINER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("delete", DELETE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("delimiter", DELIMITER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("delimiters", DELIMITERS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("desc", DESC, RESERVED_KEYWORD),
! 	PG_KEYWORD("dictionary", DICTIONARY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD),
! 	PG_KEYWORD("do", DO, RESERVED_KEYWORD),
! 	PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("else", ELSE, RESERVED_KEYWORD),
! 	PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("end", END_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD),
! 	PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("exists", EXISTS, COL_NAME_KEYWORD),
! 	PG_KEYWORD("explain", EXPLAIN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD),
! 	PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("for", FOR, RESERVED_KEYWORD),
! 	PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD),
! 	PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("from", FROM, RESERVED_KEYWORD),
! 	PG_KEYWORD("full", FULL, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("function", FUNCTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("global", GLOBAL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("grant", GRANT, RESERVED_KEYWORD),
! 	PG_KEYWORD("granted", GRANTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("greatest", GREATEST, COL_NAME_KEYWORD),
! 	PG_KEYWORD("group", GROUP_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("handler", HANDLER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("having", HAVING, RESERVED_KEYWORD),
! 	PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("implicit", IMPLICIT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("in", IN_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("including", INCLUDING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("increment", INCREMENT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("index", INDEX, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("indexes", INDEXES, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("inherit", INHERIT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("inherits", INHERITS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("initially", INITIALLY, RESERVED_KEYWORD),
! 	PG_KEYWORD("inner", INNER_P, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("inout", INOUT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("input", INPUT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("insensitive", INSENSITIVE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("insert", INSERT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("instead", INSTEAD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("int", INT_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("integer", INTEGER, COL_NAME_KEYWORD),
! 	PG_KEYWORD("intersect", INTERSECT, RESERVED_KEYWORD),
! 	PG_KEYWORD("interval", INTERVAL, COL_NAME_KEYWORD),
! 	PG_KEYWORD("into", INTO, RESERVED_KEYWORD),
! 	PG_KEYWORD("invoker", INVOKER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("lancompiler", LANCOMPILER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD),
! 	PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD),
! 	PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("level", LEVEL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("like", LIKE, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD),
! 	PG_KEYWORD("listen", LISTEN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("load", LOAD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("local", LOCAL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("localtime", LOCALTIME, RESERVED_KEYWORD),
! 	PG_KEYWORD("localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD),
! 	PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("login", LOGIN_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD),
! 	PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD),
! 	PG_KEYWORD("new", NEW, RESERVED_KEYWORD),
! 	PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("no", NO, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("noinherit", NOINHERIT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("nologin", NOLOGIN_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("none", NONE, COL_NAME_KEYWORD),
! 	PG_KEYWORD("nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("not", NOT, RESERVED_KEYWORD),
! 	PG_KEYWORD("nothing", NOTHING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("notify", NOTIFY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("nowait", NOWAIT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD),
! 	PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD),
! 	PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("of", OF, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("off", OFF, RESERVED_KEYWORD),
! 	PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD),
! 	PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("old", OLD, RESERVED_KEYWORD),
! 	PG_KEYWORD("on", ON, RESERVED_KEYWORD),
! 	PG_KEYWORD("only", ONLY, RESERVED_KEYWORD),
! 	PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("option", OPTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("options", OPTIONS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("or", OR, RESERVED_KEYWORD),
! 	PG_KEYWORD("order", ORDER, RESERVED_KEYWORD),
! 	PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD),
! 	PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("over", OVER, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD),
! 	PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD),
! 	PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD),
! 	PG_KEYWORD("preceding", PRECEDING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("precision", PRECISION, COL_NAME_KEYWORD),
! 	PG_KEYWORD("prepare", PREPARE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("prepared", PREPARED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("preserve", PRESERVE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("primary", PRIMARY, RESERVED_KEYWORD),
! 	PG_KEYWORD("prior", PRIOR, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("privileges", PRIVILEGES, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("procedural", PROCEDURAL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("procedure", PROCEDURE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("read", READ, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("real", REAL, COL_NAME_KEYWORD),
! 	PG_KEYWORD("reassign", REASSIGN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("recheck", RECHECK, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("recursive", RECURSIVE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("references", REFERENCES, RESERVED_KEYWORD),
! 	PG_KEYWORD("reindex", REINDEX, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("relative", RELATIVE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("release", RELEASE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("rename", RENAME, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("repeatable", REPEATABLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("replace", REPLACE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("replica", REPLICA, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("reset", RESET, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("restart", RESTART, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("restrict", RESTRICT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("returning", RETURNING, RESERVED_KEYWORD),
! 	PG_KEYWORD("returns", RETURNS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("revoke", REVOKE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("right", RIGHT, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("role", ROLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("rollback", ROLLBACK, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("row", ROW, COL_NAME_KEYWORD),
! 	PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("search", SEARCH, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("second", SECOND_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("security", SECURITY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("select", SELECT, RESERVED_KEYWORD),
! 	PG_KEYWORD("sequence", SEQUENCE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("serializable", SERIALIZABLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("server", SERVER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("session", SESSION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("session_user", SESSION_USER, RESERVED_KEYWORD),
! 	PG_KEYWORD("set", SET, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("setof", SETOF, COL_NAME_KEYWORD),
! 	PG_KEYWORD("share", SHARE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("show", SHOW, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("simple", SIMPLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("some", SOME, RESERVED_KEYWORD),
! 	PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("start", START, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("statement", STATEMENT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("statistics", STATISTICS, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("stdin", STDIN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD),
! 	PG_KEYWORD("superuser", SUPERUSER_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD),
! 	PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("table", TABLE, RESERVED_KEYWORD),
! 	PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("then", THEN, RESERVED_KEYWORD),
! 	PG_KEYWORD("time", TIME, COL_NAME_KEYWORD),
! 	PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD),
! 	PG_KEYWORD("to", TO, RESERVED_KEYWORD),
! 	PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD),
! 	PG_KEYWORD("transaction", TRANSACTION, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("treat", TREAT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("trigger", TRIGGER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("trim", TRIM, COL_NAME_KEYWORD),
! 	PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD),
! 	PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("union", UNION, RESERVED_KEYWORD),
! 	PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD),
! 	PG_KEYWORD("unknown", UNKNOWN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("unlisten", UNLISTEN, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("until", UNTIL, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("user", USER, RESERVED_KEYWORD),
! 	PG_KEYWORD("using", USING, RESERVED_KEYWORD),
! 	PG_KEYWORD("vacuum", VACUUM, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("valid", VALID, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("validator", VALIDATOR, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("value", VALUE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("values", VALUES, COL_NAME_KEYWORD),
! 	PG_KEYWORD("varchar", VARCHAR, COL_NAME_KEYWORD),
! 	PG_KEYWORD("variadic", VARIADIC, RESERVED_KEYWORD),
! 	PG_KEYWORD("varying", VARYING, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD),
! 	PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("when", WHEN, RESERVED_KEYWORD),
! 	PG_KEYWORD("where", WHERE, RESERVED_KEYWORD),
! 	PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("window", WINDOW, RESERVED_KEYWORD),
! 	PG_KEYWORD("with", WITH, RESERVED_KEYWORD),
! 	PG_KEYWORD("without", WITHOUT, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlelement", XMLELEMENT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlforest", XMLFOREST, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlparse", XMLPARSE, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlpi", XMLPI, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlroot", XMLROOT, COL_NAME_KEYWORD),
! 	PG_KEYWORD("xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD),
! 	PG_KEYWORD("year", YEAR_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("yes", YES_P, UNRESERVED_KEYWORD),
! 	PG_KEYWORD("zone", ZONE, UNRESERVED_KEYWORD),
  };
  
  /* End of ScanKeywords, for use elsewhere */
Index: src/bin/pg_dump/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/bin/pg_dump/Makefile,v
retrieving revision 1.66
diff -c -p -r1.66 Makefile
*** src/bin/pg_dump/Makefile	1 Jan 2009 17:23:54 -0000	1.66
--- src/bin/pg_dump/Makefile	4 Mar 2009 14:36:22 -0000
*************** subdir = src/bin/pg_dump
*** 14,42 ****
  top_builddir = ../../..
  include $(top_builddir)/src/Makefile.global
  
! override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
  
  OBJS=	pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
! 	dumputils.o $(WIN32RES)
  
! EXTRA_OBJS = $(top_builddir)/src/backend/parser/keywords.o
  
! all: submake-libpq submake-libpgport submake-backend pg_dump pg_restore pg_dumpall
  
  pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(EXTRA_OBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
! 
! .PHONY: submake-backend
! submake-backend:
! 	$(MAKE) -C $(top_builddir)/src/backend/parser keywords.o
! 
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
--- 14,38 ----
  top_builddir = ../../..
  include $(top_builddir)/src/Makefile.global
  
! override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -DFRONTEND
  
  OBJS=	pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
! 	dumputils.o keywords.o $(WIN32RES)
  
! keywords.c: % : $(top_srcdir)/src/backend/parser/%
! 	rm -f $@ && $(LN_S) $< .
  
! all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall
  
  pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o keywords.o $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
*************** uninstall:
*** 50,53 ****
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o
--- 46,49 ----
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o keywords.c
Index: src/include/parser/keywords.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/parser/keywords.h,v
retrieving revision 1.26
diff -c -p -r1.26 keywords.h
*** src/include/parser/keywords.h	1 Jan 2009 17:24:00 -0000	1.26
--- src/include/parser/keywords.h	4 Mar 2009 14:03:47 -0000
***************
*** 21,30 ****
--- 21,33 ----
  #define RESERVED_KEYWORD		3
  
  
+ /* see keywords.c about frontend builds */
  typedef struct ScanKeyword
  {
  	const char *name;			/* in lower case */
+ #if !defined FRONTEND || defined ECPG_COMPILE
  	int16		value;			/* grammar's token code */
+ #endif
  	int16		category;		/* see codes above */
  } ScanKeyword;
  
#6Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alvaro Herrera (#5)
Re: building pg_dump doesn't work

Alvaro Herrera wrote:

Alvaro Herrera wrote:

Hmm, I had thought that pg_dump only wanted the header file, not the
keywords.o object file. I now see that I was wrong. I agree that your
proposed solution is a lot better. I'll see about it.

Here it is. The #ifdef parts seem a bit ugly, but I'm not sure how can
this be improved, given that ECPG is already using this file.

Perhaps this could be made less ugly by only having the ScanKeywords
array in the .c file, and #including that into other .c files in
src/backend/parser, ecpg and pg_dump.

So, keywords.c would look like:

#include "parser/keywords.h"
const ScanKeyword ScanKeywords[] = {
/* name, value, category */
PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),
PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD),
PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD),
...

And there would be a new file in src/bin/pg_dump, say dumpkeywords.c,
that looks like this:

#include "c.h"

#define PG_KEYWORD(a,b,c) {a,b,c}
#include "src/backend/parser/keywords.c"

Not sure what to do about ScanKeywordLookup function.

/*
+  * We don't want to include the gram.h file on frontend builds, except ECPG, so
+  * leave out the second struct member in that case.
+  */
+ #if !defined FRONTEND || defined ECPG_COMPILE
+ #define PG_KEYWORD(a,b,c) {a,b,c}
+ #else
+ #define PG_KEYWORD(a,b,c) {a,c}
+ #endif

Doesn't that put 'c' into the wrong field in ScanKeyword struct? It only
compiles because both 'value' and 'category' are int16.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#6)
Re: building pg_dump doesn't work

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:

Perhaps this could be made less ugly by only having the ScanKeywords
array in the .c file, and #including that into other .c files in
src/backend/parser, ecpg and pg_dump.

What I'd suggest is something similar to the design of the errcodes.h
header: create a header file containing just the list of PG_KEYWORD
macro calls, and have the different users #include it after defining
that macro appropriately. Having .c files include other .c files is
usually best avoided on least-surprise grounds.

Not sure what to do about ScanKeywordLookup function.

Yeah, duplicating that function is a bit annoying.

regards, tom lane

#8Alvaro Herrera
alvherre@commandprompt.com
In reply to: Tom Lane (#7)
Re: building pg_dump doesn't work

Tom Lane wrote:

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:

Perhaps this could be made less ugly by only having the ScanKeywords
array in the .c file, and #including that into other .c files in
src/backend/parser, ecpg and pg_dump.

What I'd suggest is something similar to the design of the errcodes.h
header: create a header file containing just the list of PG_KEYWORD
macro calls, and have the different users #include it after defining
that macro appropriately. Having .c files include other .c files is
usually best avoided on least-surprise grounds.

Seems doable.

Not sure what to do about ScanKeywordLookup function.

Yeah, duplicating that function is a bit annoying.

Another new file, backend/parser/kwlookup.c perhaps?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#9Alvaro Herrera
alvherre@commandprompt.com
In reply to: Heikki Linnakangas (#6)
Re: building pg_dump doesn't work

Heikki Linnakangas wrote:

Alvaro Herrera wrote:

/*
+  * We don't want to include the gram.h file on frontend builds, except ECPG, so
+  * leave out the second struct member in that case.
+  */
+ #if !defined FRONTEND || defined ECPG_COMPILE
+ #define PG_KEYWORD(a,b,c) {a,b,c}
+ #else
+ #define PG_KEYWORD(a,b,c) {a,c}
+ #endif

Doesn't that put 'c' into the wrong field in ScanKeyword struct? It only
compiles because both 'value' and 'category' are int16.

No, because I had the header with the second field omitted too.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#10Alvaro Herrera
alvherre@commandprompt.com
In reply to: Alvaro Herrera (#8)
1 attachment(s)
Re: building pg_dump doesn't work

Alvaro Herrera wrote:

Tom Lane wrote:

What I'd suggest is something similar to the design of the errcodes.h
header: create a header file containing just the list of PG_KEYWORD
macro calls, and have the different users #include it after defining
that macro appropriately. Having .c files include other .c files is
usually best avoided on least-surprise grounds.

Seems doable.

Attached.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Attachments:

pgdump-parser-dep-3.patchtext/x-diff; charset=us-asciiDownload
Index: src/backend/parser/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/Makefile,v
retrieving revision 1.48
diff -c -p -r1.48 Makefile
*** src/backend/parser/Makefile	4 Oct 2008 21:56:54 -0000	1.48
--- src/backend/parser/Makefile	4 Mar 2009 15:32:52 -0000
*************** override CPPFLAGS := -I$(srcdir) $(CPPFL
*** 14,20 ****
  
  OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_cte.o parse_clause.o \
        parse_expr.o parse_func.o parse_node.o parse_oper.o parse_relation.o \
!       parse_type.o parse_coerce.o parse_target.o parse_utilcmd.o scansup.o
  
  FLEXFLAGS = -CF
  
--- 14,20 ----
  
  OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_cte.o parse_clause.o \
        parse_expr.o parse_func.o parse_node.o parse_oper.o parse_relation.o \
!       parse_type.o parse_coerce.o parse_target.o parse_utilcmd.o scansup.o kwlookup.o
  
  FLEXFLAGS = -CF
  
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.210
diff -c -p -r1.210 keywords.c
*** src/backend/parser/keywords.c	24 Feb 2009 10:06:33 -0000	1.210
--- src/backend/parser/keywords.c	4 Mar 2009 15:56:35 -0000
***************
*** 3,10 ****
   * keywords.c
   *	  lexical token lookup for key words in PostgreSQL
   *
-  * NB: This file is also used by pg_dump.
-  *
   *
   * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
   * Portions Copyright (c) 1994, Regents of the University of California
--- 3,8 ----
***************
*** 15,503 ****
   *
   *-------------------------------------------------------------------------
   */
  
! /* Use c.h so that this file can be built in either frontend or backend */
! #include "c.h"
! 
! #include <ctype.h>
! 
! /*
!  * This macro definition overrides the YYSTYPE union definition in gram.h.
!  * We don't need that struct in this file, and including the real definition
!  * would require sucking in some backend-only include files.
!  */
! #define YYSTYPE int
! 
  #include "parser/keywords.h"
- #ifndef ECPG_COMPILE
  #include "parser/gram.h"
- #else
- #include "preproc.h"
- #endif
- 
- /*
-  * List of keyword (name, token-value, category) entries.
-  *
-  * !!WARNING!!: This list must be sorted by ASCII name, because binary
-  *		 search is used to locate entries.
-  */
- const ScanKeyword ScanKeywords[] = {
- 	/* name, value, category */
- 	{"abort", ABORT_P, UNRESERVED_KEYWORD},
- 	{"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD},
- 	{"access", ACCESS, UNRESERVED_KEYWORD},
- 	{"action", ACTION, UNRESERVED_KEYWORD},
- 	{"add", ADD_P, UNRESERVED_KEYWORD},
- 	{"admin", ADMIN, UNRESERVED_KEYWORD},
- 	{"after", AFTER, UNRESERVED_KEYWORD},
- 	{"aggregate", AGGREGATE, UNRESERVED_KEYWORD},
- 	{"all", ALL, RESERVED_KEYWORD},
- 	{"also", ALSO, UNRESERVED_KEYWORD},
- 	{"alter", ALTER, UNRESERVED_KEYWORD},
- 	{"always", ALWAYS, UNRESERVED_KEYWORD},
- 	{"analyse", ANALYSE, RESERVED_KEYWORD},		/* British spelling */
- 	{"analyze", ANALYZE, RESERVED_KEYWORD},
- 	{"and", AND, RESERVED_KEYWORD},
- 	{"any", ANY, RESERVED_KEYWORD},
- 	{"array", ARRAY, RESERVED_KEYWORD},
- 	{"as", AS, RESERVED_KEYWORD},
- 	{"asc", ASC, RESERVED_KEYWORD},
- 	{"assertion", ASSERTION, UNRESERVED_KEYWORD},
- 	{"assignment", ASSIGNMENT, UNRESERVED_KEYWORD},
- 	{"asymmetric", ASYMMETRIC, RESERVED_KEYWORD},
- 	{"at", AT, UNRESERVED_KEYWORD},
- 	{"authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD},
- 	{"backward", BACKWARD, UNRESERVED_KEYWORD},
- 	{"before", BEFORE, UNRESERVED_KEYWORD},
- 	{"begin", BEGIN_P, UNRESERVED_KEYWORD},
- 	{"between", BETWEEN, TYPE_FUNC_NAME_KEYWORD},
- 	{"bigint", BIGINT, COL_NAME_KEYWORD},
- 	{"binary", BINARY, TYPE_FUNC_NAME_KEYWORD},
- 	{"bit", BIT, COL_NAME_KEYWORD},
- 	{"boolean", BOOLEAN_P, COL_NAME_KEYWORD},
- 	{"both", BOTH, RESERVED_KEYWORD},
- 	{"by", BY, UNRESERVED_KEYWORD},
- 	{"cache", CACHE, UNRESERVED_KEYWORD},
- 	{"called", CALLED, UNRESERVED_KEYWORD},
- 	{"cascade", CASCADE, UNRESERVED_KEYWORD},
- 	{"cascaded", CASCADED, UNRESERVED_KEYWORD},
- 	{"case", CASE, RESERVED_KEYWORD},
- 	{"cast", CAST, RESERVED_KEYWORD},
- 	{"catalog", CATALOG_P, UNRESERVED_KEYWORD},
- 	{"chain", CHAIN, UNRESERVED_KEYWORD},
- 	{"char", CHAR_P, COL_NAME_KEYWORD},
- 	{"character", CHARACTER, COL_NAME_KEYWORD},
- 	{"characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD},
- 	{"check", CHECK, RESERVED_KEYWORD},
- 	{"checkpoint", CHECKPOINT, UNRESERVED_KEYWORD},
- 	{"class", CLASS, UNRESERVED_KEYWORD},
- 	{"close", CLOSE, UNRESERVED_KEYWORD},
- 	{"cluster", CLUSTER, UNRESERVED_KEYWORD},
- 	{"coalesce", COALESCE, COL_NAME_KEYWORD},
- 	{"collate", COLLATE, RESERVED_KEYWORD},
- 	{"column", COLUMN, RESERVED_KEYWORD},
- 	{"comment", COMMENT, UNRESERVED_KEYWORD},
- 	{"commit", COMMIT, UNRESERVED_KEYWORD},
- 	{"committed", COMMITTED, UNRESERVED_KEYWORD},
- 	{"concurrently", CONCURRENTLY, UNRESERVED_KEYWORD},
- 	{"configuration", CONFIGURATION, UNRESERVED_KEYWORD},
- 	{"connection", CONNECTION, UNRESERVED_KEYWORD},
- 	{"constraint", CONSTRAINT, RESERVED_KEYWORD},
- 	{"constraints", CONSTRAINTS, UNRESERVED_KEYWORD},
- 	{"content", CONTENT_P, UNRESERVED_KEYWORD},
- 	{"continue", CONTINUE_P, UNRESERVED_KEYWORD},
- 	{"conversion", CONVERSION_P, UNRESERVED_KEYWORD},
- 	{"copy", COPY, UNRESERVED_KEYWORD},
- 	{"cost", COST, UNRESERVED_KEYWORD},
- 	{"create", CREATE, RESERVED_KEYWORD},
- 	{"createdb", CREATEDB, UNRESERVED_KEYWORD},
- 	{"createrole", CREATEROLE, UNRESERVED_KEYWORD},
- 	{"createuser", CREATEUSER, UNRESERVED_KEYWORD},
- 	{"cross", CROSS, TYPE_FUNC_NAME_KEYWORD},
- 	{"csv", CSV, UNRESERVED_KEYWORD},
- 	{"ctype", CTYPE, UNRESERVED_KEYWORD},
- 	{"current", CURRENT_P, UNRESERVED_KEYWORD},
- 	{"current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD},
- 	{"current_date", CURRENT_DATE, RESERVED_KEYWORD},
- 	{"current_role", CURRENT_ROLE, RESERVED_KEYWORD},
- 	{"current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD},
- 	{"current_time", CURRENT_TIME, RESERVED_KEYWORD},
- 	{"current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD},
- 	{"current_user", CURRENT_USER, RESERVED_KEYWORD},
- 	{"cursor", CURSOR, UNRESERVED_KEYWORD},
- 	{"cycle", CYCLE, UNRESERVED_KEYWORD},
- 	{"data", DATA_P, UNRESERVED_KEYWORD},
- 	{"database", DATABASE, UNRESERVED_KEYWORD},
- 	{"day", DAY_P, UNRESERVED_KEYWORD},
- 	{"deallocate", DEALLOCATE, UNRESERVED_KEYWORD},
- 	{"dec", DEC, COL_NAME_KEYWORD},
- 	{"decimal", DECIMAL_P, COL_NAME_KEYWORD},
- 	{"declare", DECLARE, UNRESERVED_KEYWORD},
- 	{"default", DEFAULT, RESERVED_KEYWORD},
- 	{"defaults", DEFAULTS, UNRESERVED_KEYWORD},
- 	{"deferrable", DEFERRABLE, RESERVED_KEYWORD},
- 	{"deferred", DEFERRED, UNRESERVED_KEYWORD},
- 	{"definer", DEFINER, UNRESERVED_KEYWORD},
- 	{"delete", DELETE_P, UNRESERVED_KEYWORD},
- 	{"delimiter", DELIMITER, UNRESERVED_KEYWORD},
- 	{"delimiters", DELIMITERS, UNRESERVED_KEYWORD},
- 	{"desc", DESC, RESERVED_KEYWORD},
- 	{"dictionary", DICTIONARY, UNRESERVED_KEYWORD},
- 	{"disable", DISABLE_P, UNRESERVED_KEYWORD},
- 	{"discard", DISCARD, UNRESERVED_KEYWORD},
- 	{"distinct", DISTINCT, RESERVED_KEYWORD},
- 	{"do", DO, RESERVED_KEYWORD},
- 	{"document", DOCUMENT_P, UNRESERVED_KEYWORD},
- 	{"domain", DOMAIN_P, UNRESERVED_KEYWORD},
- 	{"double", DOUBLE_P, UNRESERVED_KEYWORD},
- 	{"drop", DROP, UNRESERVED_KEYWORD},
- 	{"each", EACH, UNRESERVED_KEYWORD},
- 	{"else", ELSE, RESERVED_KEYWORD},
- 	{"enable", ENABLE_P, UNRESERVED_KEYWORD},
- 	{"encoding", ENCODING, UNRESERVED_KEYWORD},
- 	{"encrypted", ENCRYPTED, UNRESERVED_KEYWORD},
- 	{"end", END_P, RESERVED_KEYWORD},
- 	{"enum", ENUM_P, UNRESERVED_KEYWORD},
- 	{"escape", ESCAPE, UNRESERVED_KEYWORD},
- 	{"except", EXCEPT, RESERVED_KEYWORD},
- 	{"excluding", EXCLUDING, UNRESERVED_KEYWORD},
- 	{"exclusive", EXCLUSIVE, UNRESERVED_KEYWORD},
- 	{"execute", EXECUTE, UNRESERVED_KEYWORD},
- 	{"exists", EXISTS, COL_NAME_KEYWORD},
- 	{"explain", EXPLAIN, UNRESERVED_KEYWORD},
- 	{"external", EXTERNAL, UNRESERVED_KEYWORD},
- 	{"extract", EXTRACT, COL_NAME_KEYWORD},
- 	{"false", FALSE_P, RESERVED_KEYWORD},
- 	{"family", FAMILY, UNRESERVED_KEYWORD},
- 	{"fetch", FETCH, RESERVED_KEYWORD},
- 	{"first", FIRST_P, UNRESERVED_KEYWORD},
- 	{"float", FLOAT_P, COL_NAME_KEYWORD},
- 	{"following", FOLLOWING, UNRESERVED_KEYWORD},
- 	{"for", FOR, RESERVED_KEYWORD},
- 	{"force", FORCE, UNRESERVED_KEYWORD},
- 	{"foreign", FOREIGN, RESERVED_KEYWORD},
- 	{"forward", FORWARD, UNRESERVED_KEYWORD},
- 	{"freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD},
- 	{"from", FROM, RESERVED_KEYWORD},
- 	{"full", FULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"function", FUNCTION, UNRESERVED_KEYWORD},
- 	{"global", GLOBAL, UNRESERVED_KEYWORD},
- 	{"grant", GRANT, RESERVED_KEYWORD},
- 	{"granted", GRANTED, UNRESERVED_KEYWORD},
- 	{"greatest", GREATEST, COL_NAME_KEYWORD},
- 	{"group", GROUP_P, RESERVED_KEYWORD},
- 	{"handler", HANDLER, UNRESERVED_KEYWORD},
- 	{"having", HAVING, RESERVED_KEYWORD},
- 	{"header", HEADER_P, UNRESERVED_KEYWORD},
- 	{"hold", HOLD, UNRESERVED_KEYWORD},
- 	{"hour", HOUR_P, UNRESERVED_KEYWORD},
- 	{"identity", IDENTITY_P, UNRESERVED_KEYWORD},
- 	{"if", IF_P, UNRESERVED_KEYWORD},
- 	{"ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD},
- 	{"immediate", IMMEDIATE, UNRESERVED_KEYWORD},
- 	{"immutable", IMMUTABLE, UNRESERVED_KEYWORD},
- 	{"implicit", IMPLICIT_P, UNRESERVED_KEYWORD},
- 	{"in", IN_P, RESERVED_KEYWORD},
- 	{"including", INCLUDING, UNRESERVED_KEYWORD},
- 	{"increment", INCREMENT, UNRESERVED_KEYWORD},
- 	{"index", INDEX, UNRESERVED_KEYWORD},
- 	{"indexes", INDEXES, UNRESERVED_KEYWORD},
- 	{"inherit", INHERIT, UNRESERVED_KEYWORD},
- 	{"inherits", INHERITS, UNRESERVED_KEYWORD},
- 	{"initially", INITIALLY, RESERVED_KEYWORD},
- 	{"inner", INNER_P, TYPE_FUNC_NAME_KEYWORD},
- 	{"inout", INOUT, COL_NAME_KEYWORD},
- 	{"input", INPUT_P, UNRESERVED_KEYWORD},
- 	{"insensitive", INSENSITIVE, UNRESERVED_KEYWORD},
- 	{"insert", INSERT, UNRESERVED_KEYWORD},
- 	{"instead", INSTEAD, UNRESERVED_KEYWORD},
- 	{"int", INT_P, COL_NAME_KEYWORD},
- 	{"integer", INTEGER, COL_NAME_KEYWORD},
- 	{"intersect", INTERSECT, RESERVED_KEYWORD},
- 	{"interval", INTERVAL, COL_NAME_KEYWORD},
- 	{"into", INTO, RESERVED_KEYWORD},
- 	{"invoker", INVOKER, UNRESERVED_KEYWORD},
- 	{"is", IS, TYPE_FUNC_NAME_KEYWORD},
- 	{"isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"isolation", ISOLATION, UNRESERVED_KEYWORD},
- 	{"join", JOIN, TYPE_FUNC_NAME_KEYWORD},
- 	{"key", KEY, UNRESERVED_KEYWORD},
- 	{"lancompiler", LANCOMPILER, UNRESERVED_KEYWORD},
- 	{"language", LANGUAGE, UNRESERVED_KEYWORD},
- 	{"large", LARGE_P, UNRESERVED_KEYWORD},
- 	{"last", LAST_P, UNRESERVED_KEYWORD},
- 	{"leading", LEADING, RESERVED_KEYWORD},
- 	{"least", LEAST, COL_NAME_KEYWORD},
- 	{"left", LEFT, TYPE_FUNC_NAME_KEYWORD},
- 	{"level", LEVEL, UNRESERVED_KEYWORD},
- 	{"like", LIKE, TYPE_FUNC_NAME_KEYWORD},
- 	{"limit", LIMIT, RESERVED_KEYWORD},
- 	{"listen", LISTEN, UNRESERVED_KEYWORD},
- 	{"load", LOAD, UNRESERVED_KEYWORD},
- 	{"local", LOCAL, UNRESERVED_KEYWORD},
- 	{"localtime", LOCALTIME, RESERVED_KEYWORD},
- 	{"localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD},
- 	{"location", LOCATION, UNRESERVED_KEYWORD},
- 	{"lock", LOCK_P, UNRESERVED_KEYWORD},
- 	{"login", LOGIN_P, UNRESERVED_KEYWORD},
- 	{"mapping", MAPPING, UNRESERVED_KEYWORD},
- 	{"match", MATCH, UNRESERVED_KEYWORD},
- 	{"maxvalue", MAXVALUE, UNRESERVED_KEYWORD},
- 	{"minute", MINUTE_P, UNRESERVED_KEYWORD},
- 	{"minvalue", MINVALUE, UNRESERVED_KEYWORD},
- 	{"mode", MODE, UNRESERVED_KEYWORD},
- 	{"month", MONTH_P, UNRESERVED_KEYWORD},
- 	{"move", MOVE, UNRESERVED_KEYWORD},
- 	{"name", NAME_P, UNRESERVED_KEYWORD},
- 	{"names", NAMES, UNRESERVED_KEYWORD},
- 	{"national", NATIONAL, COL_NAME_KEYWORD},
- 	{"natural", NATURAL, TYPE_FUNC_NAME_KEYWORD},
- 	{"nchar", NCHAR, COL_NAME_KEYWORD},
- 	{"new", NEW, RESERVED_KEYWORD},
- 	{"next", NEXT, UNRESERVED_KEYWORD},
- 	{"no", NO, UNRESERVED_KEYWORD},
- 	{"nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD},
- 	{"nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD},
- 	{"nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD},
- 	{"noinherit", NOINHERIT, UNRESERVED_KEYWORD},
- 	{"nologin", NOLOGIN_P, UNRESERVED_KEYWORD},
- 	{"none", NONE, COL_NAME_KEYWORD},
- 	{"nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD},
- 	{"not", NOT, RESERVED_KEYWORD},
- 	{"nothing", NOTHING, UNRESERVED_KEYWORD},
- 	{"notify", NOTIFY, UNRESERVED_KEYWORD},
- 	{"notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"nowait", NOWAIT, UNRESERVED_KEYWORD},
- 	{"null", NULL_P, RESERVED_KEYWORD},
- 	{"nullif", NULLIF, COL_NAME_KEYWORD},
- 	{"nulls", NULLS_P, UNRESERVED_KEYWORD},
- 	{"numeric", NUMERIC, COL_NAME_KEYWORD},
- 	{"object", OBJECT_P, UNRESERVED_KEYWORD},
- 	{"of", OF, UNRESERVED_KEYWORD},
- 	{"off", OFF, RESERVED_KEYWORD},
- 	{"offset", OFFSET, RESERVED_KEYWORD},
- 	{"oids", OIDS, UNRESERVED_KEYWORD},
- 	{"old", OLD, RESERVED_KEYWORD},
- 	{"on", ON, RESERVED_KEYWORD},
- 	{"only", ONLY, RESERVED_KEYWORD},
- 	{"operator", OPERATOR, UNRESERVED_KEYWORD},
- 	{"option", OPTION, UNRESERVED_KEYWORD},
- 	{"options", OPTIONS, UNRESERVED_KEYWORD},
- 	{"or", OR, RESERVED_KEYWORD},
- 	{"order", ORDER, RESERVED_KEYWORD},
- 	{"out", OUT_P, COL_NAME_KEYWORD},
- 	{"outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD},
- 	{"over", OVER, TYPE_FUNC_NAME_KEYWORD},
- 	{"overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD},
- 	{"overlay", OVERLAY, COL_NAME_KEYWORD},
- 	{"owned", OWNED, UNRESERVED_KEYWORD},
- 	{"owner", OWNER, UNRESERVED_KEYWORD},
- 	{"parser", PARSER, UNRESERVED_KEYWORD},
- 	{"partial", PARTIAL, UNRESERVED_KEYWORD},
- 	{"partition", PARTITION, UNRESERVED_KEYWORD},
- 	{"password", PASSWORD, UNRESERVED_KEYWORD},
- 	{"placing", PLACING, RESERVED_KEYWORD},
- 	{"plans", PLANS, UNRESERVED_KEYWORD},
- 	{"position", POSITION, COL_NAME_KEYWORD},
- 	{"preceding", PRECEDING, UNRESERVED_KEYWORD},
- 	{"precision", PRECISION, COL_NAME_KEYWORD},
- 	{"prepare", PREPARE, UNRESERVED_KEYWORD},
- 	{"prepared", PREPARED, UNRESERVED_KEYWORD},
- 	{"preserve", PRESERVE, UNRESERVED_KEYWORD},
- 	{"primary", PRIMARY, RESERVED_KEYWORD},
- 	{"prior", PRIOR, UNRESERVED_KEYWORD},
- 	{"privileges", PRIVILEGES, UNRESERVED_KEYWORD},
- 	{"procedural", PROCEDURAL, UNRESERVED_KEYWORD},
- 	{"procedure", PROCEDURE, UNRESERVED_KEYWORD},
- 	{"quote", QUOTE, UNRESERVED_KEYWORD},
- 	{"range", RANGE, UNRESERVED_KEYWORD},
- 	{"read", READ, UNRESERVED_KEYWORD},
- 	{"real", REAL, COL_NAME_KEYWORD},
- 	{"reassign", REASSIGN, UNRESERVED_KEYWORD},
- 	{"recheck", RECHECK, UNRESERVED_KEYWORD},
- 	{"recursive", RECURSIVE, UNRESERVED_KEYWORD},
- 	{"references", REFERENCES, RESERVED_KEYWORD},
- 	{"reindex", REINDEX, UNRESERVED_KEYWORD},
- 	{"relative", RELATIVE_P, UNRESERVED_KEYWORD},
- 	{"release", RELEASE, UNRESERVED_KEYWORD},
- 	{"rename", RENAME, UNRESERVED_KEYWORD},
- 	{"repeatable", REPEATABLE, UNRESERVED_KEYWORD},
- 	{"replace", REPLACE, UNRESERVED_KEYWORD},
- 	{"replica", REPLICA, UNRESERVED_KEYWORD},
- 	{"reset", RESET, UNRESERVED_KEYWORD},
- 	{"restart", RESTART, UNRESERVED_KEYWORD},
- 	{"restrict", RESTRICT, UNRESERVED_KEYWORD},
- 	{"returning", RETURNING, RESERVED_KEYWORD},
- 	{"returns", RETURNS, UNRESERVED_KEYWORD},
- 	{"revoke", REVOKE, UNRESERVED_KEYWORD},
- 	{"right", RIGHT, TYPE_FUNC_NAME_KEYWORD},
- 	{"role", ROLE, UNRESERVED_KEYWORD},
- 	{"rollback", ROLLBACK, UNRESERVED_KEYWORD},
- 	{"row", ROW, COL_NAME_KEYWORD},
- 	{"rows", ROWS, UNRESERVED_KEYWORD},
- 	{"rule", RULE, UNRESERVED_KEYWORD},
- 	{"savepoint", SAVEPOINT, UNRESERVED_KEYWORD},
- 	{"schema", SCHEMA, UNRESERVED_KEYWORD},
- 	{"scroll", SCROLL, UNRESERVED_KEYWORD},
- 	{"search", SEARCH, UNRESERVED_KEYWORD},
- 	{"second", SECOND_P, UNRESERVED_KEYWORD},
- 	{"security", SECURITY, UNRESERVED_KEYWORD},
- 	{"select", SELECT, RESERVED_KEYWORD},
- 	{"sequence", SEQUENCE, UNRESERVED_KEYWORD},
- 	{"serializable", SERIALIZABLE, UNRESERVED_KEYWORD},
- 	{"server", SERVER, UNRESERVED_KEYWORD},
- 	{"session", SESSION, UNRESERVED_KEYWORD},
- 	{"session_user", SESSION_USER, RESERVED_KEYWORD},
- 	{"set", SET, UNRESERVED_KEYWORD},
- 	{"setof", SETOF, COL_NAME_KEYWORD},
- 	{"share", SHARE, UNRESERVED_KEYWORD},
- 	{"show", SHOW, UNRESERVED_KEYWORD},
- 	{"similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD},
- 	{"simple", SIMPLE, UNRESERVED_KEYWORD},
- 	{"smallint", SMALLINT, COL_NAME_KEYWORD},
- 	{"some", SOME, RESERVED_KEYWORD},
- 	{"stable", STABLE, UNRESERVED_KEYWORD},
- 	{"standalone", STANDALONE_P, UNRESERVED_KEYWORD},
- 	{"start", START, UNRESERVED_KEYWORD},
- 	{"statement", STATEMENT, UNRESERVED_KEYWORD},
- 	{"statistics", STATISTICS, UNRESERVED_KEYWORD},
- 	{"stdin", STDIN, UNRESERVED_KEYWORD},
- 	{"stdout", STDOUT, UNRESERVED_KEYWORD},
- 	{"storage", STORAGE, UNRESERVED_KEYWORD},
- 	{"strict", STRICT_P, UNRESERVED_KEYWORD},
- 	{"strip", STRIP_P, UNRESERVED_KEYWORD},
- 	{"substring", SUBSTRING, COL_NAME_KEYWORD},
- 	{"superuser", SUPERUSER_P, UNRESERVED_KEYWORD},
- 	{"symmetric", SYMMETRIC, RESERVED_KEYWORD},
- 	{"sysid", SYSID, UNRESERVED_KEYWORD},
- 	{"system", SYSTEM_P, UNRESERVED_KEYWORD},
- 	{"table", TABLE, RESERVED_KEYWORD},
- 	{"tablespace", TABLESPACE, UNRESERVED_KEYWORD},
- 	{"temp", TEMP, UNRESERVED_KEYWORD},
- 	{"template", TEMPLATE, UNRESERVED_KEYWORD},
- 	{"temporary", TEMPORARY, UNRESERVED_KEYWORD},
- 	{"text", TEXT_P, UNRESERVED_KEYWORD},
- 	{"then", THEN, RESERVED_KEYWORD},
- 	{"time", TIME, COL_NAME_KEYWORD},
- 	{"timestamp", TIMESTAMP, COL_NAME_KEYWORD},
- 	{"to", TO, RESERVED_KEYWORD},
- 	{"trailing", TRAILING, RESERVED_KEYWORD},
- 	{"transaction", TRANSACTION, UNRESERVED_KEYWORD},
- 	{"treat", TREAT, COL_NAME_KEYWORD},
- 	{"trigger", TRIGGER, UNRESERVED_KEYWORD},
- 	{"trim", TRIM, COL_NAME_KEYWORD},
- 	{"true", TRUE_P, RESERVED_KEYWORD},
- 	{"truncate", TRUNCATE, UNRESERVED_KEYWORD},
- 	{"trusted", TRUSTED, UNRESERVED_KEYWORD},
- 	{"type", TYPE_P, UNRESERVED_KEYWORD},
- 	{"unbounded", UNBOUNDED, UNRESERVED_KEYWORD},
- 	{"uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD},
- 	{"unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD},
- 	{"union", UNION, RESERVED_KEYWORD},
- 	{"unique", UNIQUE, RESERVED_KEYWORD},
- 	{"unknown", UNKNOWN, UNRESERVED_KEYWORD},
- 	{"unlisten", UNLISTEN, UNRESERVED_KEYWORD},
- 	{"until", UNTIL, UNRESERVED_KEYWORD},
- 	{"update", UPDATE, UNRESERVED_KEYWORD},
- 	{"user", USER, RESERVED_KEYWORD},
- 	{"using", USING, RESERVED_KEYWORD},
- 	{"vacuum", VACUUM, UNRESERVED_KEYWORD},
- 	{"valid", VALID, UNRESERVED_KEYWORD},
- 	{"validator", VALIDATOR, UNRESERVED_KEYWORD},
- 	{"value", VALUE_P, UNRESERVED_KEYWORD},
- 	{"values", VALUES, COL_NAME_KEYWORD},
- 	{"varchar", VARCHAR, COL_NAME_KEYWORD},
- 	{"variadic", VARIADIC, RESERVED_KEYWORD},
- 	{"varying", VARYING, UNRESERVED_KEYWORD},
- 	{"verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD},
- 	{"version", VERSION_P, UNRESERVED_KEYWORD},
- 	{"view", VIEW, UNRESERVED_KEYWORD},
- 	{"volatile", VOLATILE, UNRESERVED_KEYWORD},
- 	{"when", WHEN, RESERVED_KEYWORD},
- 	{"where", WHERE, RESERVED_KEYWORD},
- 	{"whitespace", WHITESPACE_P, UNRESERVED_KEYWORD},
- 	{"window", WINDOW, RESERVED_KEYWORD},
- 	{"with", WITH, RESERVED_KEYWORD},
- 	{"without", WITHOUT, UNRESERVED_KEYWORD},
- 	{"work", WORK, UNRESERVED_KEYWORD},
- 	{"wrapper", WRAPPER, UNRESERVED_KEYWORD},
- 	{"write", WRITE, UNRESERVED_KEYWORD},
- 	{"xml", XML_P, UNRESERVED_KEYWORD},
- 	{"xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD},
- 	{"xmlconcat", XMLCONCAT, COL_NAME_KEYWORD},
- 	{"xmlelement", XMLELEMENT, COL_NAME_KEYWORD},
- 	{"xmlforest", XMLFOREST, COL_NAME_KEYWORD},
- 	{"xmlparse", XMLPARSE, COL_NAME_KEYWORD},
- 	{"xmlpi", XMLPI, COL_NAME_KEYWORD},
- 	{"xmlroot", XMLROOT, COL_NAME_KEYWORD},
- 	{"xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD},
- 	{"year", YEAR_P, UNRESERVED_KEYWORD},
- 	{"yes", YES_P, 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
-  *
-  * Returns a pointer to the ScanKeyword table entry, or NULL if no match.
-  *
-  * The match is done case-insensitively.  Note that we deliberately use a
-  * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',
-  * even if we are in a locale where tolower() would produce more or different
-  * translations.  This is to conform to the SQL99 spec, which says that
-  * keywords are to be matched in this way even though non-keyword identifiers
-  * receive a different case-normalization mapping.
-  */
- const ScanKeyword *
- ScanKeywordLookup(const char *text)
- {
- 	int			len,
- 				i;
- 	char		word[NAMEDATALEN];
- 	const ScanKeyword *low;
- 	const ScanKeyword *high;
- 
- 	len = strlen(text);
- 	/* We assume all keywords are shorter than NAMEDATALEN. */
- 	if (len >= NAMEDATALEN)
- 		return NULL;
- 
- 	/*
- 	 * Apply an ASCII-only downcasing.	We must not use tolower() since it may
- 	 * produce the wrong translation in some locales (eg, Turkish).
- 	 */
- 	for (i = 0; i < len; i++)
- 	{
- 		char		ch = text[i];
- 
- 		if (ch >= 'A' && ch <= 'Z')
- 			ch += 'a' - 'A';
- 		word[i] = ch;
- 	}
- 	word[len] = '\0';
- 
- 	/*
- 	 * Now do a binary search using plain strcmp() comparison.
- 	 */
- 	low = &ScanKeywords[0];
- 	high = endof(ScanKeywords) - 1;
- 	while (low <= high)
- 	{
- 		const ScanKeyword *middle;
- 		int			difference;
  
! 		middle = low + (high - low) / 2;
! 		difference = strcmp(middle->name, word);
! 		if (difference == 0)
! 			return middle;
! 		else if (difference < 0)
! 			low = middle + 1;
! 		else
! 			high = middle - 1;
! 	}
  
! 	return NULL;
! }
--- 13,25 ----
   *
   *-------------------------------------------------------------------------
   */
+ #include "postgres.h"
  
! #include "nodes/nodes.h"
! #include "nodes/parsenodes.h"
  #include "parser/keywords.h"
  #include "parser/gram.h"
  
! #define PG_KEYWORD(a,b,c) {a,b,c}
  
! #include "parser/kwlist.h"
Index: src/backend/parser/kwlookup.c
===================================================================
RCS file: src/backend/parser/kwlookup.c
diff -N src/backend/parser/kwlookup.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/backend/parser/kwlookup.c	4 Mar 2009 15:42:33 -0000
***************
*** 0 ****
--- 1,86 ----
+ /*-------------------------------------------------------------------------
+  *
+  * kwlookup.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  * NB - this file is used by pg_dump and ECPG
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ 
+ /* use c.h so this can be built as either frontend or backend */
+ #include "c.h"
+ 
+ #include <ctype.h>
+ 
+ #include "parser/keywords.h"
+ 
+ /*
+  * ScanKeywordLookup - see if a given word is a keyword
+  *
+  * Returns a pointer to the ScanKeyword table entry, or NULL if no match.
+  *
+  * The match is done case-insensitively.  Note that we deliberately use a
+  * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',
+  * even if we are in a locale where tolower() would produce more or different
+  * translations.  This is to conform to the SQL99 spec, which says that
+  * keywords are to be matched in this way even though non-keyword identifiers
+  * receive a different case-normalization mapping.
+  */
+ const ScanKeyword *
+ ScanKeywordLookup(const char *text)
+ {
+ 	int			len,
+ 				i;
+ 	char		word[NAMEDATALEN];
+ 	const ScanKeyword *low;
+ 	const ScanKeyword *high;
+ 
+ 	len = strlen(text);
+ 	/* We assume all keywords are shorter than NAMEDATALEN. */
+ 	if (len >= NAMEDATALEN)
+ 		return NULL;
+ 
+ 	/*
+ 	 * Apply an ASCII-only downcasing.	We must not use tolower() since it may
+ 	 * produce the wrong translation in some locales (eg, Turkish).
+ 	 */
+ 	for (i = 0; i < len; i++)
+ 	{
+ 		char		ch = text[i];
+ 
+ 		if (ch >= 'A' && ch <= 'Z')
+ 			ch += 'a' - 'A';
+ 		word[i] = ch;
+ 	}
+ 	word[len] = '\0';
+ 
+ 	/*
+ 	 * Now do a binary search using plain strcmp() comparison.
+ 	 */
+ 	low = &ScanKeywords[0];
+ 	high = LastScanKeyword - 1;
+ 	while (low <= high)
+ 	{
+ 		const ScanKeyword *middle;
+ 		int			difference;
+ 
+ 		middle = low + (high - low) / 2;
+ 		difference = strcmp(middle->name, word);
+ 		if (difference == 0)
+ 			return middle;
+ 		else if (difference < 0)
+ 			low = middle + 1;
+ 		else
+ 			high = middle - 1;
+ 	}
+ 
+ 	return NULL;
+ }
Index: src/bin/pg_dump/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/bin/pg_dump/Makefile,v
retrieving revision 1.66
diff -c -p -r1.66 Makefile
*** src/bin/pg_dump/Makefile	1 Jan 2009 17:23:54 -0000	1.66
--- src/bin/pg_dump/Makefile	4 Mar 2009 15:25:11 -0000
*************** OBJS=	pg_backup_archiver.o pg_backup_db.
*** 20,42 ****
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
  	dumputils.o $(WIN32RES)
  
! EXTRA_OBJS = $(top_builddir)/src/backend/parser/keywords.o
  
! all: submake-libpq submake-libpgport submake-backend pg_dump pg_restore pg_dumpall
  
  pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(EXTRA_OBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
! 
! .PHONY: submake-backend
! submake-backend:
! 	$(MAKE) -C $(top_builddir)/src/backend/parser keywords.o
! 
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
--- 20,40 ----
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
  	dumputils.o $(WIN32RES)
  
! KEYWRDOBJS = keywords.o kwlookup.o
  
! kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
! 	rm -f $@ && $(LN_S) $< .
! 
! all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall
  
  pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
*************** uninstall:
*** 50,53 ****
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o
--- 48,51 ----
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o kwlookup.c $(KEYWRDOBJS)
Index: src/bin/pg_dump/keywords.c
===================================================================
RCS file: src/bin/pg_dump/keywords.c
diff -N src/bin/pg_dump/keywords.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/bin/pg_dump/keywords.c	4 Mar 2009 16:08:22 -0000
***************
*** 0 ****
--- 1,34 ----
+ /*-------------------------------------------------------------------------
+  *
+  * keywords.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ #include "postgres_fe.h"
+ 
+ /*
+  * This macro definition overrides the YYSTYPE union definition in gram.h.
+  * We don't need that struct in this file, and including the real definition
+  * would require sucking in some backend-only include files.
+  */
+ #define YYSTYPE int
+ 
+ #include "parser/keywords.h"
+ 
+ /*
+  * We don't need the token number, so leave it out to avoid requiring extra 
+  * object files from the backend.
+  */
+ #define PG_KEYWORD(a,b,c) {a,c}
+ #define TWO_MEMBER_SCANKEYWORD
+ 
+ #include "parser/kwlist.h"
Index: src/include/parser/keywords.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/parser/keywords.h,v
retrieving revision 1.26
diff -c -p -r1.26 keywords.h
*** src/include/parser/keywords.h	1 Jan 2009 17:24:00 -0000	1.26
--- src/include/parser/keywords.h	4 Mar 2009 15:58:10 -0000
***************
*** 24,30 ****
--- 24,32 ----
  typedef struct ScanKeyword
  {
  	const char *name;			/* in lower case */
+ #ifndef TWO_MEMBER_SCANKEYWORD
  	int16		value;			/* grammar's token code */
+ #endif
  	int16		category;		/* see codes above */
  } ScanKeyword;
  
Index: src/include/parser/kwlist.h
===================================================================
RCS file: src/include/parser/kwlist.h
diff -N src/include/parser/kwlist.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/include/parser/kwlist.h	4 Mar 2009 15:55:55 -0000
***************
*** 0 ****
--- 1,426 ----
+ /*-------------------------------------------------------------------------
+  *
+  * kwlist.h
+  *	  keyword list definitions for PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ #ifndef KWLIST_H
+ #define KWLIST_H
+ 
+ #include "parser/keywords.h"
+ 
+ 
+ /*
+  * List of keyword (name, token-value, category) entries.
+  *
+  * !!WARNING!!: This list must be sorted by ASCII name, because binary
+  *		 search is used to locate entries.
+  */
+ const ScanKeyword ScanKeywords[] = {
+ 	/* name, value, category */
+ 	PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("add", ADD_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("admin", ADMIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("after", AFTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("aggregate", AGGREGATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("all", ALL, RESERVED_KEYWORD),
+ 	PG_KEYWORD("also", ALSO, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("alter", ALTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("always", ALWAYS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("analyse", ANALYSE, RESERVED_KEYWORD),		/* British spelling */
+ 	PG_KEYWORD("analyze", ANALYZE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("and", AND, RESERVED_KEYWORD),
+ 	PG_KEYWORD("any", ANY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("array", ARRAY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("as", AS, RESERVED_KEYWORD),
+ 	PG_KEYWORD("asc", ASC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("assertion", ASSERTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("assignment", ASSIGNMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("at", AT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("between", BETWEEN, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("bigint", BIGINT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("binary", BINARY, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("bit", BIT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("both", BOTH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("by", BY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cascaded", CASCADED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("case", CASE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("cast", CAST, RESERVED_KEYWORD),
+ 	PG_KEYWORD("catalog", CATALOG_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("chain", CHAIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("char", CHAR_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("character", CHARACTER, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("check", CHECK, RESERVED_KEYWORD),
+ 	PG_KEYWORD("checkpoint", CHECKPOINT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("class", CLASS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("close", CLOSE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cluster", CLUSTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("coalesce", COALESCE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("collate", COLLATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("column", COLUMN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("comment", COMMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("concurrently", CONCURRENTLY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("content", CONTENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("continue", CONTINUE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("conversion", CONVERSION_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("copy", COPY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cost", COST, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("create", CREATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("createdb", CREATEDB, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("createrole", CREATEROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("createuser", CREATEUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("ctype", CTYPE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("decimal", DECIMAL_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("declare", DECLARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("default", DEFAULT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("defaults", DEFAULTS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("deferrable", DEFERRABLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("deferred", DEFERRED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("definer", DEFINER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delete", DELETE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delimiter", DELIMITER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delimiters", DELIMITERS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("desc", DESC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("dictionary", DICTIONARY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("do", DO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("else", ELSE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("end", END_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("exists", EXISTS, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("explain", EXPLAIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("for", FOR, RESERVED_KEYWORD),
+ 	PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("from", FROM, RESERVED_KEYWORD),
+ 	PG_KEYWORD("full", FULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("function", FUNCTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("global", GLOBAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("grant", GRANT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("granted", GRANTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("greatest", GREATEST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("group", GROUP_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("handler", HANDLER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("having", HAVING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("implicit", IMPLICIT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("in", IN_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("including", INCLUDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("increment", INCREMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("index", INDEX, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("indexes", INDEXES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("inherit", INHERIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("inherits", INHERITS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("initially", INITIALLY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("inner", INNER_P, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("inout", INOUT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("input", INPUT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("insensitive", INSENSITIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("insert", INSERT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("instead", INSTEAD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("int", INT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("integer", INTEGER, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("intersect", INTERSECT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("interval", INTERVAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("into", INTO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("invoker", INVOKER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("lancompiler", LANCOMPILER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("level", LEVEL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("like", LIKE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("listen", LISTEN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("load", LOAD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("local", LOCAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("localtime", LOCALTIME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD),
+ 	PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("login", LOGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("new", NEW, RESERVED_KEYWORD),
+ 	PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("no", NO, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("noinherit", NOINHERIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nologin", NOLOGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("none", NONE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("not", NOT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("nothing", NOTHING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("notify", NOTIFY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("nowait", NOWAIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("of", OF, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("off", OFF, RESERVED_KEYWORD),
+ 	PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD),
+ 	PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("old", OLD, RESERVED_KEYWORD),
+ 	PG_KEYWORD("on", ON, RESERVED_KEYWORD),
+ 	PG_KEYWORD("only", ONLY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("option", OPTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("options", OPTIONS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("or", OR, RESERVED_KEYWORD),
+ 	PG_KEYWORD("order", ORDER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("over", OVER, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("preceding", PRECEDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("precision", PRECISION, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("prepare", PREPARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("prepared", PREPARED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("preserve", PRESERVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("primary", PRIMARY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("prior", PRIOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("privileges", PRIVILEGES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("procedural", PROCEDURAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("procedure", PROCEDURE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("read", READ, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("real", REAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("reassign", REASSIGN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("recheck", RECHECK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("recursive", RECURSIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("references", REFERENCES, RESERVED_KEYWORD),
+ 	PG_KEYWORD("reindex", REINDEX, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("relative", RELATIVE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("release", RELEASE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rename", RENAME, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("repeatable", REPEATABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("replace", REPLACE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("replica", REPLICA, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("reset", RESET, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("restart", RESTART, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("restrict", RESTRICT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("returning", RETURNING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("returns", RETURNS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("revoke", REVOKE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("right", RIGHT, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("role", ROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rollback", ROLLBACK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("row", ROW, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("search", SEARCH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("second", SECOND_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("security", SECURITY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("select", SELECT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("sequence", SEQUENCE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("serializable", SERIALIZABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("server", SERVER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("session", SESSION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("session_user", SESSION_USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("set", SET, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("setof", SETOF, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("share", SHARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("show", SHOW, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("simple", SIMPLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("some", SOME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("start", START, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("statement", STATEMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("statistics", STATISTICS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("stdin", STDIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("superuser", SUPERUSER_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("table", TABLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("then", THEN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("time", TIME, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("to", TO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("transaction", TRANSACTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("treat", TREAT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("trigger", TRIGGER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("trim", TRIM, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("union", UNION, RESERVED_KEYWORD),
+ 	PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("unknown", UNKNOWN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unlisten", UNLISTEN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("until", UNTIL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("user", USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("using", USING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("vacuum", VACUUM, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("valid", VALID, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("validator", VALIDATOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("value", VALUE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("values", VALUES, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("varchar", VARCHAR, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("variadic", VARIADIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("varying", VARYING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("when", WHEN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("where", WHERE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("window", WINDOW, RESERVED_KEYWORD),
+ 	PG_KEYWORD("with", WITH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("without", WITHOUT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlelement", XMLELEMENT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlforest", XMLFOREST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlparse", XMLPARSE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlpi", XMLPI, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlroot", XMLROOT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("year", YEAR_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("yes", YES_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("zone", ZONE, UNRESERVED_KEYWORD),
+ };
+ 
+ /* End of ScanKeywords, for use elsewhere */
+ const ScanKeyword *LastScanKeyword = endof(ScanKeywords);
+ 
+ #endif /* KWLIST_H */
Index: src/interfaces/ecpg/preproc/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/interfaces/ecpg/preproc/Makefile,v
retrieving revision 1.141
diff -c -p -r1.141 Makefile
*** src/interfaces/ecpg/preproc/Makefile	1 Jan 2009 17:24:02 -0000	1.141
--- src/interfaces/ecpg/preproc/Makefile	4 Mar 2009 15:46:40 -0000
*************** override CPPFLAGS := -I../include -I$(to
*** 25,31 ****
  override CFLAGS += $(PTHREAD_CFLAGS) -DECPG_COMPILE
  
  OBJS=	preproc.o type.o ecpg.o output.o parser.o \
! 	keywords.o c_keywords.o ecpg_keywords.o ../ecpglib/typename.o descriptor.o variable.o \
  	$(WIN32RES)
  
  all: submake-libpgport ecpg
--- 25,31 ----
  override CFLAGS += $(PTHREAD_CFLAGS) -DECPG_COMPILE
  
  OBJS=	preproc.o type.o ecpg.o output.o parser.o \
! 	keywords.o c_keywords.o ecpg_keywords.o kwlookup.o ../ecpglib/typename.o descriptor.o variable.o \
  	$(WIN32RES)
  
  all: submake-libpgport ecpg
*************** $(srcdir)/preproc.y: $(top_srcdir)/src/b
*** 57,64 ****
  
  ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
  
! # instead of maintaining our own list, take the one from the backend
! keywords.c: % : $(top_srcdir)/src/backend/parser/%
  	rm -f $@ && $(LN_S) $< .
  
  distprep: $(srcdir)/preproc.y $(srcdir)/preproc.c $(srcdir)/preproc.h $(srcdir)/pgc.c
--- 57,63 ----
  
  ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
  
! kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
  	rm -f $@ && $(LN_S) $< .
  
  distprep: $(srcdir)/preproc.y $(srcdir)/preproc.c $(srcdir)/preproc.h $(srcdir)/pgc.c
*************** uninstall:
*** 73,79 ****
  	rm -f '$(DESTDIR)$(bindir)/ecpg$(X)'
  
  clean distclean:
! 	rm -f keywords.c *.o ecpg$(X)
  # garbage from development
  	@rm -f core a.out
  
--- 72,78 ----
  	rm -f '$(DESTDIR)$(bindir)/ecpg$(X)'
  
  clean distclean:
! 	rm -f kwlookup.c *.o ecpg$(X)
  # garbage from development
  	@rm -f core a.out
  
Index: src/interfaces/ecpg/preproc/keywords.c
===================================================================
RCS file: src/interfaces/ecpg/preproc/keywords.c
diff -N src/interfaces/ecpg/preproc/keywords.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/interfaces/ecpg/preproc/keywords.c	4 Mar 2009 16:01:36 -0000
***************
*** 0 ****
--- 1,30 ----
+ /*-------------------------------------------------------------------------
+  *
+  * keywords.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.210 2009-02-24 10:06:33 petere Exp $
+  *
+  *-------------------------------------------------------------------------
+  */
+ #include "postgres_fe.h"
+ 
+ /*
+  * This macro definition overrides the YYSTYPE union definition in gram.h.
+  * We don't need that struct in this file, and including the real definition
+  * would require sucking in some backend-only include files.
+  */
+ #define YYSTYPE int
+ 
+ #include "parser/keywords.h"
+ #include "preproc.h"
+ 
+ #define PG_KEYWORD(a,b,c) {a,b,c}
+ 
+ #include "parser/kwlist.h"
#11Alvaro Herrera
alvherre@commandprompt.com
In reply to: Alvaro Herrera (#10)
1 attachment(s)
Re: building pg_dump doesn't work

Alvaro Herrera wrote:

Alvaro Herrera wrote:

Tom Lane wrote:

What I'd suggest is something similar to the design of the errcodes.h
header: create a header file containing just the list of PG_KEYWORD
macro calls, and have the different users #include it after defining
that macro appropriately. Having .c files include other .c files is
usually best avoided on least-surprise grounds.

Seems doable.

Attached.

Minor fixes over the previous patch.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Attachments:

ttext/plain; charset=us-asciiDownload
diff -u src/bin/pg_dump/Makefile src/bin/pg_dump/Makefile
--- src/bin/pg_dump/Makefile	4 Mar 2009 15:25:11 -0000
+++ src/bin/pg_dump/Makefile	4 Mar 2009 17:02:19 -0000
@@ -27,13 +27,13 @@
 
 all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall
 
-pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
+pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a 
 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
 
-pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
+pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
 	$(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
 
-pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
+pg_dumpall: pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
 
 install: all installdirs
diff -u src/bin/pg_dump/keywords.c src/bin/pg_dump/keywords.c
--- src/bin/pg_dump/keywords.c	4 Mar 2009 16:08:22 -0000
+++ src/bin/pg_dump/keywords.c	4 Mar 2009 17:03:08 -0000
@@ -15,18 +15,11 @@
  */
 #include "postgres_fe.h"
 
-/*
- * This macro definition overrides the YYSTYPE union definition in gram.h.
- * We don't need that struct in this file, and including the real definition
- * would require sucking in some backend-only include files.
- */
-#define YYSTYPE int
-
 #include "parser/keywords.h"
 
 /*
- * We don't need the token number, so leave it out to avoid requiring extra 
- * object files from the backend.
+ * We don't need the token number, so leave it out to avoid requiring other 
+ * backend headers.
  */
 #define PG_KEYWORD(a,b,c) {a,c}
 #define TWO_MEMBER_SCANKEYWORD
only in patch2:
unchanged:
--- src/backend/parser/gram.y	24 Feb 2009 10:06:33 -0000	2.659
+++ src/backend/parser/gram.y	4 Mar 2009 17:04:39 -0000
@@ -423,7 +423,7 @@ static TypeName *TableFuncTypeName(List 
 
 /*
  * If you make any token changes, update the keyword table in
- * parser/keywords.c and add new keywords to the appropriate one of
+ * src/include/parser/kwlist.h and add new keywords to the appropriate one of
  * the reserved-or-not-so-reserved keyword lists, below; search
  * this file for "Name classification hierarchy".
  */
@@ -516,7 +516,7 @@ static TypeName *TableFuncTypeName(List 
 
 	ZONE
 
-/* The grammar thinks these are keywords, but they are not in the keywords.c
+/* The grammar thinks these are keywords, but they are not in the kwlist.h
  * list and so can never be entered directly.  The filter in parser.c
  * creates these tokens when required.
  */
#12Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#10)
Re: building pg_dump doesn't work

Alvaro Herrera <alvherre@commandprompt.com> writes:

Seems doable.

Attached.

The TWO_MEMBER_SCANKEYWORD business seems a bit dangerous --- if the
header file is read without having #defined that correctly, bad things
will happen. It might be better to leave that out, always define the
struct the same, and just have pg_dump define PG_KEYWORD to fill the
value field with zero. Given alignment considerations, you're not
saving any space by omitting the field anyhow.

regards, tom lane

#13Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Tom Lane (#3)
Re: building pg_dump doesn't work

Dne 3.03.09 22:55, Tom Lane napsal(a):

One idea that comes to mind is to replace the entries like

{"abort", ABORT_P, UNRESERVED_KEYWORD},

with macro calls

PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),

and then the frontend build of the file could define the macro
to ignore its second argument.

It sounds good.

The way we do it now seems to have other disadvantages too: we are
incorporating a backend .o file into pg_dump as-is, which would lead
to large problems if there were differences in say the compiler flags
needed. In fact, I thought Zdenek had been working on decoupling
that sort of thing, so I'm a bit surprised it's still like this at all.

Yeah, it is still on my TODO list. There is still problem with
pg_resetxlog which needs lot of internals headers. :(

Zdenek

#14Alvaro Herrera
alvherre@commandprompt.com
In reply to: Tom Lane (#12)
1 attachment(s)
Re: building pg_dump doesn't work

Tom Lane wrote:

Alvaro Herrera <alvherre@commandprompt.com> writes:

Seems doable.

Attached.

The TWO_MEMBER_SCANKEYWORD business seems a bit dangerous --- if the
header file is read without having #defined that correctly, bad things
will happen. It might be better to leave that out, always define the
struct the same, and just have pg_dump define PG_KEYWORD to fill the
value field with zero. Given alignment considerations, you're not
saving any space by omitting the field anyhow.

Fixed.

I also added #include type.h to the ecpg keywords.c file, which means we
don't need to redefine YYSTYPE at all on any of the three keywords.c
file. Looks cleaner overall.

Hopefully this is the last version of this patch.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Attachments:

pgdump-parser-dep-4.patchtext/x-diff; charset=us-asciiDownload
Index: src/backend/parser/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/Makefile,v
retrieving revision 1.48
diff -c -p -r1.48 Makefile
*** src/backend/parser/Makefile	4 Oct 2008 21:56:54 -0000	1.48
--- src/backend/parser/Makefile	4 Mar 2009 15:32:52 -0000
*************** override CPPFLAGS := -I$(srcdir) $(CPPFL
*** 14,20 ****
  
  OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_cte.o parse_clause.o \
        parse_expr.o parse_func.o parse_node.o parse_oper.o parse_relation.o \
!       parse_type.o parse_coerce.o parse_target.o parse_utilcmd.o scansup.o
  
  FLEXFLAGS = -CF
  
--- 14,20 ----
  
  OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_cte.o parse_clause.o \
        parse_expr.o parse_func.o parse_node.o parse_oper.o parse_relation.o \
!       parse_type.o parse_coerce.o parse_target.o parse_utilcmd.o scansup.o kwlookup.o
  
  FLEXFLAGS = -CF
  
Index: src/backend/parser/gram.y
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.659
diff -c -p -r2.659 gram.y
*** src/backend/parser/gram.y	24 Feb 2009 10:06:33 -0000	2.659
--- src/backend/parser/gram.y	4 Mar 2009 17:04:39 -0000
*************** static TypeName *TableFuncTypeName(List 
*** 423,429 ****
  
  /*
   * If you make any token changes, update the keyword table in
!  * parser/keywords.c and add new keywords to the appropriate one of
   * the reserved-or-not-so-reserved keyword lists, below; search
   * this file for "Name classification hierarchy".
   */
--- 423,429 ----
  
  /*
   * If you make any token changes, update the keyword table in
!  * src/include/parser/kwlist.h and add new keywords to the appropriate one of
   * the reserved-or-not-so-reserved keyword lists, below; search
   * this file for "Name classification hierarchy".
   */
*************** static TypeName *TableFuncTypeName(List 
*** 516,522 ****
  
  	ZONE
  
! /* The grammar thinks these are keywords, but they are not in the keywords.c
   * list and so can never be entered directly.  The filter in parser.c
   * creates these tokens when required.
   */
--- 516,522 ----
  
  	ZONE
  
! /* The grammar thinks these are keywords, but they are not in the kwlist.h
   * list and so can never be entered directly.  The filter in parser.c
   * creates these tokens when required.
   */
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.210
diff -c -p -r1.210 keywords.c
*** src/backend/parser/keywords.c	24 Feb 2009 10:06:33 -0000	1.210
--- src/backend/parser/keywords.c	4 Mar 2009 15:56:35 -0000
***************
*** 3,10 ****
   * keywords.c
   *	  lexical token lookup for key words in PostgreSQL
   *
-  * NB: This file is also used by pg_dump.
-  *
   *
   * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
   * Portions Copyright (c) 1994, Regents of the University of California
--- 3,8 ----
***************
*** 15,503 ****
   *
   *-------------------------------------------------------------------------
   */
  
! /* Use c.h so that this file can be built in either frontend or backend */
! #include "c.h"
! 
! #include <ctype.h>
! 
! /*
!  * This macro definition overrides the YYSTYPE union definition in gram.h.
!  * We don't need that struct in this file, and including the real definition
!  * would require sucking in some backend-only include files.
!  */
! #define YYSTYPE int
! 
  #include "parser/keywords.h"
- #ifndef ECPG_COMPILE
  #include "parser/gram.h"
- #else
- #include "preproc.h"
- #endif
- 
- /*
-  * List of keyword (name, token-value, category) entries.
-  *
-  * !!WARNING!!: This list must be sorted by ASCII name, because binary
-  *		 search is used to locate entries.
-  */
- const ScanKeyword ScanKeywords[] = {
- 	/* name, value, category */
- 	{"abort", ABORT_P, UNRESERVED_KEYWORD},
- 	{"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD},
- 	{"access", ACCESS, UNRESERVED_KEYWORD},
- 	{"action", ACTION, UNRESERVED_KEYWORD},
- 	{"add", ADD_P, UNRESERVED_KEYWORD},
- 	{"admin", ADMIN, UNRESERVED_KEYWORD},
- 	{"after", AFTER, UNRESERVED_KEYWORD},
- 	{"aggregate", AGGREGATE, UNRESERVED_KEYWORD},
- 	{"all", ALL, RESERVED_KEYWORD},
- 	{"also", ALSO, UNRESERVED_KEYWORD},
- 	{"alter", ALTER, UNRESERVED_KEYWORD},
- 	{"always", ALWAYS, UNRESERVED_KEYWORD},
- 	{"analyse", ANALYSE, RESERVED_KEYWORD},		/* British spelling */
- 	{"analyze", ANALYZE, RESERVED_KEYWORD},
- 	{"and", AND, RESERVED_KEYWORD},
- 	{"any", ANY, RESERVED_KEYWORD},
- 	{"array", ARRAY, RESERVED_KEYWORD},
- 	{"as", AS, RESERVED_KEYWORD},
- 	{"asc", ASC, RESERVED_KEYWORD},
- 	{"assertion", ASSERTION, UNRESERVED_KEYWORD},
- 	{"assignment", ASSIGNMENT, UNRESERVED_KEYWORD},
- 	{"asymmetric", ASYMMETRIC, RESERVED_KEYWORD},
- 	{"at", AT, UNRESERVED_KEYWORD},
- 	{"authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD},
- 	{"backward", BACKWARD, UNRESERVED_KEYWORD},
- 	{"before", BEFORE, UNRESERVED_KEYWORD},
- 	{"begin", BEGIN_P, UNRESERVED_KEYWORD},
- 	{"between", BETWEEN, TYPE_FUNC_NAME_KEYWORD},
- 	{"bigint", BIGINT, COL_NAME_KEYWORD},
- 	{"binary", BINARY, TYPE_FUNC_NAME_KEYWORD},
- 	{"bit", BIT, COL_NAME_KEYWORD},
- 	{"boolean", BOOLEAN_P, COL_NAME_KEYWORD},
- 	{"both", BOTH, RESERVED_KEYWORD},
- 	{"by", BY, UNRESERVED_KEYWORD},
- 	{"cache", CACHE, UNRESERVED_KEYWORD},
- 	{"called", CALLED, UNRESERVED_KEYWORD},
- 	{"cascade", CASCADE, UNRESERVED_KEYWORD},
- 	{"cascaded", CASCADED, UNRESERVED_KEYWORD},
- 	{"case", CASE, RESERVED_KEYWORD},
- 	{"cast", CAST, RESERVED_KEYWORD},
- 	{"catalog", CATALOG_P, UNRESERVED_KEYWORD},
- 	{"chain", CHAIN, UNRESERVED_KEYWORD},
- 	{"char", CHAR_P, COL_NAME_KEYWORD},
- 	{"character", CHARACTER, COL_NAME_KEYWORD},
- 	{"characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD},
- 	{"check", CHECK, RESERVED_KEYWORD},
- 	{"checkpoint", CHECKPOINT, UNRESERVED_KEYWORD},
- 	{"class", CLASS, UNRESERVED_KEYWORD},
- 	{"close", CLOSE, UNRESERVED_KEYWORD},
- 	{"cluster", CLUSTER, UNRESERVED_KEYWORD},
- 	{"coalesce", COALESCE, COL_NAME_KEYWORD},
- 	{"collate", COLLATE, RESERVED_KEYWORD},
- 	{"column", COLUMN, RESERVED_KEYWORD},
- 	{"comment", COMMENT, UNRESERVED_KEYWORD},
- 	{"commit", COMMIT, UNRESERVED_KEYWORD},
- 	{"committed", COMMITTED, UNRESERVED_KEYWORD},
- 	{"concurrently", CONCURRENTLY, UNRESERVED_KEYWORD},
- 	{"configuration", CONFIGURATION, UNRESERVED_KEYWORD},
- 	{"connection", CONNECTION, UNRESERVED_KEYWORD},
- 	{"constraint", CONSTRAINT, RESERVED_KEYWORD},
- 	{"constraints", CONSTRAINTS, UNRESERVED_KEYWORD},
- 	{"content", CONTENT_P, UNRESERVED_KEYWORD},
- 	{"continue", CONTINUE_P, UNRESERVED_KEYWORD},
- 	{"conversion", CONVERSION_P, UNRESERVED_KEYWORD},
- 	{"copy", COPY, UNRESERVED_KEYWORD},
- 	{"cost", COST, UNRESERVED_KEYWORD},
- 	{"create", CREATE, RESERVED_KEYWORD},
- 	{"createdb", CREATEDB, UNRESERVED_KEYWORD},
- 	{"createrole", CREATEROLE, UNRESERVED_KEYWORD},
- 	{"createuser", CREATEUSER, UNRESERVED_KEYWORD},
- 	{"cross", CROSS, TYPE_FUNC_NAME_KEYWORD},
- 	{"csv", CSV, UNRESERVED_KEYWORD},
- 	{"ctype", CTYPE, UNRESERVED_KEYWORD},
- 	{"current", CURRENT_P, UNRESERVED_KEYWORD},
- 	{"current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD},
- 	{"current_date", CURRENT_DATE, RESERVED_KEYWORD},
- 	{"current_role", CURRENT_ROLE, RESERVED_KEYWORD},
- 	{"current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD},
- 	{"current_time", CURRENT_TIME, RESERVED_KEYWORD},
- 	{"current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD},
- 	{"current_user", CURRENT_USER, RESERVED_KEYWORD},
- 	{"cursor", CURSOR, UNRESERVED_KEYWORD},
- 	{"cycle", CYCLE, UNRESERVED_KEYWORD},
- 	{"data", DATA_P, UNRESERVED_KEYWORD},
- 	{"database", DATABASE, UNRESERVED_KEYWORD},
- 	{"day", DAY_P, UNRESERVED_KEYWORD},
- 	{"deallocate", DEALLOCATE, UNRESERVED_KEYWORD},
- 	{"dec", DEC, COL_NAME_KEYWORD},
- 	{"decimal", DECIMAL_P, COL_NAME_KEYWORD},
- 	{"declare", DECLARE, UNRESERVED_KEYWORD},
- 	{"default", DEFAULT, RESERVED_KEYWORD},
- 	{"defaults", DEFAULTS, UNRESERVED_KEYWORD},
- 	{"deferrable", DEFERRABLE, RESERVED_KEYWORD},
- 	{"deferred", DEFERRED, UNRESERVED_KEYWORD},
- 	{"definer", DEFINER, UNRESERVED_KEYWORD},
- 	{"delete", DELETE_P, UNRESERVED_KEYWORD},
- 	{"delimiter", DELIMITER, UNRESERVED_KEYWORD},
- 	{"delimiters", DELIMITERS, UNRESERVED_KEYWORD},
- 	{"desc", DESC, RESERVED_KEYWORD},
- 	{"dictionary", DICTIONARY, UNRESERVED_KEYWORD},
- 	{"disable", DISABLE_P, UNRESERVED_KEYWORD},
- 	{"discard", DISCARD, UNRESERVED_KEYWORD},
- 	{"distinct", DISTINCT, RESERVED_KEYWORD},
- 	{"do", DO, RESERVED_KEYWORD},
- 	{"document", DOCUMENT_P, UNRESERVED_KEYWORD},
- 	{"domain", DOMAIN_P, UNRESERVED_KEYWORD},
- 	{"double", DOUBLE_P, UNRESERVED_KEYWORD},
- 	{"drop", DROP, UNRESERVED_KEYWORD},
- 	{"each", EACH, UNRESERVED_KEYWORD},
- 	{"else", ELSE, RESERVED_KEYWORD},
- 	{"enable", ENABLE_P, UNRESERVED_KEYWORD},
- 	{"encoding", ENCODING, UNRESERVED_KEYWORD},
- 	{"encrypted", ENCRYPTED, UNRESERVED_KEYWORD},
- 	{"end", END_P, RESERVED_KEYWORD},
- 	{"enum", ENUM_P, UNRESERVED_KEYWORD},
- 	{"escape", ESCAPE, UNRESERVED_KEYWORD},
- 	{"except", EXCEPT, RESERVED_KEYWORD},
- 	{"excluding", EXCLUDING, UNRESERVED_KEYWORD},
- 	{"exclusive", EXCLUSIVE, UNRESERVED_KEYWORD},
- 	{"execute", EXECUTE, UNRESERVED_KEYWORD},
- 	{"exists", EXISTS, COL_NAME_KEYWORD},
- 	{"explain", EXPLAIN, UNRESERVED_KEYWORD},
- 	{"external", EXTERNAL, UNRESERVED_KEYWORD},
- 	{"extract", EXTRACT, COL_NAME_KEYWORD},
- 	{"false", FALSE_P, RESERVED_KEYWORD},
- 	{"family", FAMILY, UNRESERVED_KEYWORD},
- 	{"fetch", FETCH, RESERVED_KEYWORD},
- 	{"first", FIRST_P, UNRESERVED_KEYWORD},
- 	{"float", FLOAT_P, COL_NAME_KEYWORD},
- 	{"following", FOLLOWING, UNRESERVED_KEYWORD},
- 	{"for", FOR, RESERVED_KEYWORD},
- 	{"force", FORCE, UNRESERVED_KEYWORD},
- 	{"foreign", FOREIGN, RESERVED_KEYWORD},
- 	{"forward", FORWARD, UNRESERVED_KEYWORD},
- 	{"freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD},
- 	{"from", FROM, RESERVED_KEYWORD},
- 	{"full", FULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"function", FUNCTION, UNRESERVED_KEYWORD},
- 	{"global", GLOBAL, UNRESERVED_KEYWORD},
- 	{"grant", GRANT, RESERVED_KEYWORD},
- 	{"granted", GRANTED, UNRESERVED_KEYWORD},
- 	{"greatest", GREATEST, COL_NAME_KEYWORD},
- 	{"group", GROUP_P, RESERVED_KEYWORD},
- 	{"handler", HANDLER, UNRESERVED_KEYWORD},
- 	{"having", HAVING, RESERVED_KEYWORD},
- 	{"header", HEADER_P, UNRESERVED_KEYWORD},
- 	{"hold", HOLD, UNRESERVED_KEYWORD},
- 	{"hour", HOUR_P, UNRESERVED_KEYWORD},
- 	{"identity", IDENTITY_P, UNRESERVED_KEYWORD},
- 	{"if", IF_P, UNRESERVED_KEYWORD},
- 	{"ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD},
- 	{"immediate", IMMEDIATE, UNRESERVED_KEYWORD},
- 	{"immutable", IMMUTABLE, UNRESERVED_KEYWORD},
- 	{"implicit", IMPLICIT_P, UNRESERVED_KEYWORD},
- 	{"in", IN_P, RESERVED_KEYWORD},
- 	{"including", INCLUDING, UNRESERVED_KEYWORD},
- 	{"increment", INCREMENT, UNRESERVED_KEYWORD},
- 	{"index", INDEX, UNRESERVED_KEYWORD},
- 	{"indexes", INDEXES, UNRESERVED_KEYWORD},
- 	{"inherit", INHERIT, UNRESERVED_KEYWORD},
- 	{"inherits", INHERITS, UNRESERVED_KEYWORD},
- 	{"initially", INITIALLY, RESERVED_KEYWORD},
- 	{"inner", INNER_P, TYPE_FUNC_NAME_KEYWORD},
- 	{"inout", INOUT, COL_NAME_KEYWORD},
- 	{"input", INPUT_P, UNRESERVED_KEYWORD},
- 	{"insensitive", INSENSITIVE, UNRESERVED_KEYWORD},
- 	{"insert", INSERT, UNRESERVED_KEYWORD},
- 	{"instead", INSTEAD, UNRESERVED_KEYWORD},
- 	{"int", INT_P, COL_NAME_KEYWORD},
- 	{"integer", INTEGER, COL_NAME_KEYWORD},
- 	{"intersect", INTERSECT, RESERVED_KEYWORD},
- 	{"interval", INTERVAL, COL_NAME_KEYWORD},
- 	{"into", INTO, RESERVED_KEYWORD},
- 	{"invoker", INVOKER, UNRESERVED_KEYWORD},
- 	{"is", IS, TYPE_FUNC_NAME_KEYWORD},
- 	{"isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"isolation", ISOLATION, UNRESERVED_KEYWORD},
- 	{"join", JOIN, TYPE_FUNC_NAME_KEYWORD},
- 	{"key", KEY, UNRESERVED_KEYWORD},
- 	{"lancompiler", LANCOMPILER, UNRESERVED_KEYWORD},
- 	{"language", LANGUAGE, UNRESERVED_KEYWORD},
- 	{"large", LARGE_P, UNRESERVED_KEYWORD},
- 	{"last", LAST_P, UNRESERVED_KEYWORD},
- 	{"leading", LEADING, RESERVED_KEYWORD},
- 	{"least", LEAST, COL_NAME_KEYWORD},
- 	{"left", LEFT, TYPE_FUNC_NAME_KEYWORD},
- 	{"level", LEVEL, UNRESERVED_KEYWORD},
- 	{"like", LIKE, TYPE_FUNC_NAME_KEYWORD},
- 	{"limit", LIMIT, RESERVED_KEYWORD},
- 	{"listen", LISTEN, UNRESERVED_KEYWORD},
- 	{"load", LOAD, UNRESERVED_KEYWORD},
- 	{"local", LOCAL, UNRESERVED_KEYWORD},
- 	{"localtime", LOCALTIME, RESERVED_KEYWORD},
- 	{"localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD},
- 	{"location", LOCATION, UNRESERVED_KEYWORD},
- 	{"lock", LOCK_P, UNRESERVED_KEYWORD},
- 	{"login", LOGIN_P, UNRESERVED_KEYWORD},
- 	{"mapping", MAPPING, UNRESERVED_KEYWORD},
- 	{"match", MATCH, UNRESERVED_KEYWORD},
- 	{"maxvalue", MAXVALUE, UNRESERVED_KEYWORD},
- 	{"minute", MINUTE_P, UNRESERVED_KEYWORD},
- 	{"minvalue", MINVALUE, UNRESERVED_KEYWORD},
- 	{"mode", MODE, UNRESERVED_KEYWORD},
- 	{"month", MONTH_P, UNRESERVED_KEYWORD},
- 	{"move", MOVE, UNRESERVED_KEYWORD},
- 	{"name", NAME_P, UNRESERVED_KEYWORD},
- 	{"names", NAMES, UNRESERVED_KEYWORD},
- 	{"national", NATIONAL, COL_NAME_KEYWORD},
- 	{"natural", NATURAL, TYPE_FUNC_NAME_KEYWORD},
- 	{"nchar", NCHAR, COL_NAME_KEYWORD},
- 	{"new", NEW, RESERVED_KEYWORD},
- 	{"next", NEXT, UNRESERVED_KEYWORD},
- 	{"no", NO, UNRESERVED_KEYWORD},
- 	{"nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD},
- 	{"nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD},
- 	{"nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD},
- 	{"noinherit", NOINHERIT, UNRESERVED_KEYWORD},
- 	{"nologin", NOLOGIN_P, UNRESERVED_KEYWORD},
- 	{"none", NONE, COL_NAME_KEYWORD},
- 	{"nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD},
- 	{"not", NOT, RESERVED_KEYWORD},
- 	{"nothing", NOTHING, UNRESERVED_KEYWORD},
- 	{"notify", NOTIFY, UNRESERVED_KEYWORD},
- 	{"notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD},
- 	{"nowait", NOWAIT, UNRESERVED_KEYWORD},
- 	{"null", NULL_P, RESERVED_KEYWORD},
- 	{"nullif", NULLIF, COL_NAME_KEYWORD},
- 	{"nulls", NULLS_P, UNRESERVED_KEYWORD},
- 	{"numeric", NUMERIC, COL_NAME_KEYWORD},
- 	{"object", OBJECT_P, UNRESERVED_KEYWORD},
- 	{"of", OF, UNRESERVED_KEYWORD},
- 	{"off", OFF, RESERVED_KEYWORD},
- 	{"offset", OFFSET, RESERVED_KEYWORD},
- 	{"oids", OIDS, UNRESERVED_KEYWORD},
- 	{"old", OLD, RESERVED_KEYWORD},
- 	{"on", ON, RESERVED_KEYWORD},
- 	{"only", ONLY, RESERVED_KEYWORD},
- 	{"operator", OPERATOR, UNRESERVED_KEYWORD},
- 	{"option", OPTION, UNRESERVED_KEYWORD},
- 	{"options", OPTIONS, UNRESERVED_KEYWORD},
- 	{"or", OR, RESERVED_KEYWORD},
- 	{"order", ORDER, RESERVED_KEYWORD},
- 	{"out", OUT_P, COL_NAME_KEYWORD},
- 	{"outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD},
- 	{"over", OVER, TYPE_FUNC_NAME_KEYWORD},
- 	{"overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD},
- 	{"overlay", OVERLAY, COL_NAME_KEYWORD},
- 	{"owned", OWNED, UNRESERVED_KEYWORD},
- 	{"owner", OWNER, UNRESERVED_KEYWORD},
- 	{"parser", PARSER, UNRESERVED_KEYWORD},
- 	{"partial", PARTIAL, UNRESERVED_KEYWORD},
- 	{"partition", PARTITION, UNRESERVED_KEYWORD},
- 	{"password", PASSWORD, UNRESERVED_KEYWORD},
- 	{"placing", PLACING, RESERVED_KEYWORD},
- 	{"plans", PLANS, UNRESERVED_KEYWORD},
- 	{"position", POSITION, COL_NAME_KEYWORD},
- 	{"preceding", PRECEDING, UNRESERVED_KEYWORD},
- 	{"precision", PRECISION, COL_NAME_KEYWORD},
- 	{"prepare", PREPARE, UNRESERVED_KEYWORD},
- 	{"prepared", PREPARED, UNRESERVED_KEYWORD},
- 	{"preserve", PRESERVE, UNRESERVED_KEYWORD},
- 	{"primary", PRIMARY, RESERVED_KEYWORD},
- 	{"prior", PRIOR, UNRESERVED_KEYWORD},
- 	{"privileges", PRIVILEGES, UNRESERVED_KEYWORD},
- 	{"procedural", PROCEDURAL, UNRESERVED_KEYWORD},
- 	{"procedure", PROCEDURE, UNRESERVED_KEYWORD},
- 	{"quote", QUOTE, UNRESERVED_KEYWORD},
- 	{"range", RANGE, UNRESERVED_KEYWORD},
- 	{"read", READ, UNRESERVED_KEYWORD},
- 	{"real", REAL, COL_NAME_KEYWORD},
- 	{"reassign", REASSIGN, UNRESERVED_KEYWORD},
- 	{"recheck", RECHECK, UNRESERVED_KEYWORD},
- 	{"recursive", RECURSIVE, UNRESERVED_KEYWORD},
- 	{"references", REFERENCES, RESERVED_KEYWORD},
- 	{"reindex", REINDEX, UNRESERVED_KEYWORD},
- 	{"relative", RELATIVE_P, UNRESERVED_KEYWORD},
- 	{"release", RELEASE, UNRESERVED_KEYWORD},
- 	{"rename", RENAME, UNRESERVED_KEYWORD},
- 	{"repeatable", REPEATABLE, UNRESERVED_KEYWORD},
- 	{"replace", REPLACE, UNRESERVED_KEYWORD},
- 	{"replica", REPLICA, UNRESERVED_KEYWORD},
- 	{"reset", RESET, UNRESERVED_KEYWORD},
- 	{"restart", RESTART, UNRESERVED_KEYWORD},
- 	{"restrict", RESTRICT, UNRESERVED_KEYWORD},
- 	{"returning", RETURNING, RESERVED_KEYWORD},
- 	{"returns", RETURNS, UNRESERVED_KEYWORD},
- 	{"revoke", REVOKE, UNRESERVED_KEYWORD},
- 	{"right", RIGHT, TYPE_FUNC_NAME_KEYWORD},
- 	{"role", ROLE, UNRESERVED_KEYWORD},
- 	{"rollback", ROLLBACK, UNRESERVED_KEYWORD},
- 	{"row", ROW, COL_NAME_KEYWORD},
- 	{"rows", ROWS, UNRESERVED_KEYWORD},
- 	{"rule", RULE, UNRESERVED_KEYWORD},
- 	{"savepoint", SAVEPOINT, UNRESERVED_KEYWORD},
- 	{"schema", SCHEMA, UNRESERVED_KEYWORD},
- 	{"scroll", SCROLL, UNRESERVED_KEYWORD},
- 	{"search", SEARCH, UNRESERVED_KEYWORD},
- 	{"second", SECOND_P, UNRESERVED_KEYWORD},
- 	{"security", SECURITY, UNRESERVED_KEYWORD},
- 	{"select", SELECT, RESERVED_KEYWORD},
- 	{"sequence", SEQUENCE, UNRESERVED_KEYWORD},
- 	{"serializable", SERIALIZABLE, UNRESERVED_KEYWORD},
- 	{"server", SERVER, UNRESERVED_KEYWORD},
- 	{"session", SESSION, UNRESERVED_KEYWORD},
- 	{"session_user", SESSION_USER, RESERVED_KEYWORD},
- 	{"set", SET, UNRESERVED_KEYWORD},
- 	{"setof", SETOF, COL_NAME_KEYWORD},
- 	{"share", SHARE, UNRESERVED_KEYWORD},
- 	{"show", SHOW, UNRESERVED_KEYWORD},
- 	{"similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD},
- 	{"simple", SIMPLE, UNRESERVED_KEYWORD},
- 	{"smallint", SMALLINT, COL_NAME_KEYWORD},
- 	{"some", SOME, RESERVED_KEYWORD},
- 	{"stable", STABLE, UNRESERVED_KEYWORD},
- 	{"standalone", STANDALONE_P, UNRESERVED_KEYWORD},
- 	{"start", START, UNRESERVED_KEYWORD},
- 	{"statement", STATEMENT, UNRESERVED_KEYWORD},
- 	{"statistics", STATISTICS, UNRESERVED_KEYWORD},
- 	{"stdin", STDIN, UNRESERVED_KEYWORD},
- 	{"stdout", STDOUT, UNRESERVED_KEYWORD},
- 	{"storage", STORAGE, UNRESERVED_KEYWORD},
- 	{"strict", STRICT_P, UNRESERVED_KEYWORD},
- 	{"strip", STRIP_P, UNRESERVED_KEYWORD},
- 	{"substring", SUBSTRING, COL_NAME_KEYWORD},
- 	{"superuser", SUPERUSER_P, UNRESERVED_KEYWORD},
- 	{"symmetric", SYMMETRIC, RESERVED_KEYWORD},
- 	{"sysid", SYSID, UNRESERVED_KEYWORD},
- 	{"system", SYSTEM_P, UNRESERVED_KEYWORD},
- 	{"table", TABLE, RESERVED_KEYWORD},
- 	{"tablespace", TABLESPACE, UNRESERVED_KEYWORD},
- 	{"temp", TEMP, UNRESERVED_KEYWORD},
- 	{"template", TEMPLATE, UNRESERVED_KEYWORD},
- 	{"temporary", TEMPORARY, UNRESERVED_KEYWORD},
- 	{"text", TEXT_P, UNRESERVED_KEYWORD},
- 	{"then", THEN, RESERVED_KEYWORD},
- 	{"time", TIME, COL_NAME_KEYWORD},
- 	{"timestamp", TIMESTAMP, COL_NAME_KEYWORD},
- 	{"to", TO, RESERVED_KEYWORD},
- 	{"trailing", TRAILING, RESERVED_KEYWORD},
- 	{"transaction", TRANSACTION, UNRESERVED_KEYWORD},
- 	{"treat", TREAT, COL_NAME_KEYWORD},
- 	{"trigger", TRIGGER, UNRESERVED_KEYWORD},
- 	{"trim", TRIM, COL_NAME_KEYWORD},
- 	{"true", TRUE_P, RESERVED_KEYWORD},
- 	{"truncate", TRUNCATE, UNRESERVED_KEYWORD},
- 	{"trusted", TRUSTED, UNRESERVED_KEYWORD},
- 	{"type", TYPE_P, UNRESERVED_KEYWORD},
- 	{"unbounded", UNBOUNDED, UNRESERVED_KEYWORD},
- 	{"uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD},
- 	{"unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD},
- 	{"union", UNION, RESERVED_KEYWORD},
- 	{"unique", UNIQUE, RESERVED_KEYWORD},
- 	{"unknown", UNKNOWN, UNRESERVED_KEYWORD},
- 	{"unlisten", UNLISTEN, UNRESERVED_KEYWORD},
- 	{"until", UNTIL, UNRESERVED_KEYWORD},
- 	{"update", UPDATE, UNRESERVED_KEYWORD},
- 	{"user", USER, RESERVED_KEYWORD},
- 	{"using", USING, RESERVED_KEYWORD},
- 	{"vacuum", VACUUM, UNRESERVED_KEYWORD},
- 	{"valid", VALID, UNRESERVED_KEYWORD},
- 	{"validator", VALIDATOR, UNRESERVED_KEYWORD},
- 	{"value", VALUE_P, UNRESERVED_KEYWORD},
- 	{"values", VALUES, COL_NAME_KEYWORD},
- 	{"varchar", VARCHAR, COL_NAME_KEYWORD},
- 	{"variadic", VARIADIC, RESERVED_KEYWORD},
- 	{"varying", VARYING, UNRESERVED_KEYWORD},
- 	{"verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD},
- 	{"version", VERSION_P, UNRESERVED_KEYWORD},
- 	{"view", VIEW, UNRESERVED_KEYWORD},
- 	{"volatile", VOLATILE, UNRESERVED_KEYWORD},
- 	{"when", WHEN, RESERVED_KEYWORD},
- 	{"where", WHERE, RESERVED_KEYWORD},
- 	{"whitespace", WHITESPACE_P, UNRESERVED_KEYWORD},
- 	{"window", WINDOW, RESERVED_KEYWORD},
- 	{"with", WITH, RESERVED_KEYWORD},
- 	{"without", WITHOUT, UNRESERVED_KEYWORD},
- 	{"work", WORK, UNRESERVED_KEYWORD},
- 	{"wrapper", WRAPPER, UNRESERVED_KEYWORD},
- 	{"write", WRITE, UNRESERVED_KEYWORD},
- 	{"xml", XML_P, UNRESERVED_KEYWORD},
- 	{"xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD},
- 	{"xmlconcat", XMLCONCAT, COL_NAME_KEYWORD},
- 	{"xmlelement", XMLELEMENT, COL_NAME_KEYWORD},
- 	{"xmlforest", XMLFOREST, COL_NAME_KEYWORD},
- 	{"xmlparse", XMLPARSE, COL_NAME_KEYWORD},
- 	{"xmlpi", XMLPI, COL_NAME_KEYWORD},
- 	{"xmlroot", XMLROOT, COL_NAME_KEYWORD},
- 	{"xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD},
- 	{"year", YEAR_P, UNRESERVED_KEYWORD},
- 	{"yes", YES_P, 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
-  *
-  * Returns a pointer to the ScanKeyword table entry, or NULL if no match.
-  *
-  * The match is done case-insensitively.  Note that we deliberately use a
-  * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',
-  * even if we are in a locale where tolower() would produce more or different
-  * translations.  This is to conform to the SQL99 spec, which says that
-  * keywords are to be matched in this way even though non-keyword identifiers
-  * receive a different case-normalization mapping.
-  */
- const ScanKeyword *
- ScanKeywordLookup(const char *text)
- {
- 	int			len,
- 				i;
- 	char		word[NAMEDATALEN];
- 	const ScanKeyword *low;
- 	const ScanKeyword *high;
- 
- 	len = strlen(text);
- 	/* We assume all keywords are shorter than NAMEDATALEN. */
- 	if (len >= NAMEDATALEN)
- 		return NULL;
- 
- 	/*
- 	 * Apply an ASCII-only downcasing.	We must not use tolower() since it may
- 	 * produce the wrong translation in some locales (eg, Turkish).
- 	 */
- 	for (i = 0; i < len; i++)
- 	{
- 		char		ch = text[i];
- 
- 		if (ch >= 'A' && ch <= 'Z')
- 			ch += 'a' - 'A';
- 		word[i] = ch;
- 	}
- 	word[len] = '\0';
- 
- 	/*
- 	 * Now do a binary search using plain strcmp() comparison.
- 	 */
- 	low = &ScanKeywords[0];
- 	high = endof(ScanKeywords) - 1;
- 	while (low <= high)
- 	{
- 		const ScanKeyword *middle;
- 		int			difference;
  
! 		middle = low + (high - low) / 2;
! 		difference = strcmp(middle->name, word);
! 		if (difference == 0)
! 			return middle;
! 		else if (difference < 0)
! 			low = middle + 1;
! 		else
! 			high = middle - 1;
! 	}
  
! 	return NULL;
! }
--- 13,25 ----
   *
   *-------------------------------------------------------------------------
   */
+ #include "postgres.h"
  
! #include "nodes/nodes.h"
! #include "nodes/parsenodes.h"
  #include "parser/keywords.h"
  #include "parser/gram.h"
  
! #define PG_KEYWORD(a,b,c) {a,b,c}
  
! #include "parser/kwlist.h"
Index: src/backend/parser/kwlookup.c
===================================================================
RCS file: src/backend/parser/kwlookup.c
diff -N src/backend/parser/kwlookup.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/backend/parser/kwlookup.c	4 Mar 2009 15:42:33 -0000
***************
*** 0 ****
--- 1,86 ----
+ /*-------------------------------------------------------------------------
+  *
+  * kwlookup.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  * NB - this file is used by pg_dump and ECPG
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ 
+ /* use c.h so this can be built as either frontend or backend */
+ #include "c.h"
+ 
+ #include <ctype.h>
+ 
+ #include "parser/keywords.h"
+ 
+ /*
+  * ScanKeywordLookup - see if a given word is a keyword
+  *
+  * Returns a pointer to the ScanKeyword table entry, or NULL if no match.
+  *
+  * The match is done case-insensitively.  Note that we deliberately use a
+  * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',
+  * even if we are in a locale where tolower() would produce more or different
+  * translations.  This is to conform to the SQL99 spec, which says that
+  * keywords are to be matched in this way even though non-keyword identifiers
+  * receive a different case-normalization mapping.
+  */
+ const ScanKeyword *
+ ScanKeywordLookup(const char *text)
+ {
+ 	int			len,
+ 				i;
+ 	char		word[NAMEDATALEN];
+ 	const ScanKeyword *low;
+ 	const ScanKeyword *high;
+ 
+ 	len = strlen(text);
+ 	/* We assume all keywords are shorter than NAMEDATALEN. */
+ 	if (len >= NAMEDATALEN)
+ 		return NULL;
+ 
+ 	/*
+ 	 * Apply an ASCII-only downcasing.	We must not use tolower() since it may
+ 	 * produce the wrong translation in some locales (eg, Turkish).
+ 	 */
+ 	for (i = 0; i < len; i++)
+ 	{
+ 		char		ch = text[i];
+ 
+ 		if (ch >= 'A' && ch <= 'Z')
+ 			ch += 'a' - 'A';
+ 		word[i] = ch;
+ 	}
+ 	word[len] = '\0';
+ 
+ 	/*
+ 	 * Now do a binary search using plain strcmp() comparison.
+ 	 */
+ 	low = &ScanKeywords[0];
+ 	high = LastScanKeyword - 1;
+ 	while (low <= high)
+ 	{
+ 		const ScanKeyword *middle;
+ 		int			difference;
+ 
+ 		middle = low + (high - low) / 2;
+ 		difference = strcmp(middle->name, word);
+ 		if (difference == 0)
+ 			return middle;
+ 		else if (difference < 0)
+ 			low = middle + 1;
+ 		else
+ 			high = middle - 1;
+ 	}
+ 
+ 	return NULL;
+ }
Index: src/bin/pg_dump/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/bin/pg_dump/Makefile,v
retrieving revision 1.66
diff -c -p -r1.66 Makefile
*** src/bin/pg_dump/Makefile	1 Jan 2009 17:23:54 -0000	1.66
--- src/bin/pg_dump/Makefile	4 Mar 2009 17:02:19 -0000
*************** OBJS=	pg_backup_archiver.o pg_backup_db.
*** 20,42 ****
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
  	dumputils.o $(WIN32RES)
  
! EXTRA_OBJS = $(top_builddir)/src/backend/parser/keywords.o
  
! all: submake-libpq submake-libpgport submake-backend pg_dump pg_restore pg_dumpall
  
! pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
! pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(OBJS) $(EXTRA_OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
! pg_dumpall: pg_dumpall.o dumputils.o $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(EXTRA_OBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
! 
! .PHONY: submake-backend
! submake-backend:
! 	$(MAKE) -C $(top_builddir)/src/backend/parser keywords.o
  
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
--- 20,40 ----
  	pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
  	dumputils.o $(WIN32RES)
  
! KEYWRDOBJS = keywords.o kwlookup.o
  
! kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
! 	rm -f $@ && $(LN_S) $< .
  
! all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall
  
! pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a 
! 	$(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
! pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
! 	$(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
+ pg_dumpall: pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(libpq_builddir)/libpq.a
+ 	$(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LIBS) -o $@$(X)
  
  install: all installdirs
  	$(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
*************** uninstall:
*** 50,53 ****
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o
--- 48,51 ----
  	rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
  
  clean distclean maintainer-clean:
! 	rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o kwlookup.c $(KEYWRDOBJS)
Index: src/bin/pg_dump/keywords.c
===================================================================
RCS file: src/bin/pg_dump/keywords.c
diff -N src/bin/pg_dump/keywords.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/bin/pg_dump/keywords.c	4 Mar 2009 17:38:28 -0000
***************
*** 0 ****
--- 1,26 ----
+ /*-------------------------------------------------------------------------
+  *
+  * keywords.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ #include "postgres_fe.h"
+ 
+ #include "parser/keywords.h"
+ 
+ /*
+  * We don't need the token number, so leave it out to avoid requiring other 
+  * backend headers.
+  */
+ #define PG_KEYWORD(a,b,c) {a,0,c}
+ 
+ #include "parser/kwlist.h"
Index: src/include/parser/kwlist.h
===================================================================
RCS file: src/include/parser/kwlist.h
diff -N src/include/parser/kwlist.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/include/parser/kwlist.h	4 Mar 2009 15:55:55 -0000
***************
*** 0 ****
--- 1,426 ----
+ /*-------------------------------------------------------------------------
+  *
+  * kwlist.h
+  *	  keyword list definitions for PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL$
+  *
+  *-------------------------------------------------------------------------
+  */
+ #ifndef KWLIST_H
+ #define KWLIST_H
+ 
+ #include "parser/keywords.h"
+ 
+ 
+ /*
+  * List of keyword (name, token-value, category) entries.
+  *
+  * !!WARNING!!: This list must be sorted by ASCII name, because binary
+  *		 search is used to locate entries.
+  */
+ const ScanKeyword ScanKeywords[] = {
+ 	/* name, value, category */
+ 	PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("add", ADD_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("admin", ADMIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("after", AFTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("aggregate", AGGREGATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("all", ALL, RESERVED_KEYWORD),
+ 	PG_KEYWORD("also", ALSO, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("alter", ALTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("always", ALWAYS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("analyse", ANALYSE, RESERVED_KEYWORD),		/* British spelling */
+ 	PG_KEYWORD("analyze", ANALYZE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("and", AND, RESERVED_KEYWORD),
+ 	PG_KEYWORD("any", ANY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("array", ARRAY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("as", AS, RESERVED_KEYWORD),
+ 	PG_KEYWORD("asc", ASC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("assertion", ASSERTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("assignment", ASSIGNMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("at", AT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("between", BETWEEN, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("bigint", BIGINT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("binary", BINARY, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("bit", BIT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("both", BOTH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("by", BY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cascaded", CASCADED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("case", CASE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("cast", CAST, RESERVED_KEYWORD),
+ 	PG_KEYWORD("catalog", CATALOG_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("chain", CHAIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("char", CHAR_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("character", CHARACTER, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("check", CHECK, RESERVED_KEYWORD),
+ 	PG_KEYWORD("checkpoint", CHECKPOINT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("class", CLASS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("close", CLOSE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cluster", CLUSTER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("coalesce", COALESCE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("collate", COLLATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("column", COLUMN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("comment", COMMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("concurrently", CONCURRENTLY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("content", CONTENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("continue", CONTINUE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("conversion", CONVERSION_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("copy", COPY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cost", COST, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("create", CREATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("createdb", CREATEDB, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("createrole", CREATEROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("createuser", CREATEUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("ctype", CTYPE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD),
+ 	PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("decimal", DECIMAL_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("declare", DECLARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("default", DEFAULT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("defaults", DEFAULTS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("deferrable", DEFERRABLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("deferred", DEFERRED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("definer", DEFINER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delete", DELETE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delimiter", DELIMITER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("delimiters", DELIMITERS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("desc", DESC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("dictionary", DICTIONARY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("do", DO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("else", ELSE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("end", END_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("exists", EXISTS, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("explain", EXPLAIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("for", FOR, RESERVED_KEYWORD),
+ 	PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("from", FROM, RESERVED_KEYWORD),
+ 	PG_KEYWORD("full", FULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("function", FUNCTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("global", GLOBAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("grant", GRANT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("granted", GRANTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("greatest", GREATEST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("group", GROUP_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("handler", HANDLER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("having", HAVING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("implicit", IMPLICIT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("in", IN_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("including", INCLUDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("increment", INCREMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("index", INDEX, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("indexes", INDEXES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("inherit", INHERIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("inherits", INHERITS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("initially", INITIALLY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("inner", INNER_P, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("inout", INOUT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("input", INPUT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("insensitive", INSENSITIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("insert", INSERT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("instead", INSTEAD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("int", INT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("integer", INTEGER, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("intersect", INTERSECT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("interval", INTERVAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("into", INTO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("invoker", INVOKER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("lancompiler", LANCOMPILER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("level", LEVEL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("like", LIKE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("listen", LISTEN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("load", LOAD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("local", LOCAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("localtime", LOCALTIME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD),
+ 	PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("login", LOGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("new", NEW, RESERVED_KEYWORD),
+ 	PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("no", NO, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreatedb", NOCREATEDB, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreaterole", NOCREATEROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nocreateuser", NOCREATEUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("noinherit", NOINHERIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("nologin", NOLOGIN_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("none", NONE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("nosuperuser", NOSUPERUSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("not", NOT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("nothing", NOTHING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("notify", NOTIFY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("nowait", NOWAIT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("of", OF, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("off", OFF, RESERVED_KEYWORD),
+ 	PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD),
+ 	PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("old", OLD, RESERVED_KEYWORD),
+ 	PG_KEYWORD("on", ON, RESERVED_KEYWORD),
+ 	PG_KEYWORD("only", ONLY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("option", OPTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("options", OPTIONS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("or", OR, RESERVED_KEYWORD),
+ 	PG_KEYWORD("order", ORDER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("over", OVER, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("preceding", PRECEDING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("precision", PRECISION, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("prepare", PREPARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("prepared", PREPARED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("preserve", PRESERVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("primary", PRIMARY, RESERVED_KEYWORD),
+ 	PG_KEYWORD("prior", PRIOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("privileges", PRIVILEGES, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("procedural", PROCEDURAL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("procedure", PROCEDURE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("read", READ, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("real", REAL, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("reassign", REASSIGN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("recheck", RECHECK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("recursive", RECURSIVE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("references", REFERENCES, RESERVED_KEYWORD),
+ 	PG_KEYWORD("reindex", REINDEX, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("relative", RELATIVE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("release", RELEASE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rename", RENAME, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("repeatable", REPEATABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("replace", REPLACE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("replica", REPLICA, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("reset", RESET, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("restart", RESTART, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("restrict", RESTRICT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("returning", RETURNING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("returns", RETURNS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("revoke", REVOKE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("right", RIGHT, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("role", ROLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rollback", ROLLBACK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("row", ROW, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("search", SEARCH, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("second", SECOND_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("security", SECURITY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("select", SELECT, RESERVED_KEYWORD),
+ 	PG_KEYWORD("sequence", SEQUENCE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("serializable", SERIALIZABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("server", SERVER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("session", SESSION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("session_user", SESSION_USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("set", SET, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("setof", SETOF, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("share", SHARE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("show", SHOW, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("simple", SIMPLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("some", SOME, RESERVED_KEYWORD),
+ 	PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("start", START, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("statement", STATEMENT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("statistics", STATISTICS, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("stdin", STDIN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("superuser", SUPERUSER_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("table", TABLE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("then", THEN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("time", TIME, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("to", TO, RESERVED_KEYWORD),
+ 	PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("transaction", TRANSACTION, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("treat", TREAT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("trigger", TRIGGER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("trim", TRIM, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD),
+ 	PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("union", UNION, RESERVED_KEYWORD),
+ 	PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("unknown", UNKNOWN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("unlisten", UNLISTEN, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("until", UNTIL, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("user", USER, RESERVED_KEYWORD),
+ 	PG_KEYWORD("using", USING, RESERVED_KEYWORD),
+ 	PG_KEYWORD("vacuum", VACUUM, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("valid", VALID, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("validator", VALIDATOR, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("value", VALUE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("values", VALUES, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("varchar", VARCHAR, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("variadic", VARIADIC, RESERVED_KEYWORD),
+ 	PG_KEYWORD("varying", VARYING, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD),
+ 	PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("when", WHEN, RESERVED_KEYWORD),
+ 	PG_KEYWORD("where", WHERE, RESERVED_KEYWORD),
+ 	PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("window", WINDOW, RESERVED_KEYWORD),
+ 	PG_KEYWORD("with", WITH, RESERVED_KEYWORD),
+ 	PG_KEYWORD("without", WITHOUT, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlelement", XMLELEMENT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlforest", XMLFOREST, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlparse", XMLPARSE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlpi", XMLPI, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlroot", XMLROOT, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD),
+ 	PG_KEYWORD("year", YEAR_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("yes", YES_P, UNRESERVED_KEYWORD),
+ 	PG_KEYWORD("zone", ZONE, UNRESERVED_KEYWORD),
+ };
+ 
+ /* End of ScanKeywords, for use elsewhere */
+ const ScanKeyword *LastScanKeyword = endof(ScanKeywords);
+ 
+ #endif /* KWLIST_H */
Index: src/interfaces/ecpg/preproc/Makefile
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/interfaces/ecpg/preproc/Makefile,v
retrieving revision 1.141
diff -c -p -r1.141 Makefile
*** src/interfaces/ecpg/preproc/Makefile	1 Jan 2009 17:24:02 -0000	1.141
--- src/interfaces/ecpg/preproc/Makefile	4 Mar 2009 15:46:40 -0000
*************** override CPPFLAGS := -I../include -I$(to
*** 25,31 ****
  override CFLAGS += $(PTHREAD_CFLAGS) -DECPG_COMPILE
  
  OBJS=	preproc.o type.o ecpg.o output.o parser.o \
! 	keywords.o c_keywords.o ecpg_keywords.o ../ecpglib/typename.o descriptor.o variable.o \
  	$(WIN32RES)
  
  all: submake-libpgport ecpg
--- 25,31 ----
  override CFLAGS += $(PTHREAD_CFLAGS) -DECPG_COMPILE
  
  OBJS=	preproc.o type.o ecpg.o output.o parser.o \
! 	keywords.o c_keywords.o ecpg_keywords.o kwlookup.o ../ecpglib/typename.o descriptor.o variable.o \
  	$(WIN32RES)
  
  all: submake-libpgport ecpg
*************** $(srcdir)/preproc.y: $(top_srcdir)/src/b
*** 57,64 ****
  
  ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
  
! # instead of maintaining our own list, take the one from the backend
! keywords.c: % : $(top_srcdir)/src/backend/parser/%
  	rm -f $@ && $(LN_S) $< .
  
  distprep: $(srcdir)/preproc.y $(srcdir)/preproc.c $(srcdir)/preproc.h $(srcdir)/pgc.c
--- 57,63 ----
  
  ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
  
! kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
  	rm -f $@ && $(LN_S) $< .
  
  distprep: $(srcdir)/preproc.y $(srcdir)/preproc.c $(srcdir)/preproc.h $(srcdir)/pgc.c
*************** uninstall:
*** 73,79 ****
  	rm -f '$(DESTDIR)$(bindir)/ecpg$(X)'
  
  clean distclean:
! 	rm -f keywords.c *.o ecpg$(X)
  # garbage from development
  	@rm -f core a.out
  
--- 72,78 ----
  	rm -f '$(DESTDIR)$(bindir)/ecpg$(X)'
  
  clean distclean:
! 	rm -f kwlookup.c *.o ecpg$(X)
  # garbage from development
  	@rm -f core a.out
  
Index: src/interfaces/ecpg/preproc/keywords.c
===================================================================
RCS file: src/interfaces/ecpg/preproc/keywords.c
diff -N src/interfaces/ecpg/preproc/keywords.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- src/interfaces/ecpg/preproc/keywords.c	5 Mar 2009 13:08:57 -0000
***************
*** 0 ****
--- 1,24 ----
+ /*-------------------------------------------------------------------------
+  *
+  * keywords.c
+  *	  lexical token lookup for key words in PostgreSQL
+  *
+  *
+  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  *
+  * IDENTIFICATION
+  *	  $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.210 2009-02-24 10:06:33 petere Exp $
+  *
+  *-------------------------------------------------------------------------
+  */
+ #include "postgres_fe.h"
+ 
+ #include "parser/keywords.h"
+ #include "type.h"
+ #include "preproc.h"
+ 
+ #define PG_KEYWORD(a,b,c) {a,b,c}
+ 
+ #include "parser/kwlist.h"
#15Alvaro Herrera
alvherre@commandprompt.com
In reply to: Zdenek Kotala (#13)
Re: building pg_dump doesn't work

Zdenek Kotala wrote:

Dne 3.03.09 22:55, Tom Lane napsal(a):

One idea that comes to mind is to replace the entries like

{"abort", ABORT_P, UNRESERVED_KEYWORD},

with macro calls

PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD),

and then the frontend build of the file could define the macro
to ignore its second argument.

It sounds good.

Please have a look at the patch I just posted -- should be up in a few
minutes in
http://archives.postgresql.org/message-id/20090305131208.GA4087%40alvh.no-ip.org

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#16Greg Stark
stark@enterprisedb.com
In reply to: Alvaro Herrera (#14)
Re: building pg_dump doesn't work

On Thu, Mar 5, 2009 at 1:12 PM, Alvaro Herrera
<alvherre@commandprompt.com> wrote:

Tom Lane wrote:

Alvaro Herrera <alvherre@commandprompt.com> writes:

Seems doable.

Attached.

The TWO_MEMBER_SCANKEYWORD business seems a bit dangerous --- if the
header file is read without having #defined that correctly, bad things
will happen.  It might be better to leave that out, always define the
struct the same, and just have pg_dump define PG_KEYWORD to fill the
value field with zero.  Given alignment considerations, you're not
saving any space by omitting the field anyhow.

Fixed.

I also added #include type.h to the ecpg keywords.c file, which means we
don't need to redefine YYSTYPE at all on any of the three keywords.c
file.  Looks cleaner overall.

Hopefully this is the last version of this patch.

FWIW gcc does this kind of trick all over the place. They have lists
of various types of objects, not unlike our nodes and define them in
.h files which contain _just_ the equivalent of PG_KEYWORD. Then they
include those files in various places with the macro defined to do
different things. So for example they define an enum, an array for
external consumption, an array for internal consumption, and in many
places even switch statements with trivial bits of code from the macro
too.

If we're going to go this route I think it does make sense to move the
"const ScanKeyword ScanKeywords[] = {" preamble and to live with the
PG_KEYWORD definition. Even if we're not planning to have any other
kinds of macro definitions aside from ScanKeywords arrays today it
would be nice to have the flexibility and in any case I don't really
like the action-at-a-distance of having a macro definition in one
place which depends on the definition in another place.

--
greg

#17Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#14)
Re: building pg_dump doesn't work

Alvaro Herrera <alvherre@commandprompt.com> writes:

Hopefully this is the last version of this patch.

A few more comments would help --- in particular the header comment
for kwlist.h should explain that the calling file is supposed to define
PG_KEYWORD appropriately for its needs. I also wonder whether Greg
isn't right that it would be better if the header contained *only*
the PG_KEYWORD macros, rather than presupposing that the caller wants
to build a constant table named ScanKeywords with them.

In general though it's certainly cleaner than the old way.

regards, tom lane