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 1rAYh7-007Aav-Fs for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 16:54:49 +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 1rAYh6-004on5-6W for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 16:54:48 +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 1rAYh5-004oms-62 for pgsql-hackers@lists.postgresql.org; Tue, 05 Dec 2023 16:54:47 +0000 Received: from mail-yw1-x112e.google.com ([2607:f8b0:4864:20::112e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rAYh2-008wnN-H3 for pgsql-hackers@postgresql.org; Tue, 05 Dec 2023 16:54:45 +0000 Received: by mail-yw1-x112e.google.com with SMTP id 00721157ae682-5d8e816f77eso23385587b3.0 for ; Tue, 05 Dec 2023 08:54:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701795284; x=1702400084; darn=postgresql.org; h=content-transfer-encoding:in-reply-to:autocrypt:references:to:from :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=2vEnaairsx3JC8Ra1fbOPG0CARFevwzb8I5nd7a7/ZE=; b=YksfY5l55RS6KI20OOI7hJmj+L4DYe+W8LV8ZPFvqVxs4/2MGk5+6zvwkP9tbJ2m+3 OT0mCY3+W11u6iEl42qgFkuwwUClUl0/Wjs0sH5cUI1XciNy19Yar+exFS19VoUXKcDp Fl/YNEsfL2un+6/K7yl6/gE0eYQV+vE7AtdEupnqnNSbOty0hevhiWVdddCiKeiKPl7+ d/F4c6UUKl97vDMMoBpEeCgut336pRR7UHoxwqEBatWfbZZdwt22qjqyhnmn/JZJhzlk gT0Ha7r5LWkdn8Rf1E+cqZCOg9C+BQh2YAuYd27giK8AdxOO6tMfeMETLVtphd5jrBe+ G8lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701795284; x=1702400084; h=content-transfer-encoding:in-reply-to:autocrypt:references:to:from :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2vEnaairsx3JC8Ra1fbOPG0CARFevwzb8I5nd7a7/ZE=; b=F8qrFFUiQz0cJzCR99DEIoVkC4P6YrYDu6yKRSF0BizR2dB+UYkVL/g85LzwqliYGe dUtZizEnyUz/uI32UibpbdewBG8dGHwGrkEbKAx8RLOYM8oZ8xDKRRoR9r+CA19FS/nb JPsDGGJO+xPlO0mwm24zLzMHcOh/rn/+AomV5e3JiqCZ5yhgAmx0bb8jvJ+6TpCde3FP sw4jaeV429bYa/cuJo1vcZYK8gOsZkwEUaaXHfcWACMLj63nCpuJjei1e/c6AhWRnBW1 6F/1cCmUZ11y5tNLcpYGrVhmZiD0HBwqDjXU3HMIGqgTpYb4EqYhKrpXDZE7Mt3y/ADm Kjbw== X-Gm-Message-State: AOJu0YwaA1O5YDmrVO4Aj1B3TR3kx5PShb5ivziiGpFpstxj5esb2t1n K3fd4j+XDvyWKQ62TCrwTIABoA== X-Google-Smtp-Source: AGHT+IEzPMXQEUGwfYoFrRGi3QN2UyRvmCY4NK5XzpjKWjtzLn8k9Wpen+QgZ5SlitZQXonnXgQ/vA== X-Received: by 2002:a05:690c:368d:b0:5d7:1940:b392 with SMTP id fu13-20020a05690c368d00b005d71940b392mr5529124ywb.94.1701795283801; Tue, 05 Dec 2023 08:54:43 -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 k187-20020a816fc4000000b005d4e5a2cd5bsm3476035ywc.76.2023.12.05.08.54.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 05 Dec 2023 08:54:43 -0800 (PST) Message-ID: <398c22f6-4299-4b17-80bf-2f14f4afd592@joeconway.com> Date: Tue, 5 Dec 2023 11:54:42 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Emitting JSON to file using COPY TO Content-Language: en-US From: Joe Conway To: Davin Shearer , Andrew Dunstan , PostgreSQL-development References: <24e3ee88-ec1e-421b-89ae-8a47ee0d2df1@joeconway.com> <7117a356-916c-4cf3-bad8-861490e65dcf@joeconway.com> <9c77b6fa-ee88-b2e6-0fa7-4fc81721da35@dunslane.net> <41dcba92-1075-e5e5-cb99-36711abf6cec@dunslane.net> <5c84b70b-ba18-c45d-dbbe-612fa229b2ce@dunslane.net> Autocrypt: addr=mail@joeconway.com; keydata= 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 In-Reply-To: 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/4/23 21:54, Joe Conway wrote: > On 12/4/23 17:55, Davin Shearer wrote: >> There are however a few characters that need to be escaped > >> 1. |"|(double quote) >> 2. |\|(backslash) >> 3. |/|(forward slash) >> 4. |\b|(backspace) >> 5. |\f|(form feed) >> 6. |\n|(new line) >> 7. |\r|(carriage return) >> 8. |\t|(horizontal tab) >> >> These characters should be represented in the test cases to see how the >> escaping behaves and to ensure that the escaping is done properly per >> JSON requirements. > > I can look at adding these as test cases. So I did a quick check: 8<-------------------------- with t(f1) as ( values (E'aaa\"bbb'::text), (E'aaa\\bbb'::text), (E'aaa\/bbb'::text), (E'aaa\bbbb'::text), (E'aaa\fbbb'::text), (E'aaa\nbbb'::text), (E'aaa\rbbb'::text), (E'aaa\tbbb'::text) ) select length(t.f1), t.f1, row_to_json(t) from t; length | f1 | row_to_json --------+-------------+------------------- 7 | aaa"bbb | {"f1":"aaa\"bbb"} 7 | aaa\bbb | {"f1":"aaa\\bbb"} 7 | aaa/bbb | {"f1":"aaa/bbb"} 7 | aaa\x08bbb | {"f1":"aaa\bbbb"} 7 | aaa\x0Cbbb | {"f1":"aaa\fbbb"} 7 | aaa +| {"f1":"aaa\nbbb"} | bbb | 7 | aaa\rbbb | {"f1":"aaa\rbbb"} 7 | aaa bbb | {"f1":"aaa\tbbb"} (8 rows) 8<-------------------------- This is all independent of my patch for COPY TO. If I am reading that correctly, everything matches Davin's table *except* the forward slash ("/"). I defer to the experts on the thread to debate that... -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com