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 1tcItQ-00Gl1U-Ah for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Jan 2025 06:46:45 +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 1tcItO-009dWk-PJ for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Jan 2025 06:46:42 +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 1tcItO-009dWY-AZ for pgsql-hackers@lists.postgresql.org; Mon, 27 Jan 2025 06:46:42 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tcItK-001iSA-2D for pgsql-hackers@lists.postgresql.org; Mon, 27 Jan 2025 06:46:40 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1737960395; bh=2+m6jIaRf6qhxP6Lcv/k58C6emKlpyiyVdnjlicSQ98=; h=Date:From:To:Cc:Subject:In-Reply-To:References:Message-ID:From; b=jpFSG132GUHoj0u9cIlrYvWbbM53Fcff8p3A7e+vlGxZGr97fGRtYIuHq7TzA4UCP 5cO3k7ewSqqbxD8D3Gg1mvLd9b28r1weQ9yuLWcAxb+2JWGhZ3N2tSxLTv3O1bogws J4A6TU3RTcRzPzyUy/i2kQ0n/3x5Dnd4QHTN63sG/jt+eVVVd7vM1LzwbyUtI+/rYC /fp20aidjy+c80xnTeqArUe3CsKkPHo/rFhOa3tToPhhFUtAHQSU0GxrpNagnlY2VB wqF9qOJsM8N952+Fq7EtL7s/xv/ioYkeEToszPkcay2FCUWPmglu56n4sWaZKdJp3G +3qhdnu0+UssQ== Received: from mail.postgrespro.ru (webmail-master-mstn.l.postgrespro.ru [192.168.2.26]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.pyhalov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 2E3F760A7A; Mon, 27 Jan 2025 09:46:35 +0300 (MSK) MIME-Version: 1.0 Date: Mon, 27 Jan 2025 09:46:35 +0300 From: Alexander Pyhalov To: Maxim Orlov Cc: pgsql-hackers@lists.postgresql.org Subject: Re: postgres_fdw could deparse ArrayCoerceExpr In-Reply-To: References: <4f0cea802476d23c6e799512ffd17aff@postgrespro.ru> Message-ID: <0be55d1548c3b1bc29b8ae23f6db24e3@postgrespro.ru> X-Sender: a.pyhalov@postgrespro.ru Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2025/01/27 05:35:00 #27127767 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Maxim Orlov писал(а) 2025-01-24 18:09: > Look like an overlook for me. Apparently no one has encountered this > use case before. > > Patch seems good to me with no visible defects. Deparse support was > also added. As well as a > test case. But do we really need copy/paste code for a > T_ArrayCoerceExpr case? To be more specific, > can we "reuse" T_RelabelType case, as it made for T_OpExpr and > T_DistinctExpr? > > -- > Unfortunately, it's not so simple. We can't just ship type casts to remote server if we are not sure that local and remote types match. For example, CREATE TYPE enum_of_int_like AS enum('1', '2', '3', '4'); CREATE TABLE conversions(id int, d enum_of_int_like); CREATE FOREIGN TABLE ft_conversions (id int, d char(1)) SERVER loopback options (table_name 'conversions'); INSERT INTO ft_conversions VALUES (1, '1'), (2, '2'), (3, '3'), (4, '4'); Patched version gives error: -- Test array type conversion pushdown SET plan_cache_mode = force_generic_plan; PREPARE s(varchar[]) AS SELECT count(*) FROM ft_conversions WHERE d = ANY ($1); EXPLAIN (VERBOSE, COSTS OFF) EXECUTE s(ARRAY['1','2']); QUERY PLAN --------------------------------------------------------------------------------------------------- Foreign Scan Output: (count(*)) Relations: Aggregate on (public.ft_conversions) Remote SQL: SELECT count(*) FROM public.conversions WHERE ((d = ANY ($1::character varying[]))) (4 rows) EXECUTE s(ARRAY['1','2']); ERROR: operator does not exist: public.enum_of_int_like = character varying HINT: No operator matches the given name and argument types. You might need to add explicit type casts. CONTEXT: remote SQL command: SELECT count(*) FROM public.conversions WHERE ((d = ANY ($1::character varying[]))) Original one does successful local filtering: PREPARE s(varchar[]) AS SELECT count(*) FROM ft_conversions WHERE d = ANY ($1); EXPLAIN (VERBOSE, COSTS OFF) EXECUTE s(ARRAY['1','2']); QUERY PLAN ----------------------------------------------------------- Aggregate Output: count(*) -> Foreign Scan on public.ft_conversions Output: id, d Filter: (ft_conversions.d = ANY (($1)::bpchar[])) Remote SQL: SELECT d FROM public.conversions (6 rows) EXECUTE s(ARRAY['1','2']); count ------- 2 -- Best regards, Alexander Pyhalov, Postgres Professional