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 1r9R2A-00HByJ-FI for pgsql-hackers@arkaria.postgresql.org; Sat, 02 Dec 2023 14:31:54 +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 1r9R28-00AnQ6-Fl for pgsql-hackers@arkaria.postgresql.org; Sat, 02 Dec 2023 14:31:52 +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 1r9R27-00AnPy-ON for pgsql-hackers@lists.postgresql.org; Sat, 02 Dec 2023 14:31:52 +0000 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1r9R24-008RNy-7G for pgsql-hackers@postgresql.org; Sat, 02 Dec 2023 14:31:50 +0000 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-5cbcfdeaff3so35610507b3.0 for ; Sat, 02 Dec 2023 06:31:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701527507; x=1702132307; darn=postgresql.org; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to; bh=YzjhGCFp12oBi+hTDFyZCVRHBFLtttquQl2rA+Dr4M8=; b=Y+WGHYHfYosbW2wgyL7BfsYPNZMcoDIYu9z2fwL6ohKbNW1qTbJEbeO00kLRMdjim+ sXDDJUqPn+HzTWnPuh6b54nyVoxJclymr3J0nC2EJMnrj6lORgnTD1IkUiHW5aidJ72F FIn+C+9LaltfALGjm+2jYASVT+iWXafbOokMugBhdw9/sY+ZkYnvlV6UQcR17A9+QwKq ppAX8SxNkTO+7tTVedM+Jifk+HxV9bqZmkDoek79r6K7/qIe2uVru/tXhf0cYS4iSoj9 P4lALr6mlgA/3g/stUIGkj8ovdOBp7gTGsZWbtXvVtBlTnIAto0P8AbdGmQt7pc2rNG7 RnXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701527507; x=1702132307; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=YzjhGCFp12oBi+hTDFyZCVRHBFLtttquQl2rA+Dr4M8=; b=jK1Yb4yp7W1DTsMrauCLznSp5KcLbtKxAVSQfjX19xayiG88aKNzsIoL/zMe4Z//SL HNrJb3Wx60iTwc+JfAInd4Dc1gzPi1xyHLlKrmuPuDAuDBCHi2g6RBK0AMn6z+CFrVSH 5stnZLGdEOZvYdZ8dInhvdH6/c9orygp/s4UNheM+siWakx4MGE9kWVF62MJc5FFFCYI ESuGbZjB5+zJ79lPlrkmFUhnFm0qWyVK6iPreu+uxMn+kyYYtXHogRCeeEddelBnA6Zh QxuZafQwYvt95TOnBpWw9xaEtnafaU4zXlejxg9amd0fqE5CFwtGtNUJOQ+qXMv6Bmwl sk+w== X-Gm-Message-State: AOJu0YwARDNoV4EQSkhcJoCDlePfe0jEhi/oLP7qnZTVRVdN7lkjb3RM ungCVHsW5C6Fw5c4Q695wOfq9A== X-Google-Smtp-Source: AGHT+IFjQP9C65X1tqhWWfD1BAPX6KnvRNlDGRDIYioFIsTlkjOoHB/4ZyUUSap4Rsf3sObp+M2ZMQ== X-Received: by 2002:a81:ee0b:0:b0:5d7:1940:f3e1 with SMTP id l11-20020a81ee0b000000b005d71940f3e1mr1047270ywm.73.1701527507356; Sat, 02 Dec 2023 06:31:47 -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 m125-20020a0dca83000000b005d723d17fe6sm525209ywd.27.2023.12.02.06.31.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 02 Dec 2023 06:31:47 -0800 (PST) Message-ID: <411395e0-697e-44ab-be98-dd2047f9a10e@joeconway.com> Date: Sat, 2 Dec 2023 09:31:46 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Emitting JSON to file using COPY TO To: Nathan Bossart Cc: Davin Shearer , PostgreSQL-development References: <3853387.1701096982@sss.pgh.pa.us> <3a98decf-3fe3-4b49-9b68-fda01338872c@sedlakovi.org> <24e3ee88-ec1e-421b-89ae-8a47ee0d2df1@joeconway.com> <20231201230958.GA1786735@nathanxps13> Content-Language: en-US From: Joe Conway Autocrypt: addr=mail@joeconway.com; keydata= xsFNBEpXMCsBEADDnXUQzjlyi/cX02Gtdy2CLcroE5CsC7DJKdOBDbfgn0kfiIYoV5JniG4l VyzZUodY8yUAagqLYolh0UkBzs9N+qkm7erde4ypw3jzVQ37BuzIvk3nMUbuDZDgxWqX+nVS sKc+BQ5BpzgCHg48leoRO2ohjvYnUhgH3j2rFZCzaj6qQ7mv+XoxOJmUlVQtG06Jwkk7Vu14 7U9nMMM6hyUKzVnmCphnlcMNo26UyVU70MwFfFJgcI0c5fpp8byN56eD6VJVnufO5WAuEhzE qcrSJR2FAlmM90GBY+6vP29twLDCHuSFvrnujNCx/BvCC/a3/gPvyAFp4JtMm9eXAmq3m/Kw 94nTJXVdcbQeQQDp3KIG7MmWS4lnGvPn8v0CjgNaLvZXFLo1FgmUVsyEq1Lww4iRLa6sbpXJ ESx15UEue1k1YZM9C+4F/o3aeKNsAienjw2EXFzcaxIg/C4P493VMi3Qa8ycVxR5iYhUbYdo DFIUQhbFNsYfrtW/qZAELT3FCYFpZYG01e9Hj+cBrXXgyDDkQ5Lq4mlvmkRvuxn61V6Au4HA 0sJiCox5pM1FvzT+aI8HY1BYaiB9Pl4fhpKgmhhlSuglk9v39S4jmlUIb45iLAUVpeNM6Qjm 69pf5da9sm4aGFa7YlDSKf/WcU7z9ITZxsilOi2n7YJiwG7kTQARAQABzSRKb3NlcGggRSBD b253YXkgPG1haWxAam9lY29ud2F5LmNvbT7CwXoEEwEIACQCGwMCHgECF4AFCwkIBwMFFQoJ CAsFFgIDAQAFAlWTVvUCGQEACgkQMyt+aLaZQ0oPCQ/9HyRewMyvAIJRmoXoLAr8AoFLId6R qBJnNX0Lll0RLZui65aQ0+exwX7aH7TxWR16B2gWX3OmLfGT8XITOoG+zt9zsEpLvNkHchkF T/jyAcbuRj5WX9hamZgMbjXAJeCdlhW+fRA9Upb0w4dgBjqK5OgsqMikASL7t2vogHl9H08j vSoQLW+8wTnSBXBeBTBwB7xLIin5WVivzFHUCrnD2UsjeBIW3fmGdpTAjSxRzG+UPYVwXQ8F FLt7DpEytvLWapmZWMRdj0WZ/Q3SOO/Ed0yFqbzuwKaWcFrQBNeS2Sig+FefBNS98f9Hx7ku H3DW34qX/zSSdDh0jLs7X3PkIgF6BZR2TxaCwHPP9ERDiDaUInC9U7We1iZE1DjW8rLMEVJB hY0ClrrF67pnUKTbcU+uajpPn+2Jl74T0Set/XxpHZ4cezcJuqg31R8vHZgd5cf1WKP0D0pc qiuS02BBFkNCs1jQ+raTWcDuE6F1mUO2nvjUBN9r4y5DUbCNSqLKeAe/aA6JaSDkBpoXKdNS +c4rbzbktWkfUW8EhVlCGzNpy4ezEoVsqV2Ex7fNoxsE2vnSylLT9hycAmYf8ryMvniRZqnD T4JgLenIcQlkhB896T7wApOXfD8OJj1/XFxAfPi6vdlsr81uoxuB4euLp8IyduwLORRUogO9 zmAXG5jOwU0ESlcyJwEQAOkTBb9yDhJbMUgvhM11rZwT5tm4Y9TqtEHn0Zy3t9g7bdFFpMva v/KENd3oAtLFpMDf+H3AggFk4ftUwJwiVgJ88ilvCynJUGXiuYIaexY4DLgn4xpnuiEpYEFV dWnlw7dWVTc62exfqIz9bSWRzwfBCY9ruYGEb4RDPDSNSAVyI7sxHzef2asiYxIcxrTrw5Vu gWNlPZcV5/EJ6PUvATjBF2TBkXV7KOciQng2tsQGrGMkY5mduNqwpuh6zfPcVF8LeObe96wv 5ZhPRpO79nef7hnK2lJogp3JIo558Jlbz9WHtQEMZR85+bUhtI825QyNAFz3Jrn7NMgvDikc 2OrWo7YMgMC5hDSWVFqA6/EQCNnDWGABWgeYHZFpnPwsvUWIYdhSilUuj/Tuzvz9ZmucFNbQ bauDQw6VQ38ofGnoYDZFJsGncprB8dBi4tDrIQ+1RlIh6C2Z/eMipqJOT26+spluTjouvnKT 0S5yOgyX0PjbsysgwQdCGNJLHOjhHbSpSmOLaduV3CQo/0+DHT/TBjYfIXjTWouY9TkGxG4e NrxU0u2xAy5bMqOPmsFdjLTWlQUlF/fTMhB54XwI3FHWgnSnXZzStDTmTebLNdT/ftgliAzA 81uMj49j0exv731/v+7udLA1bV8gnZ01zQCASDpWiRQR3fgwcugSUqgRABEBAAHCwV8EGAEI AAkFAkpXMicCGwwACgkQMyt+aLaZQ0pwAQ//bjcWnZg/jjRQ9gbZUGMqniItZYRglBMKIqt4 Fia379JmHwTvavnFkJ8XMZ56UB0FIrgS+sUkRH6cPRQR+7Qi392LD021DXgSsz9CwFHjFyBG HwLEOTRcfYQbtJy0shHDJB4aQTOX3ERDH1PsvJNuevmQMzS0DWFav9+xMz9rKP4N+HffoBIZ E0C1xIE43nD4eLsbycte9sVIrmlNuUti3qUxJAQw8HwfJ6ZbBInHxquApR16uD1u99o6Xlnd FrDlY22tRmHCM0bR81GfGNdcU3Uo+rG/R/k4qa7s9/dgKvMbyH3fHhp/ceKag80Xo8IFurRl 0ZJP3sHJ2QDHCVLat7jRZ+43hi1WlIhFbrgn6IyI0i7XR/W8JjrC5MsKq4TUwGH077sU/kcH YebVJZRbUUst2hAGHDFVBcG12qoKf+ltL9qXJc1y7BGeCoUW6QjOpljpq6ZL4FQUsM0RSRjs 5egE3szPcIf5SyPK6WDOApoAq6M7BBFMGDZwEylYMtr0YekA1u86UA9D2xwLHEbBBp/uiby1 c9JbPJ1Pn8zJP8WZNeRw4Q9TtqVK09+oLirMUSpIDd6KdZ1VgRxOK2re7tjDvkVuYsSrsiJ+ 1iJNEnp9iK0ok0DlJpSCe6KhkxpaTdeoWMXdKuJWec0NIqoAd54ZgBPnr+UPxTixgPq/p6Q= In-Reply-To: <20231201230958.GA1786735@nathanxps13> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 12/1/23 18:09, Nathan Bossart wrote: > On Fri, Dec 01, 2023 at 02:28:55PM -0500, Joe Conway wrote: >> I did a quick PoC patch (attached) -- if there interest and no hard >> objections I would like to get it up to speed for the January commitfest. > > Cool. I would expect there to be interest, given all the other JSON > support that has been added thus far. Thanks for the review > I noticed that, with the PoC patch, "json" is the only format that must be > quoted. Without quotes, I see a syntax error. I'm assuming there's a > conflict with another json-related rule somewhere in gram.y, but I haven't > tracked down exactly which one is causing it. It seems to be because 'json' is also a type name ($$ = SystemTypeName("json")). What do you think about using 'json_array' instead? It is more specific and accurate, and avoids the need to quote. test=# copy foo to stdout (format json_array); [ {"id":1,"f1":"line: 1","f2":"2023-12-01T12:58:16.776863-05:00"} ,{"id":2,"f1":"line: 2","f2":"2023-12-01T12:58:16.777084-05:00"} ,{"id":3,"f1":"line: 3","f2":"2023-12-01T12:58:16.777096-05:00"} ,{"id":4,"f1":"line: 4","f2":"2023-12-01T12:58:16.777103-05:00"} ] >> 1. Is supporting JSON array format sufficient, or does it need to support >> some other options? How flexible does the support scheme need to be? > > I don't presently have a strong opinion on this one. My instinct would be > start with something simple, though. I don't think we offer any special > options for log_destination... WFM >> 2. This only supports COPY TO and we would undoubtedly want to support COPY >> FROM for JSON as well, but is that required from the start? > > I would vote for including COPY FROM support from the start. Check. My thought is to only accept the same format we emit -- i.e. only take a json array. >> ! if (!cstate->opts.json_mode) > > I think it's unfortunate that this further complicates the branching in > CopyOneRowTo(), but after some quick glances at the code, I'm not sure it's > worth refactoring a bunch of stuff to make this nicer. Yeah that was my conclusion. -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com