@@ -3045,11 +3045,16 @@ MtmGenerateGid(char* gid)
3045
3045
3046
3046
static bool MtmTwoPhaseCommit (MtmCurrentTrans * x )
3047
3047
{
3048
- if (MtmUtilityStmt && ! MyXactAccessedTempRel )
3048
+ if (MyXactAccessedTempRel )
3049
3049
{
3050
- MtmProcessDDLCommand (MtmUtilityStmt );
3051
- pfree (MtmUtilityStmt );
3052
- MtmUtilityStmt = NULL ;
3050
+ /*
3051
+ * XXX: this tx anyway goes to subscribers later, but without
3052
+ * surrounding begin/commit. Probably there is more clever way
3053
+ * to do that.
3054
+ */
3055
+ x -> isDistributed = false;
3056
+ x -> csn = NULL ;
3057
+ return false;
3053
3058
}
3054
3059
3055
3060
if (!x -> isReplicated && (x -> isDistributed && x -> containsDML )) {
@@ -3122,15 +3127,15 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3122
3127
case T_CreateTableSpaceStmt :
3123
3128
case T_AlterTableSpaceOptionsStmt :
3124
3129
case T_TruncateStmt :
3125
- case T_CommentStmt : /* XXX: we could replicate these */ ;
3130
+ case T_CommentStmt :
3126
3131
case T_PrepareStmt :
3127
3132
case T_ExecuteStmt :
3128
3133
case T_DeallocateStmt :
3129
3134
case T_NotifyStmt :
3130
3135
case T_ListenStmt :
3131
3136
case T_UnlistenStmt :
3132
3137
case T_LoadStmt :
3133
- case T_ClusterStmt : /* XXX: we could replicate these */ ;
3138
+ case T_ClusterStmt :
3134
3139
case T_VacuumStmt :
3135
3140
case T_ExplainStmt :
3136
3141
case T_VariableShowStmt :
@@ -3140,6 +3145,16 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3140
3145
case T_ReindexStmt :
3141
3146
skipCommand = true;
3142
3147
break ;
3148
+
3149
+ /* Do not skip following unless temp object was accessed */
3150
+ case T_CreateTableAsStmt :
3151
+ case T_CreateStmt :
3152
+ case T_ViewStmt :
3153
+ case T_IndexStmt :
3154
+ case T_DropStmt :
3155
+ break ;
3156
+
3157
+ /* Save GUC context for consequent DDL execution */
3143
3158
case T_DiscardStmt :
3144
3159
{
3145
3160
DiscardStmt * stmt = (DiscardStmt * ) parsetree ;
@@ -3156,8 +3171,6 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3156
3171
{
3157
3172
VariableSetStmt * stmt = (VariableSetStmt * ) parsetree ;
3158
3173
3159
- // skipCommand = true;
3160
-
3161
3174
/* Prevent SET TRANSACTION from replication */
3162
3175
if (stmt -> kind == VAR_SET_MULTI )
3163
3176
skipCommand = true;
@@ -3169,88 +3182,8 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3169
3182
}
3170
3183
}
3171
3184
break ;
3172
- case T_CreateTableAsStmt :
3173
- // {
3174
- // /* Do not replicate temp tables */
3175
- // CreateTableAsStmt *stmt = (CreateTableAsStmt *) parsetree;
3176
- // skipCommand = stmt->into->rel->relpersistence == RELPERSISTENCE_TEMP ||
3177
- // (stmt->into->rel->schemaname && strcmp(stmt->into->rel->schemaname, "pg_temp") == 0);
3178
- // }
3179
- break ;
3180
- case T_CreateStmt :
3181
- {
3182
- /* Do not replicate temp tables */
3183
- CreateStmt * stmt = (CreateStmt * ) parsetree ;
3184
- skipCommand = stmt -> relation -> relpersistence == RELPERSISTENCE_TEMP ||
3185
- (stmt -> relation -> schemaname && strcmp (stmt -> relation -> schemaname , "pg_temp" ) == 0 );
3186
- }
3187
- break ;
3188
- case T_ViewStmt :
3189
- {
3190
- ViewStmt * stmt = (ViewStmt * ) parsetree ;
3191
- Query * viewParse ;
3192
-
3193
- viewParse = parse_analyze ((Node * ) copyObject (stmt -> query ),
3194
- queryString , NULL , 0 );
3195
- skipCommand = isQueryUsingTempRelation (viewParse ) ||
3196
- stmt -> view -> relpersistence == RELPERSISTENCE_TEMP ;
3197
- // ||
3198
- // (stmt->relation->schemaname && strcmp(stmt->relation->schemaname, "pg_temp") == 0);
3199
- }
3200
- break ;
3201
- case T_IndexStmt :
3202
- {
3203
- Oid relid ;
3204
-
341A
Relation rel ;
3205
- IndexStmt * stmt = (IndexStmt * ) parsetree ;
3206
- bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL );
3207
3185
3208
- if (stmt -> concurrent )
3209
- PreventTransactionChain (isTopLevel ,
3210
- "CREATE INDEX CONCURRENTLY" );
3211
-
3212
- relid = RelnameGetRelid (stmt -> relation -> relname );
3213
-
3214
- if (OidIsValid (relid ))
3215
- {
3216
- rel = heap_open (relid , ShareLock );
3217
- skipCommand = rel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3218
- heap_close (rel , ShareLock );
3219
- }
3220
- }
3221
- break ;
3222
- case T_DropStmt :
3223
- {
3224
- DropStmt * stmt = (DropStmt * ) parsetree ;
3225
-
3226
- if (stmt -> removeType == OBJECT_TABLE )
3227
- {
3228
- RangeVar * rv = makeRangeVarFromNameList (
3229
- (List * ) lfirst (list_head (stmt -> objects )));
3230
- Oid relid = RelnameGetRelid (rv -> relname );
3231
-
3232
- if (OidIsValid (relid ))
3233
- {
3234
- Relation rel = heap_open (relid , ShareLock );
3235
- skipCommand = rel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3236
- heap_close (rel , ShareLock );
3237
- }
3238
- }
3239
- else if (stmt -> removeType == OBJECT_INDEX )
3240
- {
3241
- RangeVar * rv = makeRangeVarFromNameList (
3242
- (List * ) lfirst (list_head (stmt -> objects )));
3243
- Oid relid = RelnameGetRelid (rv -> relname );
3244
-
3245
- if (OidIsValid (relid ))
3246
- {
3247
- Relation irel = index_open (relid , ShareLock );
3248
- skipCommand = irel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3249
- index_close (irel , ShareLock );
3250
- }
3251
- }
3252
- }
3253
- break ;
3186
+ /* Copy need some special care */
3254
3187
case T_CopyStmt :
3255
3188
{
3256
3189
CopyStmt * copyStatement = (CopyStmt * ) parsetree ;
@@ -3281,20 +3214,9 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3281
3214
if (context == PROCESS_UTILITY_TOPLEVEL )
3282
3215
{
3283
3216
if (!skipCommand && !MtmTx .isReplicated ) {
3284
- // if (MtmProcessDDLCommand(queryString)) {
3285
- // return;
3286
- // }
3287
-
3288
- MemoryContext oldcontext ;
3289
-
3290
- if (MtmUtilityStmt )
3291
- pfree (MtmUtilityStmt );
3292
-
3293
- oldcontext = MemoryContextSwitchTo (TopMemoryContext );
3294
- MtmUtilityStmt = palloc (strlen (queryString ) + 1 );
3295
- MemoryContextSwitchTo (oldcontext );
3296
-
3297
- strncpy (MtmUtilityStmt , queryString , strlen (queryString ) + 1 );
3217
+ if (MtmProcessDDLCommand (queryString )) {
3218
+ return ;
3219
+ }
3298
3220
}
3299
3221
}
3300
3222
0 commit comments