diff options
author | Tatsuo Ishii <ishii@postgresql.org> | 2002-08-06 05:40:47 +0000 |
---|---|---|
committer | Tatsuo Ishii <ishii@postgresql.org> | 2002-08-06 05:40:47 +0000 |
commit | 6206a880cf233e5bf70a0ced6be810c399c7e006 (patch) | |
tree | b4bd3ace547b4e06fad5503a9c3aad633b2a05c6 /src/backend/parser | |
parent | 34f03b1630254af7ec64c8da45d93ef6ef7e4870 (diff) |
Add SQL99 CONVERT() function.
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 61 | ||||
-rw-r--r-- | src/backend/parser/keywords.c | 3 |
2 files changed, 59 insertions, 5 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 5c77aebfe62..f57f461124d 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.356 2002/08/05 02:30:50 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.357 2002/08/06 05:40:45 ishii Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -53,6 +53,7 @@ #include "access/htup.h" #include "catalog/index.h" #include "catalog/namespace.h" +#include "catalog/pg_conversion.h" #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/params.h" @@ -216,7 +217,8 @@ static void doNegateFloat(Value *v); insert_target_list, def_list, opt_indirection, group_clause, TriggerFuncArgs, select_limit, opt_select_limit, opclass_item_list, trans_options, - TableFuncElementList, OptTableFuncElementList + TableFuncElementList, OptTableFuncElementList, + convert_args %type <range> into_clause, OptTempTableName @@ -232,7 +234,7 @@ static void doNegateFloat(Value *v); %type <jtype> join_type %type <list> extract_list, overlay_list, position_list -%type <list> substr_list, trim_list +%type <list> substr_list, trim_list, convert_list %type <ival> opt_interval %type <node> overlay_placing, substr_from, substr_for @@ -329,7 +331,7 @@ static void doNegateFloat(Value *v); CACHE, CALLED, CASCADE, CASE, CAST, CHAIN, CHAR_P, CHARACTER, CHARACTERISTICS, CHECK, CHECKPOINT, CLASS, CLOSE, CLUSTER, COALESCE, COLLATE, COLUMN, COMMENT, COMMIT, - COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, COPY, CREATE, CREATEDB, + COMMITTED, CONSTRAINT, CONSTRAINTS, CONVERSION_P, CONVERT, COPY, CREATE, CREATEDB, CREATEUSER, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE, @@ -6253,6 +6255,15 @@ c_expr: columnref { $$ = (Node *) $1; } n->agg_distinct = FALSE; $$ = (Node *)n; } + | CONVERT '(' convert_list ')' + { + FuncCall *n = makeNode(FuncCall); + n->funcname = SystemFuncName("convert"); + n->args = $3; + n->agg_star = FALSE; + n->agg_distinct = FALSE; + $$ = (Node *)n; + } | select_with_parens %prec UMINUS { SubLink *n = makeNode(SubLink); @@ -6418,6 +6429,48 @@ trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); } | expr_list { $$ = $1; } ; +/* CONVERT() arguments. We accept followings: + * SQL99 syntax + * o CONVERT(TEXT string USING conversion_name) + * + * Function calls + * o CONVERT(TEXT string, NAME src_encoding_name, NAME dest_encoding_name) + * o CONVERT(TEXT string, NAME encoding_name) + */ +convert_list: + a_expr USING any_name + { + Oid oid = FindConversionByName($3); + Const *convoid = makeNode(Const); + + if (!OidIsValid(oid)) + { + elog(ERROR, "Conversion \"%s\" does not exist", + NameListToString($3)); + } + + convoid->consttype = OIDOID; + convoid->constlen = sizeof(Oid); + convoid->constvalue = oid; + convoid->constisnull = FALSE; + convoid->constbyval = TRUE; + convoid->constisset = FALSE; + convoid->constiscast = FALSE; + $$ = makeList2($1, convoid); + } + | convert_args + { + $$ = $1; + } + | /*EMPTY*/ + { $$ = NIL; } + ; + +convert_args: a_expr { $$ = makeList1($1); } + | convert_args ',' a_expr { $$ = lappend($1, $3); } + ; + + in_expr: select_with_parens { SubLink *n = makeNode(SubLink); diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 32733d8f546..2ae62ac18d9 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.123 2002/07/29 22:14:11 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.124 2002/08/06 05:40:45 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -80,6 +80,7 @@ static const ScanKeyword ScanKeywords[] = { {"constraint", CONSTRAINT}, {"constraints", CONSTRAINTS}, {"conversion", CONVERSION_P}, + {"convert", CONVERT}, {"copy", COPY}, {"create", CREATE}, {"createdb", CREATEDB}, |