Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uNRHD-0023VJ-1D for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Jun 2025 07:14:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uNRHA-0050uE-P7 for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Jun 2025 07:14:05 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uNRHA-0050u6-CA for pgsql-hackers@lists.postgresql.org; Fri, 06 Jun 2025 07:14:05 +0000 Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uNRH9-000VKs-0f for pgsql-hackers@lists.postgresql.org; Fri, 06 Jun 2025 07:14:04 +0000 Received: by mail-vk1-xa2b.google.com with SMTP id 71dfb90a1353d-52934f4fb23so1325985e0c.1 for ; Fri, 06 Jun 2025 00:14:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749194040; x=1749798840; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ZawurEjWp9nsmp5gN7uzz7tS+4+p+35XjQOuVTpbSCE=; b=W/FDttNVxJBZDJZB/YvGQVQfWa259VojaV/Rb9QdKSC0tJLjaWM23PJb1wzFsBpNZw YFqlJiegVbQ/HDqPBAgAFYp9ILdj7Q252W0JPT5uhZh9dc4EX2x5NDMiSkFtoMolzCwZ 8NLdLKksuyxZHqeLBHniEHY6XAKz4llUyt8b5cbnI517nDPRfVQhI1sBMszqq3mu9r5a BnLp9w77W89cuQrNfjNLOCILnAo1oDhEn4yyQYaNxE/K5En4oGPt/1gUbIFdua50Hnm/ onx/MKenVAyAfkAoEzR5NObmpa3gQOXW2ucY8gG4cqstPBiSoc93d1OvqMIia85j0w+q y7sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749194040; x=1749798840; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZawurEjWp9nsmp5gN7uzz7tS+4+p+35XjQOuVTpbSCE=; b=rSHa69CnK6R/ZCMoEIMEjzqDywFWrmGK8QNg5Dfp0aQb7/aqvd4u63SD/6lVW5iGoh mWBhv9Byhfj61tRMiingpivpreyXO7sSxvEAuE8cev7wS0h1jnwnpaITGNY1Um0jtHZC A6lhKiNhwfONErsBj8HRrpYXWAGYn9+xhw2DRGi0ap0IDspS6xvVxNhtJ5nV3xlTcWEr M51ZskkzyitlgH0UW26hy4ZJFGFI8akeJpEEE3Im1RQyM8V/bwnSSaCFGBoMk+g8JAQn I5bm+r9m2q8f25sSm7qrknMFlBc/SEgCrbcrClwiypAlfx2vRzy44Vbk/ABhY07ul1hw PS3g== X-Gm-Message-State: AOJu0YxiC779NqaXyT4HReGGzWhVdo4xzSdIVlEhGPkzxbGNzj3bKMi9 BwlLp3FAJRiUWzAVPiZ6G8iJ0skPirU9BKWCfKpgePFyx0+Ye9BQSgwI3fTIvZDrcdPiEn7XAHR 5p70g1ZF0QPHDt/BZ+R4Ys0d3QCQ3uw0pppJqXwnMkg== X-Gm-Gg: ASbGnctw5HzkJ7Utqf1H+tw0TUBpV0qk8/Xcw23hrJDZvd4fka4vsmexqT1P+Pmqh7n 1IiRKO4+pjNBBr7ayNCB9xODYi+cHESej4UJh/lGWQk1tBk/NfGHdtZzpYh9FinitizyQ/eYgMc ZYTA+UjbTIaK87YuT2X/H6qRaANS53iLM+m6axcauaTulBHB9zzHkuwyb6VI41ceG2EdxUDF0SE gk= X-Google-Smtp-Source: AGHT+IF+7nI4quiVTlehElFSs9QHiiRDnTFKTntIpio3IKa7EAOw+9gDP5/Kzx+kafHjv1aYkTj64+IWwwrEryp/Xh8= X-Received: by 2002:a05:6122:308b:b0:530:2c65:5bb9 with SMTP id 71dfb90a1353d-530e48b0c9cmr2035585e0c.8.1749194039662; Fri, 06 Jun 2025 00:13:59 -0700 (PDT) MIME-Version: 1.0 References: <171085360143.2046436.7217841141682511557.pgcf@coridan.postgresql.org> <859476bf-3cb0-455e-b093-b8ab5ef17f0e@postgrespro.ru> <4e2764f7-f6be-478f-8d7f-f921dbd10f5f@postgrespro.ru> <7fdaf3e8-4c05-4739-bee6-98acc068d1c7@postgrespro.ru> <4433b492-9e97-4334-96d9-ddaaa5083099@postgrespro.ru> <67ecf5fb-e63d-4284-be75-d0479eef81aa@postgrespro.ru> In-Reply-To: From: jian he Date: Fri, 6 Jun 2025 15:13:22 +0800 X-Gm-Features: AX0GCFuBiI0O5DC_P-nlQvwUfYTj7miPn5f7wtZNGZC6Ye6x4pZh3Q6AXkjpHqo Message-ID: Subject: Re: Add SPLIT PARTITION/MERGE PARTITIONS commands To: Dmitry Koval Cc: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000060cc9c0636e1f9b6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000060cc9c0636e1f9b6 Content-Type: text/plain; charset="UTF-8" hi. in createTableConstraints + /* Add a pre-cooked default expression. */ + StoreAttrDefault(newRel, num, def, true); + + /* Store CHECK constraints. */ + StoreConstraints(newRel, cookedConstraints, false); Here, StoreConstraints last argument should be set to true? see also StoreAttrDefault. +static void +createTableConstraints(Relation modelRel, Relation newRel) + /* + * Construct a map from the LIKE relation's attnos to the child rel's. + * This re-checks type match etc, although it shouldn't be possible to + * have a failure since both tables are locked. + */ + attmap = build_attrmap_by_name(RelationGetDescr(newRel), + tupleDesc, + false); + + /* Cycle for default values. */ + for (parent_attno = 1; parent_attno <= tupleDesc->natts; parent_attno++) + { + Form_pg_attribute attribute = TupleDescAttr(tupleDesc, + parent_attno - 1); + + /* Ignore dropped columns in the parent. */ + if (attribute->attisdropped) + continue; + + /* Copy default, if present and it should be copied. */ + if (attribute->atthasdef) + { + Node *this_default = NULL; + AttrDefault *attrdef = constr->defval; + bool found_whole_row; + int16 num; + Node *def; + + /* Find default in constraint structure */ + for (int i = 0; i < constr->num_defval; i++) + { + if (attrdef[i].adnum == parent_attno) + { + this_default = stringToNode(attrdef[i].adbin); + break; + } + } + if (this_default == NULL) + elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", + parent_attno, RelationGetRelationName(modelRel)); you can use TupleDescGetDefault, build_generation_expression to simplify the above code. The attached patch fixes the above issues. it is based on v41-0001-Implement-ALTER-TABLE-.-MERGE-PARTITIONS-.-comma.patch ---------------------- Do getAttributesList need to care about pg_attribute.attidentity? currently MERGE PARTITION seems to work fine with identity columns, this issue i didn't dig deeper. I am wondering right after createPartitionTable, do we need a CommandCounterIncrement? because later moveMergedTablesRows will use the output of createPartitionTable. --00000000000060cc9c0636e1f9b6 Content-Type: application/octet-stream; name="v41-0001-misc-fixes-in-createTableConstraints.no-cfbot" Content-Disposition: attachment; filename="v41-0001-misc-fixes-in-createTableConstraints.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mbkgv6y40 RnJvbSBiYzk3MWNlNmE4Y2NmMTdiZTlkYmYyY2FlYzM2ZWRmNTQ5ZjY2YjJmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgNiBKdW4gMjAyNSAxNTowNzozMiArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjQx IDEvMV0gbWlzYyBmaXhlcyBpbiBjcmVhdGVUYWJsZUNvbnN0cmFpbnRzCgotLS0KIHNyYy9iYWNr ZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jIHwgMjQgKysrKysrKysrKy0tLS0tLS0tLS0tLS0tCiAx IGZpbGUgY2hhbmdlZCwgMTAgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21t YW5kcy90YWJsZWNtZHMuYwppbmRleCA3MGU3NmM2NzdjOC4uODRkOTYxYzBlMmQgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCisrKyBiL3NyYy9iYWNrZW5kL2Nv bW1hbmRzL3RhYmxlY21kcy5jCkBAIC0yMjE2OSwyMyArMjIxNjksMTkgQEAgY3JlYXRlVGFibGVD b25zdHJhaW50cyhSZWxhdGlvbiBtb2RlbFJlbCwgUmVsYXRpb24gbmV3UmVsKQogCQlpZiAoYXR0 cmlidXRlLT5hdHRoYXNkZWYpCiAJCXsKIAkJCU5vZGUJICAgKnRoaXNfZGVmYXVsdCA9IE5VTEw7 Ci0JCQlBdHRyRGVmYXVsdCAqYXR0cmRlZiA9IGNvbnN0ci0+ZGVmdmFsOwogCQkJYm9vbAkJZm91 bmRfd2hvbGVfcm93OwotCQkJaW50MTYJCW51bTsKKwkJCUF0dHJOdW1iZXIJbnVtOwogCQkJTm9k ZQkgICAqZGVmOwogCi0JCQkvKiBGaW5kIGRlZmF1bHQgaW4gY29uc3RyYWludCBzdHJ1Y3R1cmUg Ki8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyLT5udW1fZGVmdmFsOyBpKyspCisJCQlp ZiAoYXR0cmlidXRlLT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFM KQorCQkJCXRoaXNfZGVmYXVsdCA9IGJ1aWxkX2dlbmVyYXRpb25fZXhwcmVzc2lvbihtb2RlbFJl bCwgYXR0cmlidXRlLT5hdHRudW0pOworCQkJZWxzZQogCQkJewotCQkJCWlmIChhdHRyZGVmW2ld LmFkbnVtID09IHBhcmVudF9hdHRubykKLQkJCQl7Ci0JCQkJCXRoaXNfZGVmYXVsdCA9IHN0cmlu Z1RvTm9kZShhdHRyZGVmW2ldLmFkYmluKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCXRoaXNf ZGVmYXVsdCA9IFR1cGxlRGVzY0dldERlZmF1bHQodHVwbGVEZXNjLCBhdHRyaWJ1dGUtPmF0dG51 bSk7CisJCQkJaWYgKHRoaXNfZGVmYXVsdCA9PSBOVUxMKQorCQkJCQllbG9nKEVSUk9SLCAiZGVm YXVsdCBleHByZXNzaW9uIG5vdCBmb3VuZCBmb3IgYXR0cmlidXRlICVkIG9mIHJlbGF0aW9uIFwi JXNcIiIsCisJCQkJCQkgYXR0cmlidXRlLT5hdHRudW0sIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1l KG1vZGVsUmVsKSk7CiAJCQl9Ci0JCQlpZiAodGhpc19kZWZhdWx0ID09IE5VTEwpCi0JCQkJZWxv ZyhFUlJPUiwgImRlZmF1bHQgZXhwcmVzc2lvbiBub3QgZm91bmQgZm9yIGF0dHJpYnV0ZSAlZCBv ZiByZWxhdGlvbiBcIiVzXCIiLAotCQkJCQkgcGFyZW50X2F0dG5vLCBSZWxhdGlvbkdldFJlbGF0 aW9uTmFtZShtb2RlbFJlbCkpOwogCiAJCQludW0gPSBhdHRtYXAtPmF0dG51bXNbcGFyZW50X2F0 dG5vIC0gMV07CiAJCQlkZWYgPSBtYXBfdmFyaWFibGVfYXR0bm9zKHRoaXNfZGVmYXVsdCwgMSwg MCwgYXR0bWFwLCBJbnZhbGlkT2lkLCAmZm91bmRfd2hvbGVfcm93KTsKQEAgLTIyMTk1LDcgKzIy MTkxLDcgQEAgY3JlYXRlVGFibGVDb25zdHJhaW50cyhSZWxhdGlvbiBtb2RlbFJlbCwgUmVsYXRp b24gbmV3UmVsKQogCQkJICogdGhhdCBkZWZhdWx0cyBjYW5ub3QgY29udGFpbiBhbnkgdmFycywg c28gaXQncyBPSyB0aGF0IHRoZQogCQkJICogZXJyb3IgbWVzc2FnZSByZWZlcnMgdG8gZ2VuZXJh dGVkIGNvbHVtbnMuCiAJCQkgKi8KLQkJCWlmIChmb3VuZF93aG9sZV9yb3cpCisJCQlpZiAoZm91 bmRfd2hvbGVfcm93ICYmIGF0dHJpYnV0ZS0+YXR0Z2VuZXJhdGVkICE9ICdcMCcpCiAJCQkJZXJl cG9ydChFUlJPUiwKIAkJCQkJCWVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAogCQkJCQkJZXJybXNnKCJjYW5ub3QgY29udmVydCB3aG9sZS1yb3cgdGFibGUgcmVmZXJlbmNl IiksCkBAIC0yMjI1Myw3ICsyMjI0OSw3IEBAIGNyZWF0ZVRhYmxlQ29uc3RyYWludHMoUmVsYXRp b24gbW9kZWxSZWwsIFJlbGF0aW9uIG5ld1JlbCkKIAl9CiAKIAkvKiBTdG9yZSBDSEVDSyBjb25z dHJhaW50cy4gKi8KLQlTdG9yZUNvbnN0cmFpbnRzKG5ld1JlbCwgY29va2VkQ29uc3RyYWludHMs IGZhbHNlKTsKKwlTdG9yZUNvbnN0cmFpbnRzKG5ld1JlbCwgY29va2VkQ29uc3RyYWludHMsIHRy dWUpOwogCiAJLyogRG9uJ3QgbmVlZCB0aGUgY29va2VkQ29uc3RyYWludHMgYW55IG1vcmUuICov CiAJbGlzdF9mcmVlX2RlZXAoY29va2VkQ29uc3RyYWludHMpOwotLSAKMi4zNC4xCgo= --00000000000060cc9c0636e1f9b6--