@@ -3172,11 +3172,16 @@ MtmGenerateGid(char* gid)
3172
3172
3173
3173
static bool MtmTwoPhaseCommit (MtmCurrentTrans * x )
3174
3174
{
3175
- if (MtmUtilityStmt && ! MyXactAccessedTempRel )
3175
+ if (MyXactAccessedTempRel )
3176
3176
{
3177
- MtmProcessDDLCommand (MtmUtilityStmt );
3178
- pfree (MtmUtilityStmt );
3179
- MtmUtilityStmt = NULL ;
3177
+ /*
3178
+ * XXX: this tx anyway goes to subscribers later, but without
3179
+ * surrounding begin/commit. Probably there is more clever way
3180
+ * to do that.
3181
+ */
3182
+ x -> isDistributed = false;
3183
+ x -> csn = NULL ;
3184
+ return false;
3180
3185
}
3181
3186
3182
3187
if (!x -> isReplicated && (x -> isDistributed && x -> containsDML )) {
@@ -3245,15 +3250,15 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3245
3250
case T_CreateTableSpaceStmt :
3246
3251
case T_AlterTableSpaceOptionsStmt :
3247
3252
case T_TruncateStmt :
3248
- case T_CommentStmt : /* XXX: we could replicate these */ ;
3253
+ case T_CommentStmt :
3249
3254
case T_PrepareStmt :
3250
3255
case T_ExecuteStmt :
3251
3256
case T_DeallocateStmt :
3252
3257
case T_NotifyStmt :
3253
3258
case T_ListenStmt :
3254
3259
case T_UnlistenStmt :
3255
3260
case T_LoadStmt :
3256
- case T_ClusterStmt : /* XXX: we could replicate these */ ;
3261
+ case T_ClusterStmt :
3257
3262
case T_VacuumStmt :
3258
3263
case T_ExplainStmt :
3259
3264
case T_VariableShowStmt :
@@ -3263,6 +3268,16 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3263
3268
case T_ReindexStmt :
3264
3269
skipCommand = true;
3265
3270
break ;
3271
+
3272
+ /* Do not skip following unless temp object was accessed */
3273
+ case T_CreateTableAsStmt :
3274
+ case T_CreateStmt :
3275
+ case T_ViewStmt :
3276
+ case T_IndexStmt :
3277
+ case T_DropStmt :
3278
+ break ;
3279
+
3280
+ /* Save GUC context for consequent DDL execution */
3266
3281
case T_DiscardStmt :
3267
3282
{
3268
3283
DiscardStmt * stmt = (DiscardStmt * ) parsetree ;
@@ -3279,8 +3294,6 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3279
3294
{
3280
3295
VariableSetStmt * stmt = (VariableSetStmt * ) parsetree ;
3281
3296
3282
- // skipCommand = true;
3283
-
3284
3297
/* Prevent SET TRANSACTION from replication */
3285
3298
if (stmt -> kind == VAR_SET_MULTI )
3286
3299
skipCommand = true;
@@ -3292,88 +3305,8 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3292
3305
}
3293
3306
}
3294
3307
break ;
3295
- case T_CreateTableAsStmt :
3296
- // {
3297
- // /* Do not replicate temp tables */
3298
- // CreateTableAsStmt *stmt = (CreateTableAsStmt *) parsetree;
3299
- // skipCommand = stmt->into->rel->relpersistence == RELPERSISTENCE_TEMP ||
3300
- // (stmt->into->rel->schemaname && strcmp(stmt->into->rel->schemaname, "pg_temp") == 0);
3301
- // }
3302
- break ;
3303
- case T_CreateStmt :
3304
- {
3305
- /* Do not replicate temp tables */
3306
- CreateStmt * stmt = (CreateStmt * ) parsetree ;
3307
- skipCommand = stmt -> relation -> relpersistence == RELPERSISTENCE_TEMP ||
3308
- (stmt -> relation -> schemaname && strcmp (stmt -> relation -> schemaname , "pg_temp" ) == 0 );
3309
- }
3310
- break ;
3311
- case T_ViewStmt :
3312
- {
3313
- ViewStmt * stmt = (ViewStmt * ) parsetree ;
3314
- Query * viewParse ;
3315
-
3316
- viewParse = parse_analyze ((Node * ) copyObject (stmt -> query ),
3317
- queryString , NULL , 0 );
3318
- skipCommand = isQueryUsingTempRelation (viewParse ) ||
3319
- stmt -> view -> relpersistence == RELPERSISTENCE_TEMP ;
3320
- // ||
3321
- // (stmt->relation->schemaname && strcmp(stmt->relation->schemaname, "pg_temp") == 0);
3322
- }
3323
- break ;
3324
- case T_IndexStmt :
3325
- {
3326
- Oid relid ;
3327
- Relation rel ;
3328
- IndexStmt * stmt = (IndexStmt * ) parsetree ;
3329
- bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL );
3330
3308
3331
- if (stmt -> concurrent )
3332
- PreventTransactionChain (isTopLevel ,
3333
- "CREATE INDEX CONCURRENTLY" );
3334
-
3335
- relid = RelnameGetRelid (stmt -> relation -> relname );
3336
-
3337
- if (OidIsValid (relid ))
3338
- {
3339
- rel = heap_open (relid , ShareLock );
3340
- skipCommand = rel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3341
- heap_close (rel , ShareLock );
3342
- }
3343
- }
3344
- break ;
3345
- case T_DropStmt :
3346
- {
3347
- DropStmt * stmt = (DropStmt * ) parsetree ;
3348
-
3349
- if (stmt -> removeType == OBJECT_TABLE )
3350
- {
3351
- RangeVar * rv = makeRangeVarFromNameList (
3352
- (List * ) lfirst (list_head (stmt -> objects )));
3353
- Oid relid = RelnameGetRelid (rv -> relname );
3354
-
3355
- if (OidIsValid (relid ))
3356
- {
3357
- Relation rel = heap_open (relid , ShareLock );
3358
- skipCommand = rel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3359
- heap_close (rel , ShareLock );
3360
- }
3361
- }
3362
- else if (stmt -> removeType == OBJECT_INDEX )
3363
- {
3364
- RangeVar * rv = makeRangeVarFromNameList (
3365
- (List * ) lfirst (list_head (stmt -> objects )));
3366
- Oid relid = RelnameGetRelid (rv -> relname );
3367
-
3368
- if (OidIsValid (relid ))
3369
- {
3370
- Relation irel = index_open (relid , ShareLock );
3371
- skipCommand = irel -> rd_rel -> relpersistence == RELPERSISTENCE_TEMP ;
3372
- index_close (irel , ShareLock );
3373
- }
3374
- }
3375
- }
3376
- break ;
3309
+ /* Copy need some special care */
3377
3310
case T_CopyStmt :
3378
3311
{
3379
3312
CopyStmt * copyStatement = (CopyStmt * ) parsetree ;
@@ -3404,20 +3337,9 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
3404
3337
if (context == PROCESS_UTILITY_TOPLEVEL )
3405
3338
{
3406
3339
if (!skipCommand && !MtmTx .isReplicated ) {
3407
- // if (MtmProcessDDLCommand(queryString)) {
3408
- // return;
3409
- // }
3410
-
3411
- MemoryContext oldcontext ;
3412
-
3413
- if (MtmUtilityStmt )
3414
- pfree (MtmUtilityStmt );
3415
-
3416
- oldcontext = MemoryContextSwitchTo (TopMemoryContext );
3417
- MtmUtilityStmt = palloc (strlen (queryString ) + 1 );
3418
- MemoryContextSwitchTo (oldcontext );
3419
-
3420
- strncpy (MtmUtilityStmt , queryString , strlen (queryString ) + 1 );
3340
+ if (MtmProcessDDLCommand (queryString )) {
3341
+ return ;
3342
+ }
3421
3343
}
3422
3344
}
3423
3345
0 commit comments