On Wed, Dec 29, 2010 at 14:55, Dave Page <dp...@pgadmin.org> wrote:
> On Wed, Dec 29, 2010 at 11:54 AM, Magnus Hagander <mag...@hagander.net> wrote:
>> We haven't updated the keywords.cpp file for ages. In fact, so long
>> ago that the instructions are incorrect.
>>
>> Recent versions of postgresql installs the list of keywords in
>> kwlist.h. That requires PostgreSQL 8.4 or later.
>>
>> How old versions of the PostgreSQL *source* do we accept building
>> against? Couldn't we just switch to using this include file instead,
>> thus saying you need 8.4 or later to build? (it should still *run*
>> against earlier versions just fine..)
>
> Iirc, we need 8.3 (or whichever version included pgconninfoparse). I'm
> fine with moving to using the new include file - iirc, most distros
> have an 8.4 build now.

That turned out to be a bit more work than I thought, mainly because
there were EnterpriseDB and Greenplum keywords included in the pgadmin
list - which was only documented in one of the two places where they
occurred :-)

Anyway, attached is a patch that I believe does this right. If you
prefer an easier view, see
https://github.com/mhagander/pgadmin3/compare/master...keywords

Does this look ok?

It does move the keyword definitions out of the header and into
keywords.cpp - but they aren't used anywhere.. So in general, I'm
fairly confident with it...

-- 
 Magnus Hagander
 Me: http://www.hagander.net/
 Work: http://www.redpill-linpro.com/
diff --git a/pgadmin/db/keywords.c b/pgadmin/db/keywords.c
index 0c0f8b0..6ddf381 100644
--- a/pgadmin/db/keywords.c
+++ b/pgadmin/db/keywords.c
@@ -15,11 +15,9 @@
 
 ///////////////////////////////////////////////////////////////////////////
 //
-// pgAdmin note: This file is based on src/backend/parser/keywords.c from
-//               PostgreSQL. It should be periodically updated to include 
-//               new keywords. The ScanKeywords array and the definition 
-//               of ScanKeywordLookup are all that are required here - when
-//               updating, ensure that no unecessary includes are added.
+// pgAdmin note: This file is based on src/backend/parser/keywords.c and
+//               src/backend/parser/kwlookup.c from PostgreSQL, but extended
+//               to support EntepriseDB and Greenplum.
 //
 //               This file is under the BSD licence, per PostgreSQL.
 ///////////////////////////////////////////////////////////////////////////
@@ -28,429 +26,85 @@
 #include "parser/keywords.h"
 
 /*
+ * Load the yytokentype list of symbols from PostgreSQL
+ */
+#undef YYTOKENTYPE
+#include <server/parser/gram.h>
+
+/*
+ * For non-PostgreSQL types, define an enumb with their values here
+ * NOTE! Make sure the value doesn't conflict with what's in
+ * server/parser/gram.h - as the PostgreSQL parser grows larger the
+ * highest numbers will increase.
+ */
+enum yytokentype_extra {
+ /* The following additions are keywords in EnterpriseDB */
+ CONNECT_EDB = 800,
+ CONVERT_EDB = 801,
+ MINUS_EDB = 802,
+ NUMBER_EDB = 803,
+ PACKAGE_EDB = 804,
+ SMALLDATETIME_EDB = 805,
+ SMALLFLOAT_EDB = 806,
+ SMALLMONEY_EDB = 807,
+ TINYINT_EDB = 808,
+ TINYTEXT_EDB = 809,
+ VARCHAR2_EDB = 810,
+ EXEC_EDB = 811,
+ LONG_EDB = 812,
+ NOCACHE_EDB = 813,
+ PLS_INTEGER_EDB = 814,
+ RAW_EDB = 815,
+ RETURN_EDB = 816,
+ SYSDATE_EDB = 817,
+ SYSTIMESTAMP_EDB = 818,
+
+ /* The following additions are keywords in Greenplum Database */
+ DISTRIBUTED_GP = 900,
+ LOG_P_GP = 901
+};
+
+
+/*
  * List of (keyword-name, keyword-token-value) pairs.
+ */
+#define PG_KEYWORD(a,b,c) {a,b,c},
+const ScanKeyword ScanKeywords[] = {
+#include <server/parser/kwlist.h>
+};
+const int NumScanKeywords = lengthof(ScanKeywords);
+
+/*
+ * Additional pairs here. They need to live in a separate array since
+ * the ScanKeywords array needs to be sorted!
  *
  * !!WARNING!!: This list must be sorted, because binary
- *		 search is used to locate entries.
+ *              search is used to locate entries.
  */
