Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ngmX2-0001HY-AX for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Apr 2022 12:00:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ngmX1-0005ls-6t for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Apr 2022 12:00:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ngmX0-0005li-EN for pgsql-hackers@lists.postgresql.org; Tue, 19 Apr 2022 12:00:30 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1ngmWx-0004qP-Q2 for pgsql-hackers@lists.postgresql.org; Tue, 19 Apr 2022 12:00:29 +0000 Received: by mail-ej1-x62d.google.com with SMTP id t11so32351582eju.13 for ; Tue, 19 Apr 2022 05:00:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :references:from:in-reply-to:content-transfer-encoding; bh=NLMdZRLXueVk15dQFbDvQ0elnljYthtl1FCameCykBQ=; b=C/+k9C5GaaEUiZQpGakji7kzh6jbOGS9dBlR3E/BQeVLDzDTyLdc+VwNDQUTsNtMuu /Sbf0ZwhMwY8XmHUodme5y9Lq+ONbhAou+S6fdd9B6Dv+764t5Ivj/9piUYnTqDzPSFp l85DWIL3rsW1zCtlrf797bLFCq722+hOceMMZhe2UEK5o3PBFhYgH5NsIiaqZUz1pfsP w5XEed9n5FEiRUHYqzobF5PiVbRzEsubWhyRbJjKIaDMO+i2nG/P0JfuvKd/OG89hS2K k87nuqtFnbuGoNJUU5kcMknA0Jwnx0vProzbR3CfOd9OHot18U3c/sp/bBJDFo8SVi30 6fXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:in-reply-to :content-transfer-encoding; bh=NLMdZRLXueVk15dQFbDvQ0elnljYthtl1FCameCykBQ=; b=dW5z65prO/U37USb5Kl4IPEktIGuYZGLkyHcHMNIHNwwn2gHTLNxK+ILH4nGclVsGt K5geOuljSPU7sPwwJcRbcj8WKOkC5IvCu0sSTQTfcna72WMewmxy1kygp/MZhgiVXyzp s4XekHEz3wEnfZ3mDFV697EkKXXy9sSZghlrQi2HR6feI9kFDeuPZKmDwYil3Y3vNw36 bc8NE19TCya60qNu/7AFbAmts41wt8Fp1sIvcuJt4SfHzmlr78vRsLoapBDinz6wy2XF KOzhjRZxan4pZ3rNB968qyJiYNhLdRgH6L+6gAQd6/CJuZ3l/Ceg555zZAtB673iYlIa sMNw== X-Gm-Message-State: AOAM5334NBvwdCLNsGWwblbTqEP7oLSL8g3COaqForAk/9ptUUIlyBu6 Zsk5i8oBbPj6HWKbLKE1agpx8gpOmhOFNOjHQIpxmIBMzZu3F88ujSRXlZ0pbPxwxcMZE4YE7Va dUJZSoBX7drtG3txyvANX1AeKY9X2Jb6vq9dsJTg34A2d4j8MI2CcFg2ZUjdqaybIR++CpC9LOE AWiGBJj5Jqj7305ligei8ClhNeLcN08rY5DqyYFwb4gQi3Q4Rtxc/C X-Google-Smtp-Source: ABdhPJxsEs0kBWYWqn2Q6umvzG5Uq9Mp3wq17zfT76Z+HcwEOhyg7+WAJ8GZCwG0PB8AR6Ic8EZ/CQ== X-Received: by 2002:a17:906:3adb:b0:6b7:876c:d11b with SMTP id z27-20020a1709063adb00b006b7876cd11bmr13188655ejd.250.1650369625445; Tue, 19 Apr 2022 05:00:25 -0700 (PDT) Received: from [10.137.0.17] (static-84-42-175-93.net.upcbroadband.cz. [84.42.175.93]) by smtp.gmail.com with ESMTPSA id u5-20020a170906b10500b006ce6fa4f510sm5580817ejy.165.2022.04.19.05.00.24 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 19 Apr 2022 05:00:24 -0700 (PDT) Message-ID: Date: Tue, 19 Apr 2022 14:00:25 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: Re: postgres_fdw: batch inserts vs. before row triggers Content-Language: en-US To: Etsuro Fujita , PostgreSQL Hackers References: From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 4/19/22 11:16, Etsuro Fujita wrote: > On Sun, Apr 17, 2022 at 6:20 PM Etsuro Fujita wrote: >> Here >> is an example using HEAD: >> >> create extension postgres_fdw; >> create server loopback foreign data wrapper postgres_fdw options >> (dbname 'postgres'); >> create user mapping for current_user server loopback; >> create table t (a int); >> create foreign table ft (a int) server loopback options (table_name 't'); >> create function ft_rowcount_tf() returns trigger as $$ begin raise >> notice '%: rows = %', tg_name, (select count(*) from ft); return new; >> end; $$ language plpgsql; >> create trigger ft_rowcount before insert on ft for each row execute >> function ft_rowcount_tf(); >> >> insert into ft select i from generate_series(1, 10) i; >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 1 >> NOTICE: ft_rowcount: rows = 2 >> NOTICE: ft_rowcount: rows = 3 >> NOTICE: ft_rowcount: rows = 4 >> NOTICE: ft_rowcount: rows = 5 >> NOTICE: ft_rowcount: rows = 6 >> NOTICE: ft_rowcount: rows = 7 >> NOTICE: ft_rowcount: rows = 8 >> NOTICE: ft_rowcount: rows = 9 >> INSERT 0 10 >> >> This looks good, but when batch insert is enabled, the trigger >> produces incorrect results: >> >> alter foreign table ft options (add batch_size '10'); >> delete from ft; >> >> insert into ft select i from generate_series(1, 10) i; >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> NOTICE: ft_rowcount: rows = 0 >> INSERT 0 10 > > Actually, the results are correct, as we do batch-insert here. But I > just wanted to show that the trigger behaves *differently* when doing > batch-insert. > >> So I think we should disable batch insert in such cases, just as we >> disable multi insert when there are any before row triggers on the >> target (local) tables/partitions in copyfrom.c. Attached is a patch >> for that. > > If there are no objections from Tomas or anyone else, I'll commit the patch. > +1, I think it's a bug to do batch insert in this case. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company