mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-29 03:37:20 +02:00
I'd supposed that people would do this manually when creating new operator classes, but the folly of that was exposed today. The tests seem fast enough that we can just apply them during the normal regression tests. contrib/isn fails the checks for lack of complete sets of cross-type operators. That's a nice-to-have policy rather than a functional requirement, so leave it as-is, but insert ORDER BY in the query to ensure consistent cross-platform output. Discussion: https://postgr.es/m/7076.1480446837@sss.pgh.pa.us
267 lines
9.5 KiB
Plaintext
267 lines
9.5 KiB
Plaintext
--
|
|
-- Test ISN extension
|
|
--
|
|
CREATE EXTENSION isn;
|
|
-- Check whether any of our opclasses fail amvalidate
|
|
-- ... they will, because of missing cross-type operators
|
|
SELECT amname, opcname
|
|
FROM (SELECT amname, opcname, opc.oid
|
|
FROM pg_opclass opc LEFT JOIN pg_am am ON am.oid = opcmethod
|
|
WHERE opc.oid >= 16384
|
|
ORDER BY 1, 2 OFFSET 0) ss
|
|
WHERE NOT amvalidate(oid);
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: btree operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
INFO: hash operator family "isn_ops" is missing cross-type operator(s)
|
|
amname | opcname
|
|
--------+------------
|
|
btree | ean13_ops
|
|
btree | isbn13_ops
|
|
btree | isbn_ops
|
|
btree | ismn13_ops
|
|
btree | ismn_ops
|
|
btree | issn13_ops
|
|
btree | issn_ops
|
|
btree | upc_ops
|
|
hash | ean13_ops
|
|
hash | isbn13_ops
|
|
hash | isbn_ops
|
|
hash | ismn13_ops
|
|
hash | ismn_ops
|
|
hash | issn13_ops
|
|
hash | issn_ops
|
|
hash | upc_ops
|
|
(16 rows)
|
|
|
|
--
|
|
-- test valid conversions
|
|
--
|
|
SELECT '9780123456786'::EAN13, -- old book
|
|
'9790123456785'::EAN13, -- music
|
|
'9791234567896'::EAN13, -- new book
|
|
'9771234567898'::EAN13, -- serial
|
|
'0123456789012'::EAN13, -- upc
|
|
'1234567890128'::EAN13;
|
|
ean13 | ean13 | ean13 | ean13 | ean13 | ean13
|
|
-------------------+-------------------+-----------------+-------------------+-----------------+-----------------
|
|
978-0-12-345678-6 | 979-0-1234-5678-5 | 979-123456789-6 | 977-1234-567-89-8 | 012-345678901-2 | 123-456789012-8
|
|
(1 row)
|
|
|
|
SELECT '9780123456786'::ISBN,
|
|
'123456789X'::ISBN,
|
|
'9780123456786'::ISBN13::ISBN,
|
|
'9780123456786'::EAN13::ISBN;
|
|
isbn | isbn | isbn | isbn
|
|
---------------+---------------+---------------+---------------
|
|
0-12-345678-9 | 1-234-56789-X | 0-12-345678-9 | 0-12-345678-9
|
|
(1 row)
|
|
|
|
SELECT -- new books, shown as ISBN13 even for ISBN...
|
|
'9791234567896'::ISBN,
|
|
'9791234567896'::ISBN13::ISBN,
|
|
'9791234567896'::EAN13::ISBN;
|
|
isbn | isbn | isbn
|
|
-----------------+-----------------+-----------------
|
|
979-123456789-6 | 979-123456789-6 | 979-123456789-6
|
|
(1 row)
|
|
|
|
SELECT '9780123456786'::ISBN13,
|
|
'123456789X'::ISBN13,
|
|
'9791234567896'::ISBN13,
|
|
'9791234567896'::EAN13::ISBN13;
|
|
isbn13 | isbn13 | isbn13 | isbn13
|
|
-------------------+-------------------+-----------------+-----------------
|
|
978-0-12-345678-6 | 978-1-234-56789-7 | 979-123456789-6 | 979-123456789-6
|
|
(1 row)
|
|
|
|
SELECT '9790123456785'::ISMN,
|
|
'9790123456785'::EAN13::ISMN,
|
|
'M123456785'::ISMN,
|
|
'M-1234-5678-5'::ISMN;
|
|
ismn | ismn | ismn | ismn
|
|
---------------+---------------+---------------+---------------
|
|
M-1234-5678-5 | M-1234-5678-5 | M-1234-5678-5 | M-1234-5678-5
|
|
(1 row)
|
|
|
|
SELECT '9790123456785'::ISMN13,
|
|
'M123456785'::ISMN13,
|
|
'M-1234-5678-5'::ISMN13;
|
|
ismn13 | ismn13 | ismn13
|
|
-------------------+-------------------+-------------------
|
|
979-0-1234-5678-5 | 979-0-1234-5678-5 | 979-0-1234-5678-5
|
|
(1 row)
|
|
|
|
SELECT '9771234567003'::ISSN,
|
|
'12345679'::ISSN;
|
|
issn | issn
|
|
-----------+-----------
|
|
1234-5679 | 1234-5679
|
|
(1 row)
|
|
|
|
SELECT '9771234567003'::ISSN13,
|
|
'12345679'::ISSN13,
|
|
'9771234567898'::ISSN13,
|
|
'9771234567898'::EAN13::ISSN13;
|
|
issn13 | issn13 | issn13 | issn13
|
|
-------------------+-------------------+-------------------+-------------------
|
|
977-1234-567-00-3 | 977-1234-567-00-3 | 977-1234-567-89-8 | 977-1234-567-89-8
|
|
(1 row)
|
|
|
|
SELECT '0123456789012'::UPC,
|
|
'0123456789012'::EAN13::UPC;
|
|
upc | upc
|
|
--------------+--------------
|
|
123456789012 | 123456789012
|
|
(1 row)
|
|
|
|
--
|
|
-- test invalid checksums
|
|
--
|
|
SELECT '1234567890'::ISBN;
|
|
ERROR: invalid check digit for ISBN number: "1234567890", should be X
|
|
LINE 1: SELECT '1234567890'::ISBN;
|
|
^
|
|
SELECT 'M123456780'::ISMN;
|
|
ERROR: invalid check digit for ISMN number: "M123456780", should be 5
|
|
LINE 1: SELECT 'M123456780'::ISMN;
|
|
^
|
|
SELECT '12345670'::ISSN;
|
|
ERROR: invalid check digit for ISSN number: "12345670", should be 9
|
|
LINE 1: SELECT '12345670'::ISSN;
|
|
^
|
|
SELECT '9780123456780'::ISBN;
|
|
ERROR: invalid check digit for ISBN number: "9780123456780", should be 6
|
|
LINE 1: SELECT '9780123456780'::ISBN;
|
|
^
|
|
SELECT '9791234567890'::ISBN13;
|
|
ERROR: invalid check digit for ISBN number: "9791234567890", should be 6
|
|
LINE 1: SELECT '9791234567890'::ISBN13;
|
|
^
|
|
SELECT '0123456789010'::UPC;
|
|
ERROR: invalid check digit for UPC number: "0123456789010", should be 2
|
|
LINE 1: SELECT '0123456789010'::UPC;
|
|
^
|
|
SELECT '1234567890120'::EAN13;
|
|
ERROR: invalid check digit for EAN13 number: "1234567890120", should be 8
|
|
LINE 1: SELECT '1234567890120'::EAN13;
|
|
^
|
|
--
|
|
-- test invalid conversions
|
|
--
|
|
SELECT '9790123456785'::ISBN; -- not a book
|
|
ERROR: cannot cast ISMN to ISBN for number: "9790123456785"
|
|
LINE 1: SELECT '9790123456785'::ISBN;
|
|
^
|
|
SELECT '9771234567898'::ISBN; -- not a book
|
|
ERROR: cannot cast ISSN to ISBN for number: "9771234567898"
|
|
LINE 1: SELECT '9771234567898'::ISBN;
|
|
^
|
|
SELECT '0123456789012'::ISBN; -- not a book
|
|
ERROR: cannot cast UPC to ISBN for number: "0123456789012"
|
|
LINE 1: SELECT '0123456789012'::ISBN;
|
|
^
|
|
SELECT '9790123456785'::ISBN13; -- not a book
|
|
ERROR: cannot cast ISMN to ISBN for number: "9790123456785"
|
|
LINE 1: SELECT '9790123456785'::ISBN13;
|
|
^
|
|
SELECT '9771234567898'::ISBN13; -- not a book
|
|
ERROR: cannot cast ISSN to ISBN for number: "9771234567898"
|
|
LINE 1: SELECT '9771234567898'::ISBN13;
|
|
^
|
|
SELECT '0123456789012'::ISBN13; -- not a book
|
|
ERROR: cannot cast UPC to ISBN for number: "0123456789012"
|
|
LINE 1: SELECT '0123456789012'::ISBN13;
|
|
^
|
|
SELECT '9780123456786'::ISMN; -- not music
|
|
ERROR: cannot cast ISBN to ISMN for number: "9780123456786"
|
|
LINE 1: SELECT '9780123456786'::ISMN;
|
|
^
|
|
SELECT '9771234567898'::ISMN; -- not music
|
|
ERROR: cannot cast ISSN to ISMN for number: "9771234567898"
|
|
LINE 1: SELECT '9771234567898'::ISMN;
|
|
^
|
|
SELECT '9791234567896'::ISMN; -- not music
|
|
ERROR: cannot cast ISBN to ISMN for number: "9791234567896"
|
|
LINE 1: SELECT '9791234567896'::ISMN;
|
|
^
|
|
SELECT '0123456789012'::ISMN; -- not music
|
|
ERROR: cannot cast UPC to ISMN for number: "0123456789012"
|
|
LINE 1: SELECT '0123456789012'::ISMN;
|
|
^
|
|
SELECT '9780123456786'::ISSN; -- not serial
|
|
ERROR: cannot cast ISBN to ISSN for number: "9780123456786"
|
|
LINE 1: SELECT '9780123456786'::ISSN;
|
|
^
|
|
SELECT '9790123456785'::ISSN; -- not serial
|
|
ERROR: cannot cast ISMN to ISSN for number: "9790123456785"
|
|
LINE 1: SELECT '9790123456785'::ISSN;
|
|
^
|
|
SELECT '9791234567896'::ISSN; -- not serial
|
|
ERROR: cannot cast ISBN to ISSN for number: "9791234567896"
|
|
LINE 1: SELECT '9791234567896'::ISSN;
|
|
^
|
|
SELECT '0123456789012'::ISSN; -- not serial
|
|
ERROR: cannot cast UPC to ISSN for number: "0123456789012"
|
|
LINE 1: SELECT '0123456789012'::ISSN;
|
|
^
|
|
SELECT '9780123456786'::UPC; -- not a product
|
|
ERROR: cannot cast ISBN to UPC for number: "9780123456786"
|
|
LINE 1: SELECT '9780123456786'::UPC;
|
|
^
|
|
SELECT '9771234567898'::UPC; -- not a product
|
|
ERROR: cannot cast ISSN to UPC for number: "9771234567898"
|
|
LINE 1: SELECT '9771234567898'::UPC;
|
|
^
|
|
SELECT '9790123456785'::UPC; -- not a product
|
|
ERROR: cannot cast ISMN to UPC for number: "9790123456785"
|
|
LINE 1: SELECT '9790123456785'::UPC;
|
|
^
|
|
SELECT '9791234567896'::UPC; -- not a product
|
|
ERROR: cannot cast ISBN to UPC for number: "9791234567896"
|
|
LINE 1: SELECT '9791234567896'::UPC;
|
|
^
|
|
SELECT 'postgresql...'::EAN13;
|
|
ERROR: invalid input syntax for EAN13 number: "postgresql..."
|
|
LINE 1: SELECT 'postgresql...'::EAN13;
|
|
^
|
|
SELECT 'postgresql...'::ISBN;
|
|
ERROR: invalid input syntax for ISBN number: "postgresql..."
|
|
LINE 1: SELECT 'postgresql...'::ISBN;
|
|
^
|
|
SELECT 9780123456786::EAN13;
|
|
ERROR: cannot cast type bigint to ean13
|
|
LINE 1: SELECT 9780123456786::EAN13;
|
|
^
|
|
SELECT 9780123456786::ISBN;
|
|
ERROR: cannot cast type bigint to isbn
|
|
LINE 1: SELECT 9780123456786::ISBN;
|
|
^
|
|
--
|
|
-- test some comparisons, must yield true
|
|
--
|
|
SELECT '12345679'::ISSN = '9771234567003'::EAN13 AS "ok",
|
|
'M-1234-5678-5'::ISMN = '9790123456785'::EAN13 AS "ok",
|
|
'9791234567896'::EAN13 != '123456789X'::ISBN AS "nope";
|
|
ok | ok | nope
|
|
----+----+------
|
|
t | t | t
|
|
(1 row)
|
|
|
|
--
|
|
-- cleanup
|
|
--
|
|
DROP EXTENSION isn;
|