1023
1048
_outTypeName(String *str, TypeName *node)
1028
foreach (lc, node->names)
1051
/* don't quote SystemType name, because
1052
* 1. char is not "char".
1053
* 2. in 8.4, interval with fields cause error.
1054
* =# SELECT '1'::"interval" year;
1055
* ERROR: syntax error at or near "year"
1056
* LINE 1: SELECT '1'::"interval" year;
1058
if (list_length(node->names) == 2 &&
1059
strcmp("pg_catalog", strVal(linitial(node->names))) == 0)
1061
string_append_char(str, strVal(lsecond(node->names)));
1063
if (strcmp("interval", strVal(lsecond(node->names))) == 0)
1065
if (node->typmods != NIL)
1067
A_Const *v = (A_Const *) linitial(node->typmods);
1068
int mask = v->val.val.ival;
1070
/* precision for SECOND field.
1071
* backword comaptibility.
1072
* use `'1.2 second'::interval(0) second'
1073
* not `'1.2 second'::interval second(0)'(standarad for 8.4).
1075
if ((INTERVAL_MASK(SECOND) & mask) &&
1076
list_length(node->typmods) == 2)
1078
string_append_char(str, "(");
1079
_outAConst(str, lsecond(node->typmods));
1080
string_append_char(str, ")");
1083
/* optional fields */
1084
if (mask == INTERVAL_MASK(YEAR))
1085
string_append_char(str, " YEAR");
1086
else if (mask == INTERVAL_MASK(MONTH))
1087
string_append_char(str, " MONTH");
1088
else if (mask == INTERVAL_MASK(DAY))
1089
string_append_char(str, " DAY");
1090
else if (mask == INTERVAL_MASK(HOUR))
1091
string_append_char(str, " HOUR");
1092
else if (mask == INTERVAL_MASK(MINUTE))
1093
string_append_char(str, " MINUTE");
1094
else if (mask == INTERVAL_MASK(SECOND))
1095
string_append_char(str, " SECOND");
1096
else if (mask == (INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH)))
1097
string_append_char(str, " YEAR TO MONTH");
1098
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)))
1099
string_append_char(str, " DAY TO HOUR");
1100
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) |
1101
INTERVAL_MASK(MINUTE)))
1102
string_append_char(str, " DAY TO MINUTE");
1103
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) |
1104
INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND)))
1105
string_append_char(str, " DAY TO SECOND");
1106
else if (mask == (INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)))
1107
string_append_char(str, " HOUR TO MINUTE");
1108
else if (mask == (INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) |
1109
INTERVAL_MASK(SECOND)))
1110
string_append_char(str, " HOUR TO SECOND");
1111
else if (mask == (INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND)))
1112
string_append_char(str, " MINUTE TO SECOND");
1030
Value *v = (Value *) lfirst(lc);
1031
char *typename = v->val.str;
1036
string_append_char(str, ".");
1037
if(node->typemod < 0)
1123
foreach (lc, node->names)
1039
string_append_char(str, "\"");
1040
string_append_char(str, typename);
1041
string_append_char(str, "\"");
1043
string_append_char(str, typename);
1125
Value *v = (Value *) lfirst(lc);
1126
char *typename = v->val.str;
1131
string_append_char(str, ".");
1132
if(node->typemod < 0)
1134
string_append_char(str, "\"");
1135
string_append_char(str, typename);
1136
string_append_char(str, "\"");
1138
string_append_char(str, typename);
1046
if (node->typemod > 0)
1050
string_append_char(str, "(");
1051
snprintf(buf, 16, "%d", ((node->typemod - VARHDRSZ) >> 16) & 0x00FF);
1052
string_append_char(str, buf);
1053
lower = (node->typemod-VARHDRSZ) & 0x00FF;
1058
string_append_char(str, ",");
1059
snprintf(buf2, 16, "%d",lower);
1060
string_append_char(str, buf2);
1063
string_append_char(str, ")");
1145
string_append_char(str, "(");
1146
_outList(str, node->typmods);
1147
string_append_char(str, ")");
1099
_outSortClause(String *str, SortClause *node)
1182
_outWithClause(String *str, WithClause *node)
1184
string_append_char(str, " WITH ");
1185
if (node->recursive)
1186
string_append_char(str, "RECURSIVE ");
1188
_outList(str, node->ctes);
1105
_outGroupClause(String *str, GroupClause *node)
1192
_outCommonTableExpr(String *str, CommonTableExpr *node)
1194
string_append_char(str, "\"");
1195
string_append_char(str, node->ctename);
1196
string_append_char(str, "\" ");
1198
if (node->aliascolnames)
1200
string_append_char(str, "(");
1201
_outIdList(str, node->aliascolnames);
1202
string_append_char(str, ") ");
1205
string_append_char(str, "AS (");
1206
_outNode(str, node->ctequery);
1207
string_append_char(str, ")");
1326
if (name && (strcmp(name, "interval") == 0) &&
1327
node->typename->typmods)
1329
A_Const *v = linitial(node->typename->typmods);
1330
int mask = v->val.val.ival;
1332
if (mask == INTERVAL_MASK(YEAR))
1333
string_append_char(str, " YEAR");
1334
else if (mask == INTERVAL_MASK(MONTH))
1335
string_append_char(str, " MONTH");
1336
else if (mask == INTERVAL_MASK(DAY))
1337
string_append_char(str, " DAY");
1338
else if (mask == INTERVAL_MASK(HOUR))
1339
string_append_char(str, " HOUR");
1340
else if (mask == INTERVAL_MASK(MINUTE))
1341
string_append_char(str, " MINUTE");
1342
else if (mask == INTERVAL_MASK(SECOND))
1343
string_append_char(str, " SECOND");
1344
else if (mask == (INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH)))
1345
string_append_char(str, " YEAR TO MONTH");
1346
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)))
1347
string_append_char(str, " DAY TO HOUR");
1348
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) |
1349
INTERVAL_MASK(MINUTE)))
1350
string_append_char(str, " DAY TO MINUTE");
1351
else if (mask == (INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) |
1352
INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND)))
1353
string_append_char(str, " DAY TO SECOND");
1354
else if (mask == (INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)))
1355
string_append_char(str, " HOUR TO MINUTE");
1356
else if (mask == (INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) |
1357
INTERVAL_MASK(SECOND)))
1358
string_append_char(str, " HOUR TO SECOND");
1472
_outWindowDef(String *str, WindowDef *node)
1476
string_append_char(str, "\"");
1477
string_append_char(str, node->name);
1478
string_append_char(str, "\" AS ");
1480
string_append_char(str, "(");
1484
string_append_char(str, "\"");
1485
string_append_char(str, node->refname);
1486
string_append_char(str, "\" ");
1489
if (node->partitionClause)
1491
string_append_char(str, " PARTITION BY ");
1492
_outNode(str, node->partitionClause);
1495
if (node->orderClause)
1497
string_append_char(str, " ORDER BY ");
1498
_outNode(str, node->orderClause);
1501
if (node->frameOptions != FRAMEOPTION_DEFAULTS)
1503
if (node->frameOptions & FRAMEOPTION_RANGE)
1504
string_append_char(str, " RANGE");
1505
else if (node->frameOptions & FRAMEOPTION_ROWS)
1506
string_append_char(str, " ROWS");
1508
if (node->frameOptions & FRAMEOPTION_BETWEEN)
1509
string_append_char(str, " BETWEEN");
1511
if (node->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
1512
string_append_char(str, " UNBOUNDED PRECEDING");
1513
else if (node->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
1514
string_append_char(str, " UNBOUNDED FOLLOWING");
1515
else if (node->frameOptions & FRAMEOPTION_START_CURRENT_ROW)
1516
string_append_char(str, " UNBOUNDED CURRENT ROW");
1518
if (node->frameOptions & FRAMEOPTION_BETWEEN)
1520
string_append_char(str, " AND");
1521
if (node->frameOptions & FRAMEOPTION_END_UNBOUNDED_PRECEDING)
1522
string_append_char(str, " UNBOUNDED PRECEDING");
1523
else if (node->frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING)
1524
string_append_char(str, " UNBOUNDED FOLLOWING");
1525
else if (node->frameOptions & FRAMEOPTION_END_CURRENT_ROW)
1526
string_append_char(str, " UNBOUNDED CURRENT ROW");
1529
string_append_char(str, ")");
1407
1533
_outConstraint(String *str, Constraint *node)
1409
1535
if (node->name)
1834
1960
static void _outListenStmt(String *str, ListenStmt *node)
1836
1962
string_append_char(str, "LISTEN ");
1837
_outNode(str, node->relation);
1963
string_append_char(str, "\"");
1964
string_append_char(str, node->conditionname);
1965
string_append_char(str, "\"");
1840
1968
static void _outUnlistenStmt(String *str, UnlistenStmt *node)
1842
1970
string_append_char(str, "UNLISTEN ");
1843
_outNode(str, node->relation);
1971
if (node->conditionname == NULL)
1972
string_append_char(str, "*");
1974
string_append_char(str, "\"");
1975
string_append_char(str, node->conditionname);
1976
string_append_char(str, "\"");
1846
1980
static void _outLoadStmt(String *str, LoadStmt *node)
2867
3001
string_append_char(str, "AFTER ");
2869
len = strlen(node->actions);
2870
for (i = 0; i < len; i++)
2873
string_append_char(str, "OR ");
2875
if (node->actions[i] == 'i')
2876
string_append_char(str, "INSERT ");
2877
else if (node->actions[i] == 'd')
2878
string_append_char(str, "DELETE ");
2880
string_append_char(str, "UPDATE ");
3003
if (node->events & TRIGGER_TYPE_INSERT)
3006
string_append_char(str, "OR ");
3007
string_append_char(str, "INSERT ");
3010
if (node->events & TRIGGER_TYPE_DELETE)
3013
string_append_char(str, "OR ");
3014
string_append_char(str, "DELETE ");
3017
if (node->events & TRIGGER_TYPE_UPDATE)
3020
string_append_char(str, "OR ");
3021
string_append_char(str, "UPDATE ");
3024
if (node->events & TRIGGER_TYPE_TRUNCATE)
3027
string_append_char(str, "OR ");
3028
string_append_char(str, "TRUNCATE ");
2883
3032
string_append_char(str, "ON ");
3314
_outPrivTarget(String *str, PrivTarget *node)
3465
_outPrivGrantee(String *str, PrivGrantee *node)
3467
if (node->rolname == NULL)
3468
string_append_char(str, "PUBLIC");
3471
string_append_char(str, "\"");
3472
string_append_char(str, node->rolname);
3473
string_append_char(str, "\"");
3478
_outGrantStmt(String *str, GrantStmt *node)
3480
if (node->is_grant == true)
3481
string_append_char(str, "GRANT ");
3484
string_append_char(str, "REVOKE ");
3485
if (node->grant_option == true)
3486
string_append_char(str, "GRANT OPTION FOR ");
3489
_outPrivilegeList(str, node->privileges);
3491
string_append_char(str, " ON ");
3316
3493
switch (node->objtype)
3318
3495
case ACL_OBJECT_RELATION:
3319
_outNode(str, node->objs);
3496
_outNode(str, node->objects);
3322
3499
case ACL_OBJECT_SEQUENCE:
3323
3500
string_append_char(str, "SEQUENCE ");
3324
_outNode(str, node->objs);
3501
_outNode(str, node->objects);
3327
3504
case ACL_OBJECT_FUNCTION:
3328
3505
string_append_char(str, "FUNCTION ");
3329
_outNode(str, node->objs);
3506
_outNode(str, node->objects);
3332
3509
case ACL_OBJECT_DATABASE:
3333
3510
string_append_char(str, "DATABASE ");
3334
_outIdList(str, node->objs);
3511
_outIdList(str, node->objects);
3337
3514
case ACL_OBJECT_LANGUAGE:
3338
3515
string_append_char(str, "LANGUAGE ");
3339
_outIdList(str, node->objs);
3516
_outIdList(str, node->objects);
3342
3519
case ACL_OBJECT_NAMESPACE:
3343
3520
string_append_char(str, "SCHEMA ");
3344
_outIdList(str, node->objs);
3521
_outIdList(str, node->objects);
3347
3524
case ACL_OBJECT_TABLESPACE:
3348
3525
string_append_char(str, "TABLESPACE ");
3349
_outIdList(str, node->objs);
3526
_outIdList(str, node->objects);
3355
_outPrivGrantee(String *str, PrivGrantee *node)
3357
if (node->rolname == NULL)
3358
string_append_char(str, "PUBLIC");
3361
string_append_char(str, "\"");
3362
string_append_char(str, node->rolname);
3363
string_append_char(str, "\"");
3368
_outGrantStmt(String *str, GrantStmt *node)
3372
if (node->is_grant == true)
3373
string_append_char(str, "GRANT ");
3376
string_append_char(str, "REVOKE ");
3377
if (node->grant_option == true)
3378
string_append_char(str, "GRANT OPTION FOR ");
3381
_outPrivilegeList(str, node->privileges);
3383
string_append_char(str, " ON ");
3385
n = makeNode(PrivTarget);
3386
n->objtype = node->objtype;
3387
n->objs = node->objects;
3391
3530
if (node->is_grant == true)
3392
3531
string_append_char(str, " TO ");
3718
3857
case OBJECT_CONVERSION:
3719
string_append_char(str, "CONVERSION ");
3720
_outFuncName(str, node->object);
3721
string_append_char(str, " OWNER TO \"");
3858
string_append_char(str, "CONVERSION \"");
3859
string_append_char(str, strVal(linitial(node->object)));
3860
string_append_char(str, "\" OWNER TO \"");
3722
3861
string_append_char(str, node->newowner);
3723
3862
string_append_char(str, "\"");
3726
3865
case OBJECT_DATABASE:
3727
3866
string_append_char(str, "DATABASE \"");
3728
_outIdList(str, node->object);
3867
string_append_char(str, strVal(linitial(node->object)));
3729
3868
string_append_char(str, "\" OWNER TO \"");
3730
3869
string_append_char(str, node->newowner);
3731
3870
string_append_char(str, "\"");
3734
3873
case OBJECT_DOMAIN:
3735
string_append_char(str, "DOMAIN ");
3736
_outFuncName(str, node->object);
3737
string_append_char(str, " OWNER TO \"");
3874
string_append_char(str, "DOMAIN \"");
3875
string_append_char(str, strVal(linitial(node->object)));
3876
string_append_char(str, "\" OWNER TO \"");
3738
3877
string_append_char(str, node->newowner);
3739
3878
string_append_char(str, "\"");
3769
3916
string_append_char(str, "\"");
3919
case OBJECT_OPFAMILY:
3920
string_append_char(str, "OPERATOR FAMILY ");
3921
_outFuncName(str, node->object);
3922
string_append_char(str, " USING ");
3923
string_append_char(str, node->addname);
3924
string_append_char(str, " OWNER TO \"");
3925
string_append_char(str, node->newowner);
3926
string_append_char(str, "\"");
3772
3929
case OBJECT_SCHEMA:
3773
3930
string_append_char(str, "SCHEMA \"");
3774
string_append_char(str, linitial(node->object));
3931
string_append_char(str, strVal(linitial(node->object)));
3775
3932
string_append_char(str, "\" OWNER TO \"");
3776
3933
string_append_char(str, node->newowner);
3777
3934
string_append_char(str, "\"");
3780
3937
case OBJECT_TYPE:
3781
string_append_char(str, "TYPE ");
3782
_outFuncName(str, node->object);
3783
string_append_char(str, " OWNER TO \"");
3938
string_append_char(str, "TYPE \"");
3939
string_append_char(str, strVal(linitial(node->object)));
3940
string_append_char(str, "\" OWNER TO \"");
3784
3941
string_append_char(str, node->newowner);
3785
3942
string_append_char(str, "\"");
3788
3945
case OBJECT_TABLESPACE:
3789
3946
string_append_char(str, "TABLESPACE \"");
3790
string_append_char(str, linitial(node->object));
3947
string_append_char(str, strVal(linitial(node->object)));
3948
string_append_char(str, "\" OWNER TO \"");
3949
string_append_char(str, node->newowner);
3950
string_append_char(str, "\"");
3953
case OBJECT_TSDICTIONARY:
3954
string_append_char(str, "TEXT SEARCH DICTIONARY \"");
3955
string_append_char(str, strVal(linitial(node->object)));
3956
string_append_char(str, "\" OWNER TO \"");
3957
string_append_char(str, node->newowner);
3958
string_append_char(str, "\"");
3961
case OBJECT_TSCONFIGURATION:
3962
string_append_char(str, "TEXT SEARCH CONFIGURATION \"");
3963
string_append_char(str, strVal(linitial(node->object)));
3964
string_append_char(str, "\" OWNER TO \"");
3965
string_append_char(str, node->newowner);
3966
string_append_char(str, "\"");
3970
string_append_char(str, "FOREIGN DATA WRAPPER \"");
3971
string_append_char(str, strVal(linitial(node->object)));
3972
string_append_char(str, "\" OWNER TO \"");
3973
string_append_char(str, node->newowner);
3974
string_append_char(str, "\"");
3977
case OBJECT_FOREIGN_SERVER:
3978
string_append_char(str, "SERVER \"");
3979
string_append_char(str, strVal(linitial(node->object)));
3791
3980
string_append_char(str, "\" OWNER TO \"");
3792
3981
string_append_char(str, node->newowner);
3793
3982
string_append_char(str, "\"");