mirror of
https://github.com/postgres/postgres.git
synced 2025-12-19 17:02:53 +03:00
Speed up byteain by not parsing traditional-style input twice.
Instead of laboriously computing the exact output length, use strlen to get an upper bound cheaply. (This is still O(N) of course, but the constant factor is a lot less.) This will typically result in overallocating the output datum, but that's of little concern since it's a short-lived allocation in just about all use-cases. A simple microbenchmark showed about 40% speedup for long input strings. While here, make some cosmetic cleanups and add a test case that covers the double-backslash code path in byteain and byteaout. Author: Steven Niu <niushiji@gmail.com> Reviewed-by: Kirill Reshke <reshkekirill@gmail.com> Reviewed-by: Stepan Neretin <slpmcf@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/ca315729-140b-426e-81a6-6cd5cfe7ecc5@gmail.com
This commit is contained in:
@@ -236,6 +236,12 @@ SELECT E'De\\678dBeEf'::bytea;
|
||||
ERROR: invalid input syntax for type bytea
|
||||
LINE 1: SELECT E'De\\678dBeEf'::bytea;
|
||||
^
|
||||
SELECT E'DeAd\\\\BeEf'::bytea;
|
||||
bytea
|
||||
----------------------
|
||||
\x446541645c42654566
|
||||
(1 row)
|
||||
|
||||
SELECT reverse(''::bytea);
|
||||
reverse
|
||||
---------
|
||||
@@ -291,6 +297,12 @@ SELECT E'De\\123dBeEf'::bytea;
|
||||
DeSdBeEf
|
||||
(1 row)
|
||||
|
||||
SELECT E'DeAd\\\\BeEf'::bytea;
|
||||
bytea
|
||||
------------
|
||||
DeAd\\BeEf
|
||||
(1 row)
|
||||
|
||||
-- Test non-error-throwing API too
|
||||
SELECT pg_input_is_valid(E'\\xDeAdBeE', 'bytea');
|
||||
pg_input_is_valid
|
||||
|
||||
@@ -76,6 +76,7 @@ SELECT E'De\\000dBeEf'::bytea;
|
||||
SELECT E'De\123dBeEf'::bytea;
|
||||
SELECT E'De\\123dBeEf'::bytea;
|
||||
SELECT E'De\\678dBeEf'::bytea;
|
||||
SELECT E'DeAd\\\\BeEf'::bytea;
|
||||
|
||||
SELECT reverse(''::bytea);
|
||||
SELECT reverse('\xaa'::bytea);
|
||||
@@ -88,6 +89,7 @@ SELECT E'\\xDe00BeEf'::bytea;
|
||||
SELECT E'DeAdBeEf'::bytea;
|
||||
SELECT E'De\\000dBeEf'::bytea;
|
||||
SELECT E'De\\123dBeEf'::bytea;
|
||||
SELECT E'DeAd\\\\BeEf'::bytea;
|
||||
|
||||
-- Test non-error-throwing API too
|
||||
SELECT pg_input_is_valid(E'\\xDeAdBeE', 'bytea');
|
||||
|
||||
Reference in New Issue
Block a user