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.96) (envelope-from ) id 1w7EVx-00567T-1k for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 15:26:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7EVv-004MeE-2N for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 15:26:52 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w7EVv-004Me6-10 for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 15:26:51 +0000 Received: from mail-lj1-x22b.google.com ([2a00:1450:4864:20::22b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7EVt-00000001p9t-3ixa for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 15:26:50 +0000 Received: by mail-lj1-x22b.google.com with SMTP id 38308e7fff4ca-38bd3c6c502so38190611fa.1 for ; Mon, 30 Mar 2026 08:26:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774884408; cv=none; d=google.com; s=arc-20240605; b=Gb4hpvYYsAVw+4FyFZMNw+/y8ulWTc6j/ox8lDWDITgw0bpMfGFVlVUQLB4i+yvv4r nLM4VUA2UPPWdrwTsnzzg1uEO/vIxLw512XFyGJvOj07KiLzjJP5oELwCc2QqJUCbDxo Hs3fmlNYEKkRWoYCuz+xr4RBVlbGmd4A748TIhb6ZfoqX3gM64KDVO/nOVeVX36PfDVl cE58/HNgo+4Gxug7Hmlo3niwYRje963tn0sedaDCnYl+ENU/mYT+V1SZDJs941SIH7wx PMIcGCdl5CqNlnhiOwnfKMP7OCJ+muqnjhHGHXGOdsCxOk1yhrCp9Ex1wxhtkLuSeajm UzXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=UfBqfYWqAJJNEs6iGC53qisQd31FqzU5mloiGeC6JHg=; fh=nxGBWBU0J6D2ZyjHKDiySEE/6KYvN9fIyqJwvdRX/WA=; b=f7KTHbYznDJiQU+79gNuRQW2tRFH3x8/rHy9gVDnFzMKP1c+eNc97RBk9op5BBkQv9 eVnt2Q3b2ro8TNGqfqqwCAX6u3Dni49bDSp/R/c8MOlZFsNCEJtbQ/1GK/mayh5lqbtX XfHlXF+W9jVr8CUXye+RUv+/TSnqoZ2nemGYg1rvzA3SfeSvnjRDEBvk64RBm4KkNI2p ajL7wAnO8BgQBS6/pnc9z2UgAYHjdn8K5yZJlauALBotiDGuJdgqiPz5rr1wRNz+jXZL J2VUsWj9GyxN8Ko9Dsv7/+UNcYJZ1aW+N1MBclunK5KUchUCGWCaSyrvnaqztTR/bOkH AjYg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774884408; x=1775489208; 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=UfBqfYWqAJJNEs6iGC53qisQd31FqzU5mloiGeC6JHg=; b=V8AsPUUAEwxcmyvccfU91w0ztshaNO3qkyaLFNtk31lVkwLmEv7u0eSrCw0/FktBa4 fSedTSfqYUFFHkpu3s1Jx6XFNcZzSRCvijcfcofylXDvrqyGxCya7tAkkXOdWaN/Jz3X +qlLvXykS6A2wmnXu9Fiue1wYg4KtAL0ZwDhxSOUdOd5Tmoqu0PBqHc22NFmngsYKSuJ zX6g7P+MRq2+hOXwG7oPXV1hks7zPmJI98yAhYpL4Urx4fSujhgE7a7SItaTGCriLQqU X3MyVmyIXihDuYZ59QUbMTpogaTeNiX1MJeSvvSxmq0Uae2tt/RDag2LWmdN7w1YQsky S80g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774884408; x=1775489208; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=UfBqfYWqAJJNEs6iGC53qisQd31FqzU5mloiGeC6JHg=; b=p1horZMnN2DpAXjeMYHw+BlqP6hhLsUKjdvXuWXNP49HJGKFCmEmecvpGVjwOxBH4z b82z/D75OtEk7yYq4poCxW/QLW6RZt+CT4m6Q+eqULopuY0mIAl9KeZmxa0e32QprZdh JbCqABdPbLMrmcs0xGd65TyQvjgNqljf+I0m8Z5sJxTt4jp1dIe9VyqhfMJvMrHvQc7p nDmLcgD+Wwcc8eqQdItOHOAtvD5+Zrj6KHk88t0/rvS8lVDVDtNh/Ryhdq78pIwutfgT JcSTBUUVDSSg3/T/DBeQ5QmN3+9oJ94ffrm1EYCKZkkBDnv+QKKipeNzfTdRbNB0Zy26 RluA== X-Gm-Message-State: AOJu0YwDIVFWZ30oZq8gP2ocC9jW+2XfxBzkPBmDoQcet6dAPhhK0xvU mGhgE+0DQ3d6xxANFt5mCrLuHlLTlUNcbkEQBYaYCRIPzUtfp8ZRzO4loJpJMAg+9/11vNGERB0 wzkW5+zu/efy0/l1d14wfTdIj3FOZuB9SwhBw X-Gm-Gg: ATEYQzzkMhcrMeCUrrD7MltE6HHASFhhRKtRMnEdkrEcABefj5lZ1BS2y8N1Dg+K0o7 iFxzTDeaAIw/QV2L9VIW7HTTUCGtDJcVNgoha6vjaGI8EPA+tRSj3b7eXB85rvfFpXkPInNfSGD qft2DYDmQdtH4z5mPcBOrD9XnUKe0qoEAomZI3aAOExodnH56Rdco9KpB7tPlRamDDCgdnQslJb g8Uvn5Hs2wAK/07GyWJYlMxU4nq34Fb+RHzJqAR/ian3QhM9q8krj9EzB2MSOLapzwUDtAR9XHR WHYwEgIiuSgMS8F38/zHUQjk4XTa7NVvHcPCYKFUisc1wLGA9ZO/CPGaZKmQGUM76NhqBWEEWeh JPtrj6NiP1Jsqh9M= X-Received: by 2002:a05:651c:1448:b0:383:5390:bc96 with SMTP id 38308e7fff4ca-38c72cbe05dmr43420271fa.0.1774884407946; Mon, 30 Mar 2026 08:26:47 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Matthias van de Meent Date: Mon, 30 Mar 2026 17:26:35 +0200 X-Gm-Features: AQROBzBDOUh4GZPHw0j1U2oNua_obswS_HU0IssgaoArbKn_RU95xtjtVer73MQ Message-ID: Subject: Re: [BUG] Excessive memory usage with update on STORED generated columns. To: "Anton A. Melnikov" Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000a7503e064e3f7ae6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a7503e064e3f7ae6 Content-Type: text/plain; charset="UTF-8" On Mon, 30 Mar 2026 at 16:25, Anton A. Melnikov wrote: > > Hi! > > > My colleagues found that a queries like that: [...] > lead to excessive memory consumption up to 10Gb in this example and > query execution time up to ~1,5min. > > Bisect shows that the problem appeared after commit 83ea6c540 > (Virtual generated columns). Yep, that looks about accurate. Thanks for the report and initial triage! > This indicates that generated expressions are reparsed multiple times, > once per row to be updated instead of being reused. [...] > I would like to propose a fix that add a caching of the the parsed > expression trees (Node *) in ResultRelInfo, so that build_column_default() > and stringToNode() are executed at most once per attribute per query. > > With this fix, the query execution time > and memory consumption return to normal: I think that fixes the wrong issue. Specifically, ExecInitGenerated mentions that it expects to be called just once per ResultRelInfo, and your code adds code to allow it to be called more than once without causing more problems. While it does solve the complaint, it's still executing more work than it should. Additionally, though it's not a failing of the patch per se, it changes the layout of an existing struct, and so it isn't backportable. The actual issue is that ExecComputeStoredGenerated uses ri_GeneratedExprsU's NULL-ness to check whether the generated columns' expressions have been initialized, whilst for UPDATE ResultRelInfos the initialized-indicator is stored in ri_extraUpdatedCols_valid. So, I think the attached patch is a more appropriate fix, it avoids calling into ExecInitGenerated at all when no column included in expressions was updated. It also adds an assertion that the function isn't called again once the field has been initialized. It also has the benefit of being backportable. Kind regards, Matthias van de Meent Databricks (https://www.databricks.com) --000000000000a7503e064e3f7ae6 Content-Type: application/octet-stream; name="v2-0001-nodeModifyTable-fix-generated-tables-memory-leak-.patch" Content-Disposition: attachment; filename="v2-0001-nodeModifyTable-fix-generated-tables-memory-leak-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mndc42om0 RnJvbSAxOGVmZGRlMTBlYmJhYWIwOWU4ZDE2NmUyNzFkNGRhYzAxNDYxYTY4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXR0aGlhcyB2YW4gZGUgTWVlbnQgPGJvZWtld3VybStwb3N0 Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IE1vbiwgMzAgTWFyIDIwMjYgMTc6MTU6MjQgKzAyMDAKU3Vi amVjdDogW1BBVENIIHYyXSBub2RlTW9kaWZ5VGFibGU6IGZpeCBnZW5lcmF0ZWQgdGFibGVzIG1l bW9yeSBsZWFrL3BlcmYKIGlzc3VlCgpUaGUgY29kZSBhc3N1bWVkIHRoYXQgcmlfR2VuZXJhdGVk RXhwcnNVIHdvdWxkIGFsd2F5cyBjb250YWluIGEgbGlzdCBvZiBleHByZXNzaW9ucyBpZiB0aGUg Z2VuZXJhdGVkIGNvbHVtcyB3ZXJlIGNoZWNrZWQsIGJ1dCB0aGF0J3Mgbm90IGNvcnJlY3QuCgpS ZXBvcnRlZC1ieTogIkFudG9uIEEuIE1lbG5pa292IiA8YS5tZWxuaWtvdkBwb3N0Z3Jlc3Byby5y dT4KLS0tCiBzcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTW9kaWZ5VGFibGUuYyB8IDMgKystCiAx IGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZU1vZGlmeVRhYmxlLmMgYi9zcmMvYmFja2VuZC9l eGVjdXRvci9ub2RlTW9kaWZ5VGFibGUuYwppbmRleCA0Y2Q1ZTI2MmUwZi4uMDlkZDUwMmZiOGUg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVNb2RpZnlUYWJsZS5jCisrKyBi L3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVNb2RpZnlUYWJsZS5jCkBAIC01MzEsNiArNTMxLDcg QEAgRXhlY0luaXRHZW5lcmF0ZWQoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywKIAl7CiAJ CS8qIERvbid0IGNhbGwgdHdpY2UgKi8KIAkJQXNzZXJ0KHJlc3VsdFJlbEluZm8tPnJpX0dlbmVy YXRlZEV4cHJzVSA9PSBOVUxMKTsKKwkJQXNzZXJ0KCFyZXN1bHRSZWxJbmZvLT5yaV9leHRyYVVw ZGF0ZWRDb2xzX3ZhbGlkKTsKIAogCQlyZXN1bHRSZWxJbmZvLT5yaV9HZW5lcmF0ZWRFeHByc1Ug PSByaV9HZW5lcmF0ZWRFeHByczsKIAkJcmVzdWx0UmVsSW5mby0+cmlfTnVtR2VuZXJhdGVkTmVl ZGVkVSA9IHJpX051bUdlbmVyYXRlZE5lZWRlZDsKQEAgLTU3NSw3ICs1NzYsNyBAQCBFeGVjQ29t cHV0ZVN0b3JlZEdlbmVyYXRlZChSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvLAogCSAqLwog CWlmIChjbWR0eXBlID09IENNRF9VUERBVEUpCiAJewotCQlpZiAocmVzdWx0UmVsSW5mby0+cmlf R2VuZXJhdGVkRXhwcnNVID09IE5VTEwpCisJCWlmICghcmVzdWx0UmVsSW5mby0+cmlfZXh0cmFV cGRhdGVkQ29sc192YWxpZCkKIAkJCUV4ZWNJbml0R2VuZXJhdGVkKHJlc3VsdFJlbEluZm8sIGVz dGF0ZSwgY21kdHlwZSk7CiAJCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9OdW1HZW5lcmF0ZWROZWVk ZWRVID09IDApCiAJCQlyZXR1cm47Ci0tIAoyLjUwLjEgKEFwcGxlIEdpdC0xNTUpCgo= --000000000000a7503e064e3f7ae6--