-static 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},
-	{"autovacuum_enabled", AUTOVACUUM_E, UNRESERVED_KEYWORD},
-	{"autovacuum_vacuum_threshold", AUTOVACUUM_V_TH, UNRESERVED_KEYWORD},
-	{"autovacuum_analyze_threshold", AUTOVACUUM_A_TH, UNRESERVED_KEYWORD},
-	{"autovacuum_vacuum_scale_factor", AUTOVACUUM_V_SC_F, UNRESERVED_KEYWORD},
-	{"autovacuum_analyze_scale_factor", AUTOVACUUM_A_SC_F, UNRESERVED_KEYWORD},
-	{"autovacuum_vacuum_cost_delay", AUTOVACUUM_V_COST_D, UNRESERVED_KEYWORD},
-	{"autovacuum_vacuum_cost_limit", AUTOVACUUM_V_COST_L, UNRESERVED_KEYWORD},
-	{"autovacuum_freeze_min_age", AUTOVACUUM_F_MIN_AGE, UNRESERVED_KEYWORD},
-	{"autovacuum_freeze_max_age", AUTOVACUUM_F_MAX_AGE, UNRESERVED_KEYWORD},
-	{"autovacuum_freeze_table_age", AUTOVACUUM_F_TBL_AGE, UNRESERVED_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},
-	{"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},
-	{"connect", CONNECT_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-	{"connection", CONNECTION, UNRESERVED_KEYWORD},
-	{"constraint", CONSTRAINT, RESERVED_KEYWORD},
-	{"constraints", CONSTRAINTS, UNRESERVED_KEYWORD},
-	{"content", CONTENT_P, UNRESERVED_KEYWORD},
-	{"conversion", CONVERSION_P, UNRESERVED_KEYWORD},
-	{"convert", CONVERT_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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, RESERVED_KEYWORD},
-    {"current", CURRENT_P, UNRESERVED_KEYWORD},
-    {"current_date", CURRENT_DATE, RESERVED_KEYWORD},
-    {"current_role", CURRENT_ROLE, RESERVED_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},
-    {"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},
-    {"distributed", DISTRIBUTED_GP, UNRESERVED_KEYWORD}, /* Greenplum 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},
-    {"exec", EXEC_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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, UNRESERVED_KEYWORD},
-	{"fillfactor", FILLFACTOR, UNRESERVED_KEYWORD},
-	{"first", FIRST_P, UNRESERVED_KEYWORD},
-	{"float", FLOAT_P, COL_NAME_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},
-	{"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},
-    {"log", LOG_P_GP, RESERVED_KEYWORD},  /* Greenplum Keyword */
-	{"login", LOGIN_P, UNRESERVED_KEYWORD},
-    {"long", LONG_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"mapping", MAPPING, UNRESERVED_KEYWORD},
-    {"match", MATCH, UNRESERVED_KEYWORD},
-    {"maxvalue", MAXVALUE, UNRESERVED_KEYWORD},
-    {"minus", MINUS_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"nocache", NOCACHE_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"number", NUMBER_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"or", OR, RESERVED_KEYWORD},
-    {"order", ORDER, RESERVED_KEYWORD},
-    {"out", OUT_P, COL_NAME_KEYWORD},
-    {"outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD},
-    {"overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD},
-    {"overlay", OVERLAY, COL_NAME_KEYWORD},
-    {"owned", OWNED, UNRESERVED_KEYWORD},
-    {"owner", OWNER, UNRESERVED_KEYWORD},
-    {"package", PACKAGE_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"parser", PARSER, UNRESERVED_KEYWORD},
-    {"partial", PARTIAL, UNRESERVED_KEYWORD},
-    {"password", PASSWORD, UNRESERVED_KEYWORD},
-    {"placing", PLACING, RESERVED_KEYWORD},
-    {"plans", PLANS, UNRESERVED_KEYWORD},
-    {"pls_integer", PLS_INTEGER_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"position", POSITION, COL_NAME_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},
-    {"raw", RAW_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"read", READ, UNRESERVED_KEYWORD},
-    {"real", REAL, COL_NAME_KEYWORD},
-    {"reassign", REASSIGN, UNRESERVED_KEYWORD},
-    {"recheck", RECHECK, 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},
-    {"return", RETURN_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"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},
-    {"smalldatetime", SMALLDATETIME_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"smallfloat", SMALLFLOAT_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"smallint", SMALLINT, COL_NAME_KEYWORD},
-    {"smallmoney", SMALLMONEY_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"sysdate", SYSDATE_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"sysid", SYSID, UNRESERVED_KEYWORD},
-    {"system", SYSTEM_P, UNRESERVED_KEYWORD},
-    {"systimestamp", SYSTIMESTAMP_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"tinyint", TINYINT_EDB, RESERVED_KEYWORD}, /* EnterpriseDB Keyword */
-    {"tinytext", TINYTEXT_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-    {"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},
-    {"varchar2", VARCHAR2_EDB, RESERVED_KEYWORD}, /* EnterpriseDB 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},
-
-    /*
-     * XXX we mark WITH as reserved to force it to be quoted in dumps, even
-     * though it is currently unreserved according to gram.y.  This is because
-     * we expect we'll have to make it reserved to implement SQL WITH clauses.
-     * If that patch manages to do without reserving WITH, adjust this entry
-     * at that time; in any case this should be back in sync with gram.y after
-     * WITH clauses are implemented.
-     */
-    {"window", WINDOW, RESERVED_KEYWORD},
-    {"with", WITH, RESERVED_KEYWORD},
-    {"without", WITHOUT, UNRESERVED_KEYWORD},
-    {"work", WORK, 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},
+const ScanKeyword ScanKeywordsExtra[] = {
+	PG_KEYWORD("connect", CONNECT_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("convert", CONVERT_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("distributed", DISTRIBUTED_GP, UNRESERVED_KEYWORD)
+	PG_KEYWORD("exec", EXEC_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("log", LOG_P_GP, UNRESERVED_KEYWORD)
+	PG_KEYWORD("long", LONG_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("minus", MINUS_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("nocache", NOCACHE_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("number", NUMBER_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("package", PACKAGE_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("pls_integer", PLS_INTEGER_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("raw", RAW_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("return", RETURN_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("smalldatetime", SMALLDATETIME_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("smallfloat", SMALLFLOAT_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("smallmoney", SMALLMONEY_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("sysdate", SYSDATE_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("systimestap", SYSTIMESTAMP_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("tinyint", TINYINT_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("tinytext", TINYTEXT_EDB, RESERVED_KEYWORD)
+	PG_KEYWORD("varchar2", VARCHAR2_EDB, RESERVED_KEYWORD)
 };
+const int NumScanKeywordsExtra = lengthof(ScanKeywordsExtra);
 
 /*
  * ScanKeywordLookup - see if a given word is a keyword
@@ -512,5 +166,26 @@ ScanKeywordLookup(const char *text)
             high = middle - 1;
     }
 
+	/*
+	 * If not found, also do a binary search in the list of extra
+	 * keywords.
+	 */
+    low = &ScanKeywordsExtra[0];
+    high = endof(ScanKeywordsExtra) - 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;
 }
diff --git a/pgadmin/include/parser/keywords.h b/pgadmin/include/parser/keywords.h
index 9cb842d..b9c0a33 100644
--- a/pgadmin/include/parser/keywords.h
+++ b/pgadmin/include/parser/keywords.h
@@ -15,10 +15,7 @@
 ///////////////////////////////////////////////////////////////////////////
 //
 // pgAdmin note: This file is based on src/include/parser/keywords.h from
-//               PostgreSQL. It should be periodically updated to include 
-//               new keywords. struct ScanKeyword and the declaration of 
-//               ScanKeywordLookup originate in this file, whilst the enum
-//               yytokentype is copied from src/include/parser/parse.h
+//               PostgreSQL.
 //
 //               This file is under the BSD licence, per PostgreSQL.
 ///////////////////////////////////////////////////////////////////////////
@@ -41,443 +38,8 @@ typedef struct ScanKeyword
 
 extern const ScanKeyword *ScanKeywordLookup(const char *text);
 
-/* Put the tokens into the symbol table, so that GDB and other debuggers
-  know about them.  */
-
-/* PGADMIN NOTE:
- *   There are a number of EnterpriseDB tokens added to the end of this list!!
- */
-
-enum yytokentype {
- ABORT_P = 258,
- ABSOLUTE_P = 259,
- ACCESS = 260,
- ACTION = 261,
- ADD_P = 262,
- ADMIN = 263,
- AFTER = 264,
- AGGREGATE = 265,
- ALL = 266,
- ALSO = 267,
- ALTER = 268,
- ALWAYS = 269,
- ANALYSE = 270,
- ANALYZE = 271,
- AND = 272,
- ANY = 273,
- ARRAY = 274,
- AS = 275,
- ASC = 276,
- ASSERTION = 277,
- ASSIGNMENT = 278,
- ASYMMETRIC = 279,
- AT = 280,
- AUTHORIZATION = 281,
- BACKWARD = 282,
- BEFORE = 283,
- BEGIN_P = 284,
- BETWEEN = 285,
- BIGINT = 286,
- BINARY = 287,
- BIT = 288,
- BOOLEAN_P = 289,
- BOTH = 290,
- BY = 291,
- CACHE = 292,
- CALLED = 293,
- CASCADE = 294,
- CASCADED = 295,
- CASE = 296,
- CAST = 297,
- CHAIN = 298,
- CHAR_P = 299,
- CHARACTER = 300,
- CHARACTERISTICS = 301,
- CHECK = 302,
- CHECKPOINT = 303,
- CLASS = 304,
- CLOSE = 305,
- CLUSTER = 306,
- COALESCE = 307,
- COLLATE = 308,
- COLUMN = 309,
- COMMENT = 310,
- COMMIT = 311,
- COMMITTED = 312,
- CONCURRENTLY = 313,
- CONFIGURATION = 314,
- CONNECTION = 315,
- CONSTRAINT = 316,
- CONSTRAINTS = 317,
- CONTENT_P = 318,
- CONVERSION_P = 319,
- COPY = 320,
- COST = 321,
- CREATE = 322,
- CREATEDB = 323,
- CREATEROLE = 324,
- CREATEUSER = 325,
- CROSS = 326,
- CSV = 327,
- CURRENT_P = 328,
- CURRENT_DATE = 329,
- CURRENT_ROLE = 330,
- CURRENT_TIME = 331,
- CURRENT_TIMESTAMP = 332,
- CURRENT_USER = 333,
- CURSOR = 334,
- CYCLE = 335,
- DATABASE = 336,
- DAY_P = 337,
- DEALLOCATE = 338,
- DEC = 339,
- DECIMAL_P = 340,
- DECLARE = 341,
- DEFAULT = 342,
- DEFAULTS = 343,
- DEFERRABLE = 344,
- DEFERRED = 345,
- DEFINER = 346,
- DELETE_P = 347,
- DELIMITER = 348,
- DELIMITERS = 349,
- DESC = 350,
- DICTIONARY = 351,
- DISABLE_P = 352,
- DISCARD = 353,
- DISTINCT = 354,
- DO = 355,
- DOCUMENT_P = 356,
- DOMAIN_P = 357,
- DOUBLE_P = 358,
- DROP = 359,
- EACH = 360,
- ELSE = 361,
- ENABLE_P = 362,
- ENCODING = 363,
- ENCRYPTED = 364,
- END_P = 365,
- ENUM_P = 366,
- ESCAPE = 367,
- EXCEPT = 368,
- EXCLUDING = 369,
- EXCLUSIVE = 370,
- EXECUTE = 371,
- EXISTS = 372,
- EXPLAIN = 373,
- EXTERNAL = 374,
- EXTRACT = 375,
- FALSE_P = 376,
- FAMILY = 377,
- FETCH = 378,
- FIRST_P = 379,
- FLOAT_P = 380,
- FOR = 381,
- FORCE = 382,
- FOREIGN = 383,
- FORWARD = 384,
- FREEZE = 385,
- FROM = 386,
- FULL = 387,
- FUNCTION = 388,
- GLOBAL = 389,
- GRANT = 390,
- GRANTED = 391,
- GREATEST = 392,
- GROUP_P = 393,
- HANDLER = 394,
- HAVING = 395,
- HEADER_P = 396,
- HOLD = 397,
- HOUR_P = 398,
- IF_P = 399,
- ILIKE = 400,
- IMMEDIATE = 401,
- IMMUTABLE = 402,
- IMPLICIT_P = 403,
- IN_P = 404,
- INCLUDING = 405,
- INCREMENT = 406,
- INDEX = 407,
- INDEXES = 408,
- INHERIT = 409,
- INHERITS = 410,
- INITIALLY = 411,
- INNER_P = 412,
- INOUT = 413,
- INPUT_P = 414,
- INSENSITIVE = 415,
- INSERT = 416,
- INSTEAD = 417,
- INT_P = 418,
- INTEGER = 419,
- INTERSECT = 420,
- INTERVAL = 421,
- INTO = 422,
- INVOKER = 423,
- IS = 424,
- ISNULL = 425,
- ISOLATION = 426,
- JOIN = 427,
- KEY = 428,
- LANCOMPILER = 429,
- LANGUAGE = 430,
- LARGE_P = 431,
- LAST_P = 432,
- LEADING = 433,
- LEAST = 434,
- LEFT = 435,
- LEVEL = 436,
- LIKE = 437,
- LIMIT = 438,
- LISTEN = 439,
- LOAD = 440,
- LOCAL = 441,
- LOCALTIME = 442,
- LOCALTIMESTAMP = 443,
- LOCATION = 444,
- LOCK_P = 445,
- LOGIN_P = 446,
- MAPPING = 447,
- MATCH = 448,
- MAXVALUE = 449,
- MINUTE_P = 450,
- MINVALUE = 451,
- MODE = 452,
- MONTH_P = 453,
- MOVE = 454,
- NAME_P = 455,
- NAMES = 456,
- NATIONAL = 457,
- NATURAL = 458,
- NCHAR = 459,
- NEW = 460,
- NEXT = 461,
- NO = 462,
- NOCREATEDB = 463,
- NOCREATEROLE = 464,
- NOCREATEUSER = 465,
- NOINHERIT = 466,
- NOLOGIN_P = 467,
- NONE = 468,
- NOSUPERUSER = 469,
- NOT = 470,
- NOTHING = 471,
- NOTIFY = 472,
- NOTNULL = 473,
- NOWAIT = 474,
- NULL_P = 475,
- NULLIF = 476,
- NULLS_P = 477,
- NUMERIC = 478,
- OBJECT_P = 479,
- OF = 480,
- OFF = 481,
- OFFSET = 482,
- OIDS = 483,
- OLD = 484,
- ON = 485,
- ONLY = 486,
- OPERATOR = 487,
- OPTION = 488,
- OR = 489,
- ORDER = 490,
- OUT_P = 491,
- OUTER_P = 492,
- OVERLAPS = 493,
- OVERLAY = 494,
- OWNED = 495,
- OWNER = 496,
- PARSER = 497,
- PARTIAL = 498,
- PASSWORD = 499,
- PLACING = 500,
- PLANS = 501,
- POSITION = 502,
- PRECISION = 503,
- PRESERVE = 504,
- PREPARE = 505,
- PREPARED = 506,
- PRIMARY = 507,
- PRIOR = 508,
- PRIVILEGES = 509,
- PROCEDURAL = 510,
- PROCEDURE = 511,
- QUOTE = 512,
- READ = 513,
- REAL = 514,
- REASSIGN = 515,
- RECHECK = 516,
- REFERENCES = 517,
- REINDEX = 518,
- RELATIVE_P = 519,
- RELEASE = 520,
- RENAME = 521,
- REPEATABLE = 522,
- REPLACE = 523,
- REPLICA = 524,
- RESET = 525,
- RESTART = 526,
- RESTRICT = 527,
- RETURNING = 528,
- RETURNS = 529,
- REVOKE = 530,
- RIGHT = 531,
- ROLE = 532,
- ROLLBACK = 533,
- ROW = 534,
- ROWS = 535,
- RULE = 536,
- SAVEPOINT = 537,
- SCHEMA = 538,
- SCROLL = 539,
- SEARCH = 540,
- SECOND_P = 541,
- SECURITY = 542,
- SELECT = 543,
- SEQUENCE = 544,
- SERIALIZABLE = 545,
- SESSION = 546,
- SESSION_USER = 547,
- SET = 548,
- SETOF = 549,
- SHARE = 550,
- SHOW = 551,
- SIMILAR = 552,
- SIMPLE = 553,
- SMALLINT = 554,
- SOME = 555,
- STABLE = 556,
- STANDALONE_P = 557,
- START = 558,
- STATEMENT = 559,
- STATISTICS = 560,
- STDIN = 561,
- STDOUT = 562,
- STORAGE = 563,
- STRICT_P = 564,
- STRIP_P = 565,
- SUBSTRING = 566,
- SUPERUSER_P = 567,
- SYMMETRIC = 568,
- SYSID = 569,
- SYSTEM_P = 570,
- TABLE = 571,
- TABLESPACE = 572,
- TEMP = 573,
- TEMPLATE = 574,
- TEMPORARY = 575,
- TEXT_P = 576,
- THEN = 577,
- TIME = 578,
- TIMESTAMP = 579,
- TO = 580,
- TRAILING = 581,
- TRANSACTION = 582,
- TREAT = 583,
- TRIGGER = 584,
- TRIM = 585,
- TRUE_P = 586,
- TRUNCATE = 587,
- TRUSTED = 588,
- TYPE_P = 589,
- UNCOMMITTED = 590,
- UNENCRYPTED = 591,
- UNION = 592,
- UNIQUE = 593,
- UNKNOWN = 594,
- UNLISTEN = 595,
- UNTIL = 596,
- UPDATE = 597,
- USER = 598,
- USING = 599,
- VACUUM = 600,
- VALID = 601,
- VALIDATOR = 602,
- VALUE_P = 603,
- VALUES = 604,
- VARCHAR = 605,
- VARYING = 606,
- VERBOSE = 607,
- VERSION_P = 608,
- VIEW = 609,
- VOLATILE = 610,
- WHEN = 611,
- WHERE = 612,
- WHITESPACE_P = 613,
- WITH = 614,
- WITHOUT = 615,
- WORK = 616,
- WRITE = 617,
- XML_P = 618,
- XMLATTRIBUTES = 619,
- XMLCONCAT = 620,
- XMLELEMENT = 621,
- XMLFOREST = 622,
- XMLPARSE = 623,
- XMLPI = 624,
- XMLROOT = 625,
- XMLSERIALIZE = 626,
- YEAR_P = 627,
- YES_P = 628,
- ZONE = 629,
- NULLS_FIRST = 630,
- NULLS_LAST = 631,
- WITH_CASCADED = 632,
- WITH_LOCAL = 633,
- WITH_CHECK = 634,
- IDENT = 635,
- FCONST = 636,
- SCONST = 637,
- BCONST = 638,
- XCONST = 639,
- Op = 640,
- ICONST = 641,
- PARAM = 642,
- POSTFIXOP = 643,
- UMINUS = 644,
- TYPECAST = 645,
- CTYPE=646,
- WINDOW=647,
-
- /* The following additions are unreserved keywords for autovacuum settings */
- AUTOVACUUM_E=700,
- AUTOVACUUM_V_TH=701,
- AUTOVACUUM_A_TH=702,
- AUTOVACUUM_V_SC_F=703,
- AUTOVACUUM_A_SC_F=704,
- AUTOVACUUM_V_COST_D=705,
- AUTOVACUUM_V_COST_L=705,
- AUTOVACUUM_F_MIN_AGE=706,
- AUTOVACUUM_F_MAX_AGE=707,
- AUTOVACUUM_F_TBL_AGE=707,
- FILLFACTOR=707,
-
- /* The following additions are keywords in EnterpriseDB */
- CONNECT_EDB = 800,
- CONVERT_EDB = 801,
- MINUS_EDB = 802,
- NUMBER_EDB = 803,
- PACKAGE_EDB = 804,
- SMALLDATETIME_EDB = 805,
- SMALLFLOAT_EDB = 806,
- SMALLMONEY_EDB = 807,
- TINYINT_EDB = 808,
- TINYTEXT_EDB = 809,
- VARCHAR2_EDB = 810,
- EXEC_EDB = 811,
- LONG_EDB = 812,
- NOCACHE_EDB = 813,
- PLS_INTEGER_EDB = 814,
- RAW_EDB = 815,
- RETURN_EDB = 816,
- SYSDATE_EDB = 817,
- SYSTIMESTAMP_EDB = 818,
-
- /* The following additions are keywords in Greenplum Database */
- DISTRIBUTED_GP = 900,
- LOG_P_GP = 901
-
-};
-
+extern const ScanKeyword ScanKeywords[];
+extern const ScanKeyword ScanKeywordsExtra[];
+extern const int NumScanKeywords;
+extern const int NumScanKeywordsExtra;
 #endif   /* KEYWORDS_H */
diff --git a/pgadmin/utils/misc.cpp b/pgadmin/utils/misc.cpp
index f64e48e..8ebb4f4 100644
--- a/pgadmin/utils/misc.cpp
+++ b/pgadmin/utils/misc.cpp
@@ -307,16 +307,16 @@ wxString qtDbStringDollar(const wxString &value)
 void FillKeywords(wxString &str)
 {
     // unfortunately, the keyword list is static. 
-    // If the first or the last word change, these both need to get updated.
-    const ScanKeyword *keyword=ScanKeywordLookup("abort");
-    const ScanKeyword *last=ScanKeywordLookup("zone");
+    int i;
 
-    wxASSERT(keyword && last);
+    str = wxString();
 
-    str = wxString::FromAscii(keyword->name);
-
-    while (keyword++ < last)
-        str += wxT(" ") + wxString::FromAscii(keyword->name);
+    for (i = 0; i < NumScanKeywords; i++) {
+        str += wxT(" ") + wxString::FromAscii(ScanKeywords[i].name);
+    }
+    for (i = 0; i < NumScanKeywordsExtra; i++) {
+        str += wxT(" ") + wxString::FromAscii(ScanKeywordsExtra[i].name);
+    }
 }
 
 
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to