Hello, I'm sending part of the code that I've done and is available for reviewing and I'm asking for your comments and some help because I'm new to PostgreSQL.
Proposal: http://archives.postgresql.org/pgsql-hackers/2008-05/msg00857.php The code contains changes of parser, pg_collation catalog, parsenodes.h for CREATE COLLATION... and DROP COLLATION statements. Questions that I would like to know answers: 1) Should I move DROP statement from DropCollationStmt to DropStmt? Some statements are seperated and some are included in DropStmt? Is there any reason for that? 2) What type should all names in CREATE and DROP statement in gram.y have? I've chosen qualified_name but I know it's not the best choice. 3) All collations are created from existing collations. How do I ensure that the collation already exists? Is there any possibility to define it in gram.y? 4) For further functionality development is there anything more needed than adding T_CreateCollationStmt and T_DropCollationStmt to /src/backend/tcop/utility.c, and write functionality into collation.c? 5) Also can you look at the pg_catalog and tell me if anything is wrong with it? Thank you for all your replies in advance. Regards Radek Strnad
Index: backend/parser/keywords.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/parser/keywords.c,v retrieving revision 1.194 diff -c -r1.194 keywords.c *** backend/parser/keywords.c 1 Jan 2008 19:45:50 -0000 1.194 --- backend/parser/keywords.c 1 Jul 2008 14:29:26 -0000 *************** *** 33,38 **** --- 33,39 ---- /* name, value, category */ {"abort", ABORT_P, UNRESERVED_KEYWORD}, {"absolute", ABSOLUTE_P, UNRESERVED_KEYWORD}, + {"accent", ACCENT, UNRESERVED_KEYWORD}, {"access", ACCESS, UNRESERVED_KEYWORD}, {"action", ACTION, UNRESERVED_KEYWORD}, {"add", ADD_P, UNRESERVED_KEYWORD}, *************** *** 81,87 **** {"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}, --- 82,89 ---- {"close", CLOSE, UNRESERVED_KEYWORD}, {"cluster", CLUSTER, UNRESERVED_KEYWORD}, {"coalesce", COALESCE, COL_NAME_KEYWORD}, ! {"collate", COLLATE, UNRESERVED_KEYWORD}, ! {"collation", COLLATION, UNRESERVED_KEYWORD}, {"column", COLUMN, RESERVED_KEYWORD}, {"comment", COMMENT, UNRESERVED_KEYWORD}, {"commit", COMMIT, UNRESERVED_KEYWORD}, *************** *** 206,211 **** --- 208,215 ---- {"language", LANGUAGE, UNRESERVED_KEYWORD}, {"large", LARGE_P, UNRESERVED_KEYWORD}, {"last", LAST_P, UNRESERVED_KEYWORD}, + {"lccollate", LCCOLLATE, UNRESERVED_KEYWORD}, + {"lcctype", LCCTYPE, UNRESERVED_KEYWORD}, {"leading", LEADING, RESERVED_KEYWORD}, {"least", LEAST, COL_NAME_KEYWORD}, {"left", LEFT, TYPE_FUNC_NAME_KEYWORD}, *************** *** 270,275 **** --- 274,280 ---- {"overlay", OVERLAY, COL_NAME_KEYWORD}, {"owned", OWNED, UNRESERVED_KEYWORD}, {"owner", OWNER, UNRESERVED_KEYWORD}, + {"pad", PAD, UNRESERVED_KEYWORD}, {"parser", PARSER, UNRESERVED_KEYWORD}, {"partial", PARTIAL, UNRESERVED_KEYWORD}, {"password", PASSWORD, UNRESERVED_KEYWORD}, *************** *** 317,322 **** --- 322,328 ---- {"second", SECOND_P, UNRESERVED_KEYWORD}, {"security", SECURITY, UNRESERVED_KEYWORD}, {"select", SELECT, RESERVED_KEYWORD}, + {"sensitive", SENSITIVE, UNRESERVED_KEYWORD}, {"sequence", SEQUENCE, UNRESERVED_KEYWORD}, {"serializable", SERIALIZABLE, UNRESERVED_KEYWORD}, {"session", SESSION, UNRESERVED_KEYWORD}, *************** *** 329,334 **** --- 335,341 ---- {"simple", SIMPLE, UNRESERVED_KEYWORD}, {"smallint", SMALLINT, COL_NAME_KEYWORD}, {"some", SOME, RESERVED_KEYWORD}, + {"space", SPACE, UNRESERVED_KEYWORD}, {"stable", STABLE, UNRESERVED_KEYWORD}, {"standalone", STANDALONE_P, UNRESERVED_KEYWORD}, {"start", START, UNRESERVED_KEYWORD}, *************** *** 337,342 **** --- 344,350 ---- {"stdin", STDIN, UNRESERVED_KEYWORD}, {"stdout", STDOUT, UNRESERVED_KEYWORD}, {"storage", STORAGE, UNRESERVED_KEYWORD}, + {"strcolfn", STRCOLFN, UNRESERVED_KEYWORD}, {"strict", STRICT_P, UNRESERVED_KEYWORD}, {"strip", STRIP_P, UNRESERVED_KEYWORD}, {"substring", SUBSTRING, COL_NAME_KEYWORD}, Index: backend/parser/gram.y =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v retrieving revision 2.605 diff -c -r2.605 gram.y *** backend/parser/gram.y 1 Jan 2008 19:45:50 -0000 2.605 --- backend/parser/gram.y 1 Jul 2008 14:29:25 -0000 *************** *** 149,168 **** } %type <node> stmt schema_stmt ! AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt ! AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt ! AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt ! AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt ! ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt ! CreateDomainStmt CreateGroupStmt CreateOpClassStmt ! CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt ! CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt ! DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt ! DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt ! DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt ! GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt LockStmt NotifyStmt ExplainableStmt PreparableStmt CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt --- 149,167 ---- } %type <node> stmt schema_stmt ! AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt ! AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt ! AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AnalyzeStmt ! ClosePortalStmt ClusterStmt CommentStmt ConstraintsSetStmt CopyStmt ! CreateAsStmt CreateCastStmt CreateCollationStmt CreateDomainStmt ! CreateGroupStmt CreateOpClassStmt CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt ! CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt ! DropCollationStmt DropGroupStmt DropOpClassStmt DropOpFamilyStmt ! DropPLangStmt DropStmt DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt ! DropRoleStmt DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt ! FetchStmt GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt LockStmt NotifyStmt ExplainableStmt PreparableStmt CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt *************** *** 290,295 **** --- 289,297 ---- %type <list> OptSeqList %type <defelt> OptSeqElem + %type <list> OptCollationList + %type <defelt> OptCollationElem + %type <istmt> insert_rest %type <vsetstmt> set_rest SetResetClause *************** *** 366,372 **** */ /* ordinary key words in alphabetical order */ ! %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION --- 368,374 ---- */ /* ordinary key words in alphabetical order */ ! %token <keyword> ABORT_P ABSOLUTE_P ACCENT ACCESS ACTION ADD_P ADMIN AFTER AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION *************** *** 375,381 **** CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE ! CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONVERSION_P COPY COST CREATE CREATEDB CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE --- 377,383 ---- CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE ! CLUSTER COALESCE COLLATE COLLATION COLUMN COMMENT COMMIT COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONVERSION_P COPY COST CREATE CREATEDB CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE *************** *** 404,410 **** KEY ! LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOGIN_P --- 406,412 ---- KEY ! LANCOMPILER LANGUAGE LARGE_P LAST_P LCCOLLATE LCCTYPE LEADING LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOGIN_P *************** *** 417,423 **** OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER ! PARSER PARTIAL PASSWORD PLACING PLANS POSITION PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE --- 419,425 ---- OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER ! PAD PARSER PARTIAL PASSWORD PLACING PLANS POSITION PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE *************** *** 427,437 **** REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROW ROWS RULE ! SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE ! SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE ! SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT ! STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P ! SYMMETRIC SYSID SYSTEM_P TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P --- 429,439 ---- REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROW ROWS RULE ! SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SENSITIVE ! SEQUENCE SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE ! SHOW SIMILAR SIMPLE SMALLINT SOME SPACE STABLE STANDALONE_P START STATEMENT ! STATISTICS STDIN STDOUT STORAGE STRCOLFN STRICT_P STRIP_P SUBSTRING ! SUPERUSER_P SYMMETRIC SYSID SYSTEM_P TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P *************** *** 552,557 **** --- 554,560 ---- | CreateAsStmt | CreateAssertStmt | CreateCastStmt + | CreateCollationStmt | CreateConversionStmt | CreateDomainStmt | CreateFunctionStmt *************** *** 575,580 **** --- 578,584 ---- | DiscardStmt | DropAssertStmt | DropCastStmt + | DropCollationStmt | DropGroupStmt | DropOpClassStmt | DropOpFamilyStmt *************** *** 2410,2415 **** --- 2414,2497 ---- } ; + /***************************************************************************** + * + * QUERY : + * + * CREATE COLLATION <collation name> FOR <character set specification> + * FROM <existing collation name> [STRCOLFN <fn name>] + * [ <pad characteristic> ] [ <case sensitive> ] [ <accent sensitive> ] + * [ LCCOLLATE <lc_collate> ] [ LCCTYPE <lc_ctype> ] + * + * DROP COLLATION <collation name> + * + *****************************************************************************/ + + CreateCollationStmt: + CREATE COLLATION qualified_name FOR qualified_name FROM qualified_name OptCollationList + { + CreateCollationStmt *n = makeNode(CreateCollationStmt); + n->name = $3; + n->for_charset = $5; + n->from_collation = $7; + n->options = $8; + $$ = (Node *)n; + } + ; + + OptCollationList: + OptCollationList OptCollationElem { $$ = lappend($1, $2); } + | /*EMPTY*/ { $$ = NIL; } + ; + + OptCollationElem: + NO PAD + { + $$ = makeDefElem("pad_characteristic", (Node *)makeInteger(FALSE)); + } + | PAD SPACE + { + $$ = makeDefElem("pad_characteristic", (Node *)makeInteger(TRUE)); + } + | CASE SENSITIVE + { + $$ = makeDefElem("case_sensitive", (Node *)makeInteger(TRUE)); + } + | CASE INSENSITIVE + { + $$ = makeDefElem("case_sensitive", (Node *)makeInteger(FALSE)); + } + | ACCENT SENSITIVE + { + $$ = makeDefElem("accent_sensitive", (Node *)makeInteger(TRUE)); + } + | ACCENT INSENSITIVE + { + $$ = makeDefElem("accent_sensitive", (Node *)makeInteger(FALSE)); + } + | LCCOLLATE qualified_name + { + $$ = makeDefElem("lc_collate_name", (Node *)makeString($2)); + } + | LCCTYPE qualified_name + { + $$ = makeDefElem("lc_ctype_name", (Node *)makeString($2)); + } + | STRCOLFN qualified_name + { + $$ = makeDefElem("str_col_function", (Node *)makeString($2)); + } + ; + + DropCollationStmt: + DROP COLLATION name + { + DropCollationStmt *n = makeNode(DropCollationStmt); + n->name = $3; + $$ = (Node *)n; + } + ; + /***************************************************************************** * *************** *** 5349,5354 **** --- 5431,5444 ---- { $$ = makeDefElem("encoding", NULL); } + | COLLATE opt_equal qualified_name + { + $$ = makeDefElem("collate", (Node *)makeString($3)); + } + | COLLATE opt_equal DEFAULT + { + $$ = makeDefElem("collate", NULL); + } | CONNECTION LIMIT opt_equal SignedIconst { $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4)); *************** *** 9001,9006 **** --- 9091,9097 ---- unreserved_keyword: ABORT_P | ABSOLUTE_P + | ACCENT | ACCESS | ACTION | ADD_P *************** *** 9027,9032 **** --- 9118,9125 ---- | CLASS | CLOSE | CLUSTER + | COLLATE + | COLLATION | COMMENT | COMMIT | COMMITTED *************** *** 9106,9111 **** --- 9199,9206 ---- | LANGUAGE | LARGE_P | LAST_P + | LCCOLLATE + | LCCTYPE | LEVEL | LISTEN | LOAD *************** *** 9142,9147 **** --- 9237,9243 ---- | OPTION | OWNED | OWNER + | PAD | PARSER | PARTIAL | PASSWORD *************** *** 9179,9184 **** --- 9275,9281 ---- | SEARCH | SECOND_P | SECURITY + | SENSITIVE | SEQUENCE | SERIALIZABLE | SESSION *************** *** 9186,9191 **** --- 9283,9289 ---- | SHARE | SHOW | SIMPLE + | SPACE | STABLE | STANDALONE_P | START *************** *** 9194,9199 **** --- 9292,9298 ---- | STDIN | STDOUT | STORAGE + | STRCOLFN | STRICT_P | STRIP_P | SUPERUSER_P *************** *** 9345,9351 **** | CASE | CAST | CHECK - | COLLATE | COLUMN | CONSTRAINT | CREATE --- 9444,9449 ---- Index: include/nodes/nodes.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/nodes/nodes.h,v retrieving revision 1.205 diff -c -r1.205 nodes.h *** include/nodes/nodes.h 1 Jan 2008 19:45:58 -0000 1.205 --- include/nodes/nodes.h 1 Jul 2008 14:29:26 -0000 *************** *** 313,318 **** --- 313,320 ---- T_CreateEnumStmt, T_AlterTSDictionaryStmt, T_AlterTSConfigurationStmt, + T_CreateCollationStmt, + T_DropCollationStmt, /* * TAGS FOR PARSE TREE NODES (parsenodes.h) Index: include/nodes/parsenodes.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v retrieving revision 1.358 diff -c -r1.358 parsenodes.h *** include/nodes/parsenodes.h 1 Jan 2008 19:45:58 -0000 1.358 --- include/nodes/parsenodes.h 1 Jul 2008 14:29:31 -0000 *************** *** 1198,1203 **** --- 1198,1227 ---- bool skip_validation; /* skip validation of existing rows? */ } FkConstraint; + /* ---------------------- + * Create/Drop Collation Statements + * ---------------------- + */ + + typedef struct CreateCollationStmt + { + NodeTag type; + char *name; + char *for_charset; + char *from_collation; + List *options; + + } CreateCollationStmt; + + typedef struct DropCollationStmt + { + NodeTag type; + char *name; + + } DropCollationStmt; + + + /* ---------------------- * Create/Drop Table Space Statements Index: src/include/catalog/pg_collation.h =================================================================== RCS file: src/include/catalog/pg_collation.h diff -N src/include/catalog/pg_collation.h *** /dev/null 1 Jan 1970 00:00:00 -0000 --- src/include/catalog/pg_collation.h 1 Jan 1970 00:00:00 -0000 *************** *** 0 **** --- 1,101 ---- + /*------------------------------------------------------------------------- + * + * pg_collation.h + * definition of the system "collation" relation (pg_collation) + * along with the relation's initial contents. + * + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/include/catalog/pg_depend.h,v 1.1 2008/04/10 19:45:56 momjian Exp $ + * + * NOTES + * the genbki.sh script reads this file and generates .bki + * information from the DATA() statements. + * + *------------------------------------------------------------------------- + */ + + #ifndef PG_COLLATION_H + #define PG_COLLATION_H + + /* ---------------- + * postgres.h contains the system type definitions and the + * CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file + * can be read by both genbki.sh and the C compiler. + * ---------------- + */ + + /* ---------------- + * pg_collation definition. cpp turns this into + * typedef struct FormData_pg_depend + * ---------------- + */ + + #define CollationRelationId 2978 + + enum { + PAD_CHARACTERISTIC_NO_PAD = 0; + PAD_CHARACTERISTIC_PAD_SPACE = 1; + + } CollationPadCharacteristic; + + enum { + CASE_INSENSITIVE = 0; + CASE_SENSITIVE = 1; + + } CollationCaseSensitive; + + enum { + ACCENT_INSENSITIVE = 0; + ACCENT_SENSITIVE = 1; + + } CollationAccentSensitive; + + + CATALOG (pg_collation, 2978) + { + NameData colname; /* collation name */ + Oid colschema; /* collation schema */ + NameData colcharset; /* character set specification */ + Oid colexistingcollation; /* existing collation */ + bool colpadattribute; /* pad attribute */ + bool colcasesensitive; /* case sensitive */ + bool colaccentsensitive; /* accent sensitive */ + NameData colcollate; /* lc_collate */ + NameData colctype; /* lc_ctype */ + regproc colfunc; /* used collation function */ + + } FormData_pg_collation; + + /* ---------------- + * Form_pg_collation corresponds to a pointer to a tuple with + * the format of pg_collation relation. + * ---------------- + */ + typedef FormData_pg_collation *Form_pg_collation; + + /* ---------------- + * compiler constants for pg_collation + * ---------------- + */ + #define Natts_pg_collation 10 + #define Anum_pg_collation_colname 1 + #define Anum_pg_collation_colschema 2 + #define Anum_pg_collation_colcharset 3 + #define Anum_pg_collation_colexistingcollation 4 + #define Anum_pg_collation_colpadattribute 5 + #define Anum_pg_collation_colcasesensitive 6 + #define Anum_pg_collation_colaccentsensitive 7 + #define Anum_pg_collation_colcollate 8 + #define Anum_pg_collation_colctype 9 + #define Anum_pg_collation_colfunc 10 + + /* ---------------- + * initial contents of pg_collation + * ---------------- + */ + + + #endif /* PG_COLLATION_H */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers