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 1lltvN-0007jC-9P for pgsql-bugs@arkaria.postgresql.org; Wed, 26 May 2021 13:50:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lltvM-0001Jl-1g for pgsql-bugs@arkaria.postgresql.org; Wed, 26 May 2021 13:50:16 +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 <9erthalion6@gmail.com>) id 1lltvL-0001Jd-9M for pgsql-bugs@lists.postgresql.org; Wed, 26 May 2021 13:50:15 +0000 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from <9erthalion6@gmail.com>) id 1lltvI-0007yC-2g for pgsql-bugs@lists.postgresql.org; Wed, 26 May 2021 13:50:13 +0000 Received: by mail-wr1-x430.google.com with SMTP id z17so1221071wrq.7 for ; Wed, 26 May 2021 06:50:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=BzRhVkxj1W6Nh6y4ln5auqCZxqZx/iqZ/QC/6F854fU=; b=RmoG02oRj0DCovkHuI4ulKyJeUr9En+UIFz0md8ZjMrryahjocyPHpEHg/W48s4m88 0dcyrEWFOdlFLY8xyv248TZGm54wY4DIWOsPhB9LuOSAmtAH9PdgX0IT5Bg8XhgVHxO6 YwTajx2fMT9ODiI/1qLHoH2GdCQEj0kAPUGQzckfRQSuneKpKclt/1gOZMMSPX51ZEHL 3+8ogOprQvZdn1GOCuVqIHxn3rZY/vYDGtmxr9YUqmDaJfRGawr83UBERu//PHcRXqLc pTfItfnPhH7xZluC28fGTemlP1pwUAS4a2tDh7Upxt0Ica5VUQucg15hDzvCWNUQ+2Bv 7HRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=BzRhVkxj1W6Nh6y4ln5auqCZxqZx/iqZ/QC/6F854fU=; b=QscoeFgIKeFZIZ5arqQ3b+aU05KUD9T+HMayM7qzv6Ec7hUk/bGYEg+PNknehIg54s j9TPuYcJTMDbyW7Vgw7OnNfXQk0rXdaaSZC2Zac/9SlGg35H4nDdo3aJwxbQlpXGxhy5 mPgmoyHA0aIz0vD7lOSDseL5O0rbEsESbEHSlPYQL0kpYB2wD9246m95RqtxtHafGigO 8Z3pNXytWQrUnyLsbbk9sSscd6RsZwMuDX3Sah+wY55RhszjO53SNUivqHT9cLqvBV4a /pj84mLo7KnYI/QqAAe5FICiOdrB+0viqmhlk2ErFIyLb3SF/2lgabndDkWfJZWo6q8Q +aBQ== X-Gm-Message-State: AOAM531xCUCwr0K/Yu4OIJE/M5N4kGJZ+qKLC/7iUXKF2s8G1kJGwWdY aBFv7C/fA9yju9iaWNOtd8s= X-Google-Smtp-Source: ABdhPJzgd4pc3vbcISzhddVOOxGng+PX+rCv0jjG1l7O51/hQP/mb5BnxgB82NKVSAHeS2XNETD3Qg== X-Received: by 2002:a5d:4b48:: with SMTP id w8mr2762772wrs.203.1622037009761; Wed, 26 May 2021 06:50:09 -0700 (PDT) Received: from localhost (dslb-178-012-047-165.178.012.pools.vodafone-ip.de. [178.12.47.165]) by smtp.gmail.com with ESMTPSA id z18sm21247242wro.33.2021.05.26.06.50.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 May 2021 06:50:08 -0700 (PDT) Date: Wed, 26 May 2021 15:50:49 +0200 From: Dmitry Dolgov <9erthalion6@gmail.com> To: "Poot, Bas (B.J.)" Cc: "pgsql-bugs@lists.postgresql.org" Subject: Re: XX000: unknown type of jsonb container. Message-ID: <20210526135049.afseg47jmnqirqge@localhost> References: <534fca83789c4a378c7de379e9067d4f@politie.nl> <20210407181105.lmi7hgifwzs3eeee@localhost> <20210413161500.kufk4iyrmcmhhbrc@localhost> <20210423151505.lxx5ti7ivcza3xqw@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210423151505.lxx5ti7ivcza3xqw@localhost> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk > On Fri, Apr 23, 2021 at 05:15:05PM +0200, Dmitry Dolgov wrote: > > On Tue, Apr 13, 2021 at 06:15:00PM +0200, Dmitry Dolgov wrote: > > > On Wed, Apr 07, 2021 at 08:11:05PM +0200, Dmitry Dolgov wrote: > > > > On Wed, Apr 07, 2021 at 10:59:31AM +0000, Poot, Bas (B.J.) wrote: > > > > > > > > Finally! I have a testcase for you guys. This is my query to generate the data. > > > > select * > > > > into tmp_bug2 > > > > from ( > > > > select 'thing' as logical_name > > > > , 'thing' as display_name > > > > , 'thing' as operation > > > > , '{"unit": "Our special Unit", "some.place": "placename", "place_of_birth": "Over the rainbow", "How_secret_is_it": "Level 1", "Does.it.shoot": "YES!"}'::jsonb as filtur > > > > from generate_series(1, 302443) > > > > ) t1; > > > > > > > > And this is the query that generates the error. > > > > > > > > select > > > > display_name > > > > ,'' as x > > > > ,filtur > > > > ,jsonb_each_text(filtur) as x > > > > ,to_jsonb(jsonb_each_text(filtur)) as frows > > > > ,array(SELECT jsonb_object_keys(filtur)) as objectkeys > > > > from tmp_bug2 > > > > order by logical_name; > > > > > > > > Notice that when you generate not 302443 but 302442 rows, it works perfectly fine. > > > > > > Thanks for posting the test case, I can reproduce it on the master > > > branch as well (also without the second call to jsonb_each_text in line > > > with to_jsonb). Interesting, it looks like for unclear to me reasons the > > > argument, evaluated in ExecMakeFunctionResultSet for jsonb_each_text, > > > contains value from the previous attribute, not jsonb. This makes > > > iteratorFromContainer complain because both array & object flags are set > > > in the header. I'll try to investigate, unless someone else will be > > > faster. > > > > Here is what I've found so far: > > > > * It seems that technically the regression was introduced in > > ea190ed14b, but not directly, via using gather paths in more > > situations. > > > > * The direct problem is that JsonbIteratorInit is confused by the > > argument, because it contains both headers for array and object set. > > From what I understood this confusion stems from > > ExecMakeFunctionResultSet taking wrong value from the slot. Hacking it > > to use different attnum in this case makes it work. > > > > * The explanation for this could be that target list from where attnum > > is taken and slot values have different order of elements. This in > > turn comes out of grouping planner trying to isolate SRF and SRF-free > > targets and as a result changing the order of elements in > > final_target. The final_target is then passed into > > create_ordered_paths and applied via apply_projection_to_path, but > > somehow goes in disagreement with what is used while creating the slot > > with values. > > > > If this analysis is correct, I'm not sure yet what would be the best > > course of action to address the problem, need to think a bit more. But > > probably others have suggestions or comments? > > I couldn't find any other feasible explanations, and have come to a > conclusion that this happens when a projection is applied to a > GatherMerge path. As it's a projection capable path, no new projection > is created and target list is changed in place. In the subpath target > list ordering is different because of query ordering, and I don't see > where it all comes together during execution. Funny enough even explain > shows that the final plan passes a wrong values to jsonb_each_text. > > If I make GatherMerge non projection capable it fixes this particular > case and changes only one test in select_parallel (seems like a minor > plan changes). But I have not enough experience with this code to say if > it's a good or bad idea. Almost forgot about this one. It seems that the issue still could be reproduced on the latest master branch, so probably worth an open item.