Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1glQKx-0000Ha-2K for pgsql-hackers@arkaria.postgresql.org; Mon, 21 Jan 2019 03:33:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1glQKu-0006PI-8G for pgsql-hackers@arkaria.postgresql.org; Mon, 21 Jan 2019 03:33:20 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1glQKu-0006PA-1B for pgsql-hackers@lists.postgresql.org; Mon, 21 Jan 2019 03:33:20 +0000 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1glQKm-0000eG-Ro for pgsql-hackers@lists.postgresql.org; Mon, 21 Jan 2019 03:33:19 +0000 Received: by mail-wr1-x443.google.com with SMTP id q18so21546583wrx.9 for ; Sun, 20 Jan 2019 19:33:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=bhuWq6KdJm0cxvl8VY688nQYYC5LZdA3I6mJVjhVQpU=; b=z9TneOV+/qHp0hRkpphu1KUnF8nRigfXUwXaMVodt8DtTWvCMyx4MDnXj5wZrUwIwD qjs1WuYxbpczPob1Midpu8U/u2xbl73BHisDSsBWbTf2rvUqxgX78aJPCTYPd4ZV+0FA tboH/7PRibZJ/uyYR4Nxo63jlt4B06B8Paw7Z8t5iLMwkiN+L0HoEzloVlkjITiWJD+F 36yC9xxO0F2HQHvJdddevXQbYeMTQj6uztT+LBWJSFyoID8hUQ5uqfT0qLibwuGq859T U/TuM+bKRWi3whaZ8SQ+O6vAEQKHTF2Q9FJj9Q/QSt9LTEesN6bOMjeLjQfWICIBhjGR KYmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=bhuWq6KdJm0cxvl8VY688nQYYC5LZdA3I6mJVjhVQpU=; b=KAmNxynahlqofXDDvcMfJwpn2j0puhqAX+oC0J/Ho3nlr18X9r8JG+jYi5XuM8Stz4 PFaKldqV6vewNvQp+49UgriuMh6uFEuLEQc/22y48DlU05EurqcXJPkktceF3ihpM8hT +fhzyAyjXVI0mgGpLzSKCgsjxKxnyyJdCA5LLegL/RNx7w8jvsKsBUVgDUsQDUU6mR+k vnDMo4Hqi6U8Zq/2rExep7X+wBI19d+WWt/1rHzABEYvURXcPUU9mrll4IlYiBWzP2sU G3h4jg6+d++SdxblJui6yliYa8k0jOy9dX9Vy6N76YBQUUl5j6CfnP3YpzAAjpkZLVwD 6sTA== X-Gm-Message-State: AJcUukf1HH4Mlw98LbB48FPXZvNbQxph3sBpXDPdmQ1Lrj1LiAxn9MSM LhtEMAr7P2RRg8Wlq8SL0C8XYNpsKXKlxTocrY+WRQJn5w7Rt5BwD8JrqypjIhoshOKTpzeXsny 7H/1NHdZ5iIpxWeq/yffcBFb9/0PtsSb3g91+yLJ7RmjpeQZMgI5sChI9AI421joO2GifuVuY5O I+yaxCNNAl/HEEca8aJlg= X-Google-Smtp-Source: ALg8bN6iAcWky3wmG65I5cK3PXSoHJuWAcxJpV9rL667g75Pj3dXIbPZX5LZbNDzJ9arYOmxkRlZQA== X-Received: by 2002:adf:ef50:: with SMTP id c16mr25814912wrp.198.1548041591531; Sun, 20 Jan 2019 19:33:11 -0800 (PST) Received: from [10.137.2.21] (ip-86-49-251-50.net.upcbroadband.cz. [86.49.251.50]) by smtp.gmail.com with ESMTPSA id g16sm82222198wru.41.2019.01.20.19.33.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 20 Jan 2019 19:33:10 -0800 (PST) Subject: Re: COPY FROM WHEN condition To: Andres Freund Cc: Surafel Temesgen , alvherre@2ndquadrant.com, Adam Berlin , pgsql-hackers@lists.postgresql.org References: <194e2225-b186-9325-0cd1-9a5b09d28251@2ndquadrant.com> <20181204094418.wpr6mxrtsuxb5mlq@alvherre.pgsql> <3b2b1aac-5861-acd8-fda3-054c4e4da888@2ndquadrant.com> <20190121012405.633row4iw7nfxz7h@alap3.anarazel.de> <6e80b7c1-58cd-4212-41d3-7c519aed0500@2ndquadrant.com> <20190121020805.3kdscvwzwvijlees@alap3.anarazel.de> <20190121021220.7tbu3oizvydov5by@alap3.anarazel.de> From: Tomas Vondra Message-ID: <52b10375-aca3-ea9b-10a1-2e4e9a011665@2ndquadrant.com> Date: Mon, 21 Jan 2019 04:33:08 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <20190121021220.7tbu3oizvydov5by@alap3.anarazel.de> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk On 1/21/19 3:12 AM, Andres Freund wrote: > On 2019-01-20 18:08:05 -0800, Andres Freund wrote: >> On 2019-01-20 21:00:21 -0500, Tomas Vondra wrote: >>> >>> >>> On 1/20/19 8:24 PM, Andres Freund wrote: >>>> Hi, >>>> >>>> On 2019-01-20 00:24:05 +0100, Tomas Vondra wrote: >>>>> On 1/14/19 10:25 PM, Tomas Vondra wrote: >>>>>> On 12/13/18 8:09 AM, Surafel Temesgen wrote: >>>>>>> >>>>>>> >>>>>>> On Wed, Dec 12, 2018 at 9:28 PM Tomas Vondra >>>>>>> > wrote: >>>>>>> >>>>>>> >>>>>>> Can you also update the docs to mention that the functions called from >>>>>>> the WHERE clause does not see effects of the COPY itself? >>>>>>> >>>>>>> >>>>>>> /Of course, i  also add same comment to insertion method selection >>>>>>> / >>>>>> >>>>>> FWIW I've marked this as RFC and plan to get it committed this week. >>>>>> >>>>> >>>>> Pushed, thanks for the patch. >>>> >>>> While rebasing the pluggable storage patch ontop of this I noticed that >>>> the qual appears to be evaluated in query context. Isn't that a bad >>>> idea? ISMT it should have been evaluated a few lines above, before the: >>>> >>>> /* Triggers and stuff need to be invoked in query context. */ >>>> MemoryContextSwitchTo(oldcontext); >>>> >>>> Yes, that'd require moving the ExecStoreHeapTuple(), but that seems ok? >>>> >>> >>> Yes, I agree. It's a bit too late for me to hack and push stuff, but I'll >>> fix that tomorrow. >> >> NP. On second thought, the problem is probably smaller than I thought at >> first, because ExecQual() switches to the econtext's per-tuple memory >> context. But it's only reset once for each batch, so there's some >> wastage. At least worth a comment. > > I'm tired, but perhaps its actually worse - what's being reset currently > is the ESTate's per-tuple context: > > if (nBufferedTuples == 0) > { > /* > * Reset the per-tuple exprcontext. We can only do this if the > * tuple buffer is empty. (Calling the context the per-tuple > * memory context is a bit of a misnomer now.) > */ > ResetPerTupleExprContext(estate); > } > > but the quals are evaluated in the ExprContext's: > > ExecQual(ExprState *state, ExprContext *econtext) > ... > ret = ExecEvalExprSwitchContext(state, econtext, &isnull); > > > which is created with: > > /* Get an EState's per-output-tuple exprcontext, making it if first use */ > #define GetPerTupleExprContext(estate) \ > ((estate)->es_per_tuple_exprcontext ? \ > (estate)->es_per_tuple_exprcontext : \ > MakePerTupleExprContext(estate)) > > and creates its own context: > /* > * Create working memory for expression evaluation in this context. > */ > econtext->ecxt_per_tuple_memory = > AllocSetContextCreate(estate->es_query_cxt, > "ExprContext", > ALLOCSET_DEFAULT_SIZES); > > so this is currently just never reset. Actually, no. The ResetPerTupleExprContext boils down to MemoryContextReset((econtext)->ecxt_per_tuple_memory) and ExecEvalExprSwitchContext does this MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); So it's resetting the right context, although only on batch boundary. But now I see 31f38174 does this: else if (cstate->whereClause != NULL || contain_volatile_functions(cstate->whereClause)) { ... insertMethod = CIM_SINGLE; } so it does not do batching with WHERE. But the condition seems wrong, I guess it should be && instead of ||. Will investigate in the morning. > Seems just using ExecQualAndReset() ought to be sufficient? > That may still be the right thing to do. cheers -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services