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 1srKJi-000dxR-Sa for pgsql-bugs@arkaria.postgresql.org; Thu, 19 Sep 2024 16:47:43 +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 1srKJf-004ANX-Ap for pgsql-bugs@arkaria.postgresql.org; Thu, 19 Sep 2024 16:47:40 +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.94.2) (envelope-from ) id 1srKJf-004ANP-0D for pgsql-bugs@lists.postgresql.org; Thu, 19 Sep 2024 16:47:40 +0000 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1srKJa-0002L7-3U for pgsql-bugs@lists.postgresql.org; Thu, 19 Sep 2024 16:47:39 +0000 Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-42cb9a0c300so9395805e9.0 for ; Thu, 19 Sep 2024 09:47:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726764452; x=1727369252; darn=lists.postgresql.org; h=content-transfer-encoding:to:subject:from:content-language :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=zCZc0KAlCXjzD2v5oRf1DggIpncufZmb0LQoBWjKAdI=; b=U+QxoEWmPcAm/4k91kOMtdV+6a0zlL6JukulTSsbhyR4nT8dDoIC4E/cAPkqjdDGNW Q5TxM5Pgs3z2SeDylY3ExCy9e0Dtj9pCRu2tji7JvMnNU15RJH6mCQqBjSxmboquNyit aCH7SwTuXJIDTX+vCGhp5AHjydW03mukvo0pekoxRM5iusgG9kOHTjaOAyIrrTHL5MZO HqiPYi7++qarOZNwA3mFvRJ+ZGvt3KA6PrqkAMhSEwg/ljCVgtZE+nj97Y/dESDzljEC R7WYQO76qZun79Fkg/jey3y9DZIwfPm5KaewiXm836XgDHt4WtythAknHdqUZ3stGhZk OTqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726764452; x=1727369252; h=content-transfer-encoding:to:subject:from:content-language :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=zCZc0KAlCXjzD2v5oRf1DggIpncufZmb0LQoBWjKAdI=; b=jUcrtJ7fbjsDxDGN9ESxs1BjHz0iE3s7FcAqpWIprpAYSepIHlMYuyVrKRZq8+MxJb EmtBGIAjbNvi0T+e0VpP8FJGXIF3WVXgD5NhMT6t7zehFvcPZWTRJnZHM5m82hALeQY5 ND2wVZoMy48gEc55t0154azMNZ6Jm1owqiJ5V/c4J7CCMlSVm5A+5e3LPlLBSnftMJPA at1Jq5Qi1AgPpJ0giUws8y2Sooy/zfLg8fesFdPm0RSejS1LcgB/La8FDwCnKhdd4GZk kGM71mWUp+Q5WwD3TwjHbnvE+0Rmko0VHURKnYnPLM9YxzIJ/UONrGHiMS/qaIhYjutl 7ADQ== X-Gm-Message-State: AOJu0Yxx25B+ch2XFokW8wE9H/lk9jSw+JRDuslSuQB/87kcmeBQ0Igy kDhg6e6zc/NYIAqB1S3clgKSh00LYRCoZ2xCQyiE+cDpaxqElZvi8LnKLFfXJDU= X-Google-Smtp-Source: AGHT+IED4iU8jC7gCGjDzXIeqkqlkDwCDXS5xAt91cXEuSXGBE8RyzVchTo9qqQV/uhC0o90oSEJVg== X-Received: by 2002:a05:600c:5107:b0:42c:be90:fa2f with SMTP id 5b1f17b1804b1-42e7ad734b2mr103535e9.25.1726764452060; Thu, 19 Sep 2024 09:47:32 -0700 (PDT) Received: from [192.168.18.235] ([45.93.57.193]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-378e73f9b10sm15595197f8f.59.2024.09.19.09.47.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Sep 2024 09:47:31 -0700 (PDT) Message-ID: <7ab4aac3-4790-416f-98b8-2ec0707cceb5@gmail.com> Date: Thu, 19 Sep 2024 18:47:30 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Andrei Lepikhov Subject: Volatile functions under Memoize node To: PostgreSQL mailing lists , Richard Guo Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, Excuse me if I made noise in vain. After discovering the limits of the Memoize node, I realized that volatile functions are allowed under the Memoize. Example: DROP TABLE IF EXISTS base, other CASCADE; CREATE TABLE base (x numeric, y text, x1 integer); INSERT INTO base (x,y,x1) SELECT 1, 'abccccccccccccc'||1,1 FROM generate_series(1,1E6) AS x; CREATE TABLE other (x numeric, y text, x1 integer); INSERT INTO other (x,y,x1) SELECT x, 'abccccccccccccc'||x,1 FROM generate_series(1,1E4) AS x; VACUUM ANALYZE base, other; EXPLAIN (COSTS OFF) SELECT * FROM base WHERE base.x IN ( SELECT o2.x FROM other o1 LEFT JOIN other o2 ON (o1.x=o2.x) LEFT JOIN other o3 ON (o2.x=o3.x+random()) WHERE base.x = o1.x GROUP BY o2.x ORDER BY o2.x ); /* Nested Loop -> Seq Scan on base -> Memoize Cache Key: base.x Cache Mode: binary -> Subquery Scan on "ANY_subquery" Filter: (base.x = "ANY_subquery".x) -> Group Group Key: o2.x -> Sort Sort Key: o2.x -> Nested Loop Left Join Join Filter: ((o2.x)::double precision = ((o3.x)::double precision + random())) -> Nested Loop Left Join -> Seq Scan on other o1 Filter: (base.x = x) -> Seq Scan on other o2 Filter: (x = base.x) -> Seq Scan on other o3 */ In my mind, any volatile function in any expression should reject the usage of Memoize, am I wrong? I haven't discovered this case deeply yet, but maybe someone has a quick and short answer to this question. -- regards, Andrei Lepikhov