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 1rAclU-007Ruf-PT for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 21:15:36 +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 1rAclT-006Ej0-F6 for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 21:15:35 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rAclT-006Eis-3n for pgsql-hackers@lists.postgresql.org; Tue, 05 Dec 2023 21:15:35 +0000 Received: from mail-yw1-x1134.google.com ([2607:f8b0:4864:20::1134]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rAclP-00AHUV-V1 for pgsql-hackers@postgresql.org; Tue, 05 Dec 2023 21:15:34 +0000 Received: by mail-yw1-x1134.google.com with SMTP id 00721157ae682-5d8d2b5d1b5so22813277b3.0 for ; Tue, 05 Dec 2023 13:15:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701810930; x=1702415730; darn=postgresql.org; h=content-transfer-encoding:in-reply-to:autocrypt:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=PK8KTmUgQVM1H6cgUPCcugXqenhr4GkdHvffBMJl548=; b=DblY28kIb3QOgGj+CL3LrUZtrYb8SRSXVGr1yhXxAnP04+pRjTsOjqtI1U1xxBcLAf kIbtBniTQ/crIs6DUrJh+IjeGhXdsdeCE3kW97MpmXcXLIaYWmD3T0YAwaR1FHhMPsGQ 9koYE2boTk4N9pyeurziMw0u9EzDuqUMime8NicC3+BgffUHw93Qsql/2TD33363x241 9N5893zMlLduQQi2eYO3fKeuJeGO9jXSnDGhNnN6xTKfkvhoTyMGqsB/rTVW0XBQAQVH oE1r0PhcMy6HWRoJBIdBZ4/kR+dDkQa/JCuZ2XQd3lVwzXArQOn7ZkE/KLZROWJmlUJF h1ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701810930; x=1702415730; h=content-transfer-encoding:in-reply-to:autocrypt:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=PK8KTmUgQVM1H6cgUPCcugXqenhr4GkdHvffBMJl548=; b=ZCCmljuidIi4did+P9mdFgo0SqnuVDEn3zIByphITWmD0GGSwHc1w7QnpETdax3/8X q9C+NqIYTcccLo4yPk5mM7fiiWxa+KJEEAFhFYj8IbvuLpDdRJxROxVC59vWjve01krV kscc7Q8KsI39Uy/9L2W5dguQC+YGmcSvWHfH9ZgmP3QciC1ciQ/0fe8+S1EV91u+Pgno T467r06zMWcvYCICCas6kB5WTpiHiK7dJ3U73pNMuO+sQRf8sbgdFtNCxTZLZiJhdXky ecDr8XXX29LjFEXHlfl+nCwrP+XJSD1fzeV69/cU5Ns0GkQBS0KDHXZAc0/lZJuu2woS qZ7Q== X-Gm-Message-State: AOJu0Yy00sFIsiuN/mI88+CBsZGnAzXKbjOrIM6iBUPOHiI0a7Q8YYuQ CvuUtmOLpgW5USiH+PEhfNXrCw== X-Google-Smtp-Source: AGHT+IFG3T4Mo5/be6GU/uAaaha9VLJMWsh8fgOYHAV6n2qI+1mRFTIEKax+GkqndfOpY9I2M/ezew== X-Received: by 2002:a81:9816:0:b0:5cb:accf:ff1d with SMTP id p22-20020a819816000000b005cbaccfff1dmr3114807ywg.25.1701810930039; Tue, 05 Dec 2023 13:15:30 -0800 (PST) Received: from [192.168.4.41] (162-239-31-113.lightspeed.dybhfl.sbcglobal.net. [162.239.31.113]) by smtp.gmail.com with ESMTPSA id u132-20020a81478a000000b005d06c447e1esm4432950ywa.144.2023.12.05.13.15.29 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 05 Dec 2023 13:15:29 -0800 (PST) Message-ID: <86650b9d-ff52-4ec8-964d-4b9352971ecd@joeconway.com> Date: Tue, 5 Dec 2023 16:15:29 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Emitting JSON to file using COPY TO Content-Language: en-US To: Andrew Dunstan , Davin Shearer , PostgreSQL-development References: <9c77b6fa-ee88-b2e6-0fa7-4fc81721da35@dunslane.net> <41dcba92-1075-e5e5-cb99-36711abf6cec@dunslane.net> <5c84b70b-ba18-c45d-dbbe-612fa229b2ce@dunslane.net> <398c22f6-4299-4b17-80bf-2f14f4afd592@joeconway.com> <46cc4507-a0d9-4044-b2ce-5a8bca8015c0@joeconway.com> <2554e520-e103-8978-dcb5-807dfeb77402@dunslane.net> <22d9e40d-7de2-1301-3970-16136f7732a6@dunslane.net> From: Joe Conway Autocrypt: addr=mail@joeconway.com; keydata= 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 In-Reply-To: <22d9e40d-7de2-1301-3970-16136f7732a6@dunslane.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 12/5/23 16:12, Andrew Dunstan wrote: > > On 2023-12-05 Tu 16:02, Joe Conway wrote: >> On 12/5/23 15:55, Andrew Dunstan wrote: >>> >>> On 2023-12-05 Tu 14:50, Davin Shearer wrote: >>>> Hi Joe, >>>> >>>> In reviewing the 005 patch, I think that when used with FORCE ARRAY, >>>> we should also _imply_ FORCE ROW DELIMITER.  I can't envision a use >>>> case where someone would want to use FORCE ARRAY without also using >>>> FORCE ROW DELIMITER.  I can, however, envision a use case where >>>> someone would want FORCE ROW DELIMITER without FORCE ARRAY, like >>>> maybe including into a larger array.  I definitely appreciate these >>>> options and the flexibility that they afford from a user perspective. >>>> >>>> In the test output, will you also show the different variations with >>>> FORCE ARRAY and FORCE ROW DELIMITER => {(false, false), (true, >>>> false), (false, true), (true, true)}? Technically you've already >>>> shown me the (false, false) case as those are the defaults. >>>> >>>> >>> >>> I don't understand the point of FORCE_ROW_DELIMITER at all. There is >>> only one legal delimiter of array items in JSON, and that's a comma. >>> There's no alternative and it's not optional. So in the array case you >>> MUST have commas and in any other case (e.g. LINES) I can't see why you >>> would have them. >> >> The current patch already *does* imply row delimiters in the array >> case. It says so here: >> 8<--------------------------- >> +    >> + FORCE_ARRAY >> +     >> +      >> +       Force output of array decorations at the beginning and end of >> output. >> +       This option implies the FORCE_ROW_DELIMITER >> +       option. It is allowed only in COPY TO, and >> only >> +       when using JSON format. >> +       The default is false. >> +      >> 8<--------------------------- >> >> and it does so here: >> 8<--------------------------- >> +         if (opts_out->force_array) >> +             opts_out->force_row_delimiter = true; >> 8<--------------------------- >> >> and it shows that here: >> 8<--------------------------- >> + copy copytest to stdout (format json, force_array); >> + [ >> +  {"style":"DOS","test":"abc\r\ndef","filler":1} >> + ,{"style":"Unix","test":"abc\ndef","filler":2} >> + ,{"style":"Mac","test":"abc\rdef","filler":3} >> + ,{"style":"esc\\ape","test":"a\\r\\\r\\\n\\nb","filler":4} >> + ] >> 8<--------------------------- >> >> It also does not allow explicitly setting row delimiters false while >> force_array is true here: >> 8<--------------------------- >> >> +         if (opts_out->force_array && >> +             force_row_delimiter_specified && >> +             !opts_out->force_row_delimiter) >> +             ereport(ERROR, >> +                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), >> +                      errmsg("cannot specify FORCE_ROW_DELIMITER >> false with FORCE_ARRAY true"))); >> 8<--------------------------- >> >> Am I understanding something incorrectly? > > > But what's the point of having it if you're not using FORCE_ARRAY? See the follow up email -- other databases support it so why not? It seems to be a thing... -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com