[Git][java-team/libpostgresql-jdbc-java][upstream] New upstream version 42.2.23

Christoph Berg (@myon) gitlab at salsa.debian.org
Tue Jul 27 16:22:28 BST 2021



Christoph Berg pushed to branch upstream at Debian Java Maintainers / libpostgresql-jdbc-java


Commits:
62407510 by Christoph Berg at 2021-07-27T17:05:29+02:00
New upstream version 42.2.23
- - - - -


24 changed files:

- certdir/badclient.crt
- certdir/badclient.key
- certdir/badclient.p12
- certdir/badclient.pk8
- certdir/badroot.crt
- certdir/badroot.key
- certdir/badroot.srl
- certdir/goodclient.crt
- − certdir/goodclient.der
- certdir/goodclient.key
- certdir/goodclient.p12
- certdir/goodclient.pk8
- certdir/goodroot.crt
- pom.xml
- src/main/java/org/postgresql/core/TypeInfo.java
- src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java
- src/main/java/org/postgresql/jdbc/PgResultSet.java
- src/main/java/org/postgresql/jdbc/TypeInfoCache.java
- src/main/java/org/postgresql/util/DriverInfo.java
- src/main/resources/META-INF/MANIFEST.MF
- src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
- src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java
- − src/test/java/org/postgresql/test/jdbc3/TestCommitError.java
- src/test/java/org/postgresql/test/jdbc42/DatabaseMetaDataTest.java


Changes:

=====================================
certdir/badclient.crt
=====================================
@@ -1,24 +1,24 @@
 -----BEGIN CERTIFICATE-----
-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
+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
-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
+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
-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
+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
 -----END CERTIFICATE-----


=====================================
certdir/badclient.key
=====================================
@@ -1,27 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-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
+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
 -----END RSA PRIVATE KEY-----


=====================================
certdir/badclient.p12
=====================================
Binary files a/certdir/badclient.p12 and b/certdir/badclient.p12 differ


=====================================
certdir/badclient.pk8
=====================================
Binary files a/certdir/badclient.pk8 and b/certdir/badclient.pk8 differ


=====================================
certdir/badroot.crt
=====================================
@@ -1,32 +1,32 @@
 -----BEGIN CERTIFICATE-----
-MIIFdzCCA1+gAwIBAgIUbj8F0il3g59jSOi60A/xzVkFRPcwDQYJKoZIhvcNAQEL
+MIIFdzCCA1+gAwIBAgIUEjAlC/uP068o5ssD61kJIeqlil8wDQYJKoZIhvcNAQEL
 BQAwSzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYDVQQKDAtQZ0pkYmMg
-dGVzdDEZMBcGA1UEAwwQcm9vdCBjZXJ0aWZpY2F0ZTAeFw0yMDAyMTIyMjE1Mzha
-Fw0yMjEyMDIyMjE1MzhaMEsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIG
+dGVzdDEZMBcGA1UEAwwQcm9vdCBjZXJ0aWZpY2F0ZTAeFw0yMTA2MjcxMzU2MzZa
+Fw0zMTA2MjUxMzU2MzZaMEsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIG
 A1UECgwLUGdKZGJjIHRlc3QxGTAXBgNVBAMMEHJvb3QgY2VydGlmaWNhdGUwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDfvDvQ38M5p8DtAwrhEAU9OFkS
-RfLNOJFs+No8RnytCSoXepyQLC+OwH2HFji7U9dKuiXTu8gszjKGqL/0p6S3e8cc
-WHPzGzoOCifM46kN/W9EUrD0bO47zJuRKlcoc+fa1g5v6XYHqSpFDAmdP1yRTtvo
-OG/n8/wmpOH07uc0ddEOX8oq5PE8hJJlyahaI3Vh7hCjfJ0cplnLsmmPLnD9cFM6
-snErOlWep+88eTywoylp2H7R2dBcwZfNXxuhE0RWXe7mwVCJ4yMra19mmtMgfuEF
-YqR/IuYbVu3R8uPifoR51yXxoHcEGZn/vf9NDqAFDachY2ChXiEBVHieVqPZwmEP
-jZobJEet0TG+wKQfxpLwIY982jh1QJcsvk23Mn78Et6BQQlyXC7b5WAO6RwoQXxv
-jVBViV77dEee1sp9aDrFEQjYvQYdFMhkLzakIEEoAjDPTUIFUWZDvwLjp/9mi4MZ
-/iOkQOojZCvsWOIEDjfJWIHhH23a/Ow3eFZ05J8v+AK6GkbFZz2XJCsNPMEk0Ue2
-h2ReLRNufcfN5ezM3Suwb9TWBm8CviZlYhpJkFidvf/CBRgTOP4i0yaommdGpO2F
-RfHFURwkmyDddz4hZ5qGWs/LXvRb+QHELH0yZdwhlheMBBEpjxr9FuqzNHxmAGsu
-PCmT3UcFuk6mVVduWQIDAQABo1MwUTAdBgNVHQ4EFgQUQ+IJXE1ZvTo6ArM/IHmd
-cMdGhOowHwYDVR0jBBgwFoAUQ+IJXE1ZvTo6ArM/IHmdcMdGhOowDwYDVR0TAQH/
-BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAnK2wP2RM2dDD3fGC0uLoGXATLZyG
-Y8Z0fuqxQA5PM7NWKhZQrOOq+1GhUU6iFSzm1ahcNQuYeAQK7x7Ulq+eIoAbdHWC
-CIXg2iyRR1sk1HANR5a8UUANfIfyriU56scDllb/bWUx4M/g1j8Z4d5u7+NlSLOb
-JP2vVnhA3fT0LA/au37spejYiKuf9XJXp9vpggJH1tnamSEgJWBsH+MfvX/MgRln
-83UU4BCAtKEAs1A4xvWp9TcKeiaObRRXFZ50y73cjxc4rAyHu+BOQemz/Lv2lsyv
-LVtU33Fo0B05qM7/vOvZweNq/U0DarCz6pgmTeXXtvkodd1NaliMkAcTWfuzGSl0
-FwWCjHtK8si8vTAVnM6Wk0NKh99JM6bJCtRx/WFhHE3PrCLIN9JpVqBPz7nDUOj5
-uOd3CvtZrx5TxZ9W06MzkZXD6YeJUEimjNeh2PE7cBrN80dQO5chCy9E2Z7my6yM
-VQkeIGXOIvKCDpQQU/f+rDmf/+LyLVzqvNZXuXIzNGFby9vG0/EUu1ejmdCNGaJ8
-+uMCm99Q+i2WAbpWZiOthAtHlZH8+z6sMNxGG0Pt7ZdxV4Ea2F8tUASA6iQij3fj
-mjOACjE/wfZby5t1+rWE0KKnC94Is2WioHbJ7O6dItGMhI1BDgmYAa+DepN/DIqz
-csW5Kiyql9L0VuM=
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDfA9I8At3NfZC3EPeHzGGu8zvy
+oCP45pVi/26ZLYcJZvD6hh0vaV8c0HlE7eKiHtfEC6IIPDD/w5heu0OIKMstrNZ4
+t7VsUikDmQpfV2G0yHqO1/A9HVM8DZWn4o2Ahg4qslmFpxpVyLG7E8Qk/3LjcfYC
+EvtLdO/09zrsSfB2t+TiNQozOa8i3FuCdZ/tEI3+a5I8iMm7C7PDsJwTeVNExkJH
+flLa7Sc5HF845K2/8hxmQg83MVELG2d3IKaCWI5jgtlghlE/egxU57+Iien1w76K
+/jnvlADcOkTozRzPvV1QcNFekxNjKiL1pJ5B+c59HIeOGQTzun8P2/UGzipUWc+x
+FN93r7lNX25kMC4d9a2pBBV1jIrxRXx6jU0SbjG++VwJ/LqJcCQS8x9a9+7tpcqb
+OCE5P4bd2ez+J2694RpdW6WclgreDYmpWrHI1HZp4aGRxslmrgedK7i42iluX1P+
+1DEsqXeAuk+2VNgg0XTtkqVD0DNTkV22KF/liPfP5aw0EDEzVY3gywbkP54DOowu
++yqdzyIEhyxmiyI41H3AnnGQ4sg2QJR9VVqKVjnkH4V/sSAx17YXgWruYgZGFiFY
+4BdPYWb/3Gqo7yjO/yw/QZsm5Sebbc6f43X0gmY8Bbgze+28NFV4AI8cBV8jrLa2
+3aytLIW8bvesh4lofQIDAQABo1MwUTAdBgNVHQ4EFgQUvdZn8MeAbNNGQRpYQ1At
+Sv6xiwEwHwYDVR0jBBgwFoAUvdZn8MeAbNNGQRpYQ1AtSv6xiwEwDwYDVR0TAQH/
+BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAR8PaXvjR8tQBcF/bXJIghxqBZkyO
+wAfT/wUXrKcX0OuLdK0kv8IRtnSxVvSc4X15pqvc+yZEDYDVFgjBxwO43ax6V0DX
+7j1Co3jRoqjrZHlc7XMTF25EcdCif79NXQLdxTNiGCKdunSMm9rNz8A52BnxoBqM
+XciQUjbWeDD2Zst1/8jTakOAJQHQa5GbFMSvE1Qoke8+epb7l8sj0327O3YXxTQL
+u4c0Z1duJehy8u9Tfu6yBCiYh4H3OD/MJ5ah95GH0AjXW6g4AqR3lov/9gkc4qx/
+BMrewtidFZ8mkG4cgPZ5AcqJKDkaFqXHBfIwstLc1GcvmZumhv2lH4YdkKWCSuyX
+w4sW8Ii4XvUFvzXMCuS5jTP3qe42kDZPuoLxrRgiBHxSX6coEroORAdXeu3/1iS+
+MTz/Dypq7VPE2h9xWtzJb7YFsLg342x5YxW59G+vtBy0u4tf6AoomZk0EME68P7H
+VicKoFBEdTVudn4Ts1jhcfahBMwgD7b1d59eQLCAST/5vmEBTdpzCtzIzf7gjH9s
+rgPZ6nDJcFhHi0BjUbMiKh2wqvOL6erpwtbDOTccFfEYWMT3uteOaMsPZLNMeq6R
+xKM8NitvBXuqIZOcgrrpABwek+/XdRnHqpsFTCNzPfHzP8/p/6tp7+DbZ1IF/uqz
+3HcpkqolJfg6Rlo=
 -----END CERTIFICATE-----


=====================================
certdir/badroot.key
=====================================
@@ -1,54 +1,54 @@
 -----BEGIN RSA PRIVATE KEY-----
 Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-256-CBC,0FD2DF610C4C6635674474640336EB8B
+DEK-Info: AES-256-CBC,BF4CD6E429942664D50549895DA4C8D8
 
-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
+ZkfDkMDMgXCddN7U9REjV9twFyj0NzEOItYzo7NI8vRGCxeBpul87bmziH7tkPGo
+R9NGCJdyP5i3lZyZBBd9s7tT75GOlZoMRO9ZfEf6hzTjwbnc0fxWbyBV4UTh/+ld
+Fxou2kKDXaKMkeLOBllnv3DKOJU4d4gwtqolumJ+d6/ZCcMRkxSFjvByQrF3aM7L
+KffaD9TBzKXkGT+l7oBANsVLwhejqQ0UWX1oZb5WYHMPvjozB+/sEhiGJAm1ITsZ
+4RZC8T874sfBUHianKrbFagvMqX76tZUOCIzGxkXuqPnX/eeNn2h73Y9aVRlXG68
+OkzqE93a6ttY0FMZ5el8NDxE/YzhJscD5kN6b1Yg3/X9bjTe+NR0afz/LS1YVkwR
+G9wZpRu+Mstbc3hnlO75JkH//qSHW/mljwE5z9iLPh058pjIopPWLJyCo4HVhcdW
+SOTaSczCIq1Yq7PT12fllWBP1Rlf2ZP63XnZmPO+FzflUB25eLBuStTLPR6ueXpR
+H1lSHB4d2KtgA7/IdOxKJJoN/YbhD+zJQmWfvbQvzyRUi5yuBChDSR5dVXJe0AQu
+6G1xxpReVOoJvcISh7/I7Y7mHsVVRMuvsTnXE3GkrtZhNQYVsKzig4xMWEiyRaZX
+sPIoUs967wY0W3p1jXFpYjpLL09aHwylngSVGrxNO0CO18GiDySO3Cl5m0XZjg7Y
+0TCzY+J+PGROnTaOF6pD32A69SQZmcwk1qNCvEsu1QeF0zh+FzPz+mV5S89wuAqY
+nRIm71LwwJzwO0bGlwbo9IzDcHmYjGkxLBEportDtNyrV+2pHGzQbtLeMETYh/aM
+FMceQo1y9VzydNgMhTg02PgU0K2mpBS5mbxk05El3B/iaEdGFi4RIm3DWF/N97y/
+8XkAh8iKXLihNcUlUpIn5l6PewhHuW3Wp+n+juGYKfp28FFfz/9nbipUsDSsWmKY
+uaTANuL0G43ed37whSS/zpDxj4+UCsf22mfCbNkkb5SyPdSkb9zZntSPR9V1z98W
+rIIOMvRzE1WApIUAwr8fgKE1t1rl+QUDmExfxws03hcdmOM7givWC4jV5PtStlnv
+2UGNV1BIUHlRAzBolv4/spwA73F71glqiLnPboBx/tngwXTjidxZivcYGDcWu/+V
+Uad4aIlw0gddJlK08rAObTd18mwbJ61roD6haNALVuRdiiSY3QfXY4rFcP7Hr7a3
+WUP0rN2tNxM9kCY/nTIkNVXL6cJ5pDh8ZV1vkb2c6RvEgDzrghwBx9h1hY5f4BEy
+lHY/PK6tmK1Gt4zPFRomia8Ihgg8UHDVgiVbt6zgfb58Q0w9pr2410oX4r4GNmt/
+6LZWIIOSuwdIIRtNzszsPixLTjwJaC4/9ul+VYb7ab6C/3ncv3XD10fe/1vK2uTQ
+MkcXpTt6lou/qNCc3K8wio4bLUWU+8C3n3MzMiZTWi0XP7alawLh6QqIGNPkS1+N
+ogHuGD2DmqB48pYcmeKGDCQeAQSqRbUIxagFWL946z6rjCssrjTCQURztB8nEcn2
+5YunsZ/DCUT6Sc++U6HqaNXemmg5W9HZsrErdRGrtX2kV9c9gdeqzcGRwXR3gWGW
+vFXCDG2sw9JonJUbDrDCfhIoU4CB89XVu6LlDrjx4F37j+hEpz34HdrbPNtiUh4x
+WmvBQoYYa3PSs6JxJ7gKdRsu8cZqKiHBQqs6lsZhVQ3e5CDrXcKaVy/FuGf2EXps
+sHA4FCnbj4rxCAcqvd1Rx9KhVoxMTvsEQrzs6fEifMiVjv6uCrRWimU08Vnteq9z
+wghlj1CcwLyb2ohRmC8KdVRNQCCAZHiP/JtNOvrCf4tmu4v3/WE/7o4i8qFGMbwU
+RUMHiDC5d8qmUt2F+WGTHuULdI+NRkayFAFH5rI9XUhVnT8W57fM5xOaF5y4VwRY
+L4mXrgpHdTb8KmJptnOowpbQ+WLLzQyQS97EXZSyzX+2FwBtXmtvhsvwUokJsf6i
+MECwariyP1JKnsnVgY3zFGCYhVHhynxmo0JqDgdYJEa0ph9LsnHgp0uaSc+atdGg
+trHyncURaIV7YvkWO1rDdVSS8rHKEXFLSGUnPFISwa27H6xWz2ch8De1u0TKVLbM
+8D3UFBhl/hSi/8BVNAvcYuJ7Yvyt2IkyULMnWVHLSeIZi/pCYaYvZV2r27XaCUxL
+PfvmW+y1wGgNukVU0vcyMKF3upKr6s9YKk+A6g6doUP/+EDWkIl7FEGhV1NZTIJ6
+olqj4MtpSXyZZ6vzfvAiOHrY0nXM0p4HjF/7B+Hd67i+eyTD2KZPda/KvllZHI9P
+8BqduzULQqgzbskKty7kPdLuhWRGyompwcGCaqFe/EhPD/C3EL1mcL8hH68Ywdb2
+2V8Tg6gNWXxmtXewv3wVysix9s4uzPBUUnyluBwHShYoUgLEpPZqU0vBubeZ6/ID
+lsxijw92xcxEa3qaudEBF97xmL+DeW7Mx2q2nR1qDLyBPrw41D6gyTLw1X8tBQ3m
+zczLZzOn/egEDCXK3LE+kYYAkZ4s9+sYSnNyVGc+nrFyZU13V/1JCIdsJFuXFRKb
+/ht6Mwtl9D/ZO+S7A+lDUkZGE3hLsj+44fifJfb0cUuo53vKcqClQRDRYej03e3h
+Gy9lieHFDMXmG/DXDpmDbsclPEE43613cdxqDT5cYVNBX/2GUblcrRDUzysr7S5Z
+OLRYEAAGvlLrefNtTYcTt3kG1W8y53SGZYsCdTjkqRt0v7JzAvOeH/EVPAeSwGbQ
+jF7uVj3P8kZAEEQlqrHdJ/XkD9J0dQ+jGkVBWqH+9oHFesjAf53aCazHJFCqIFs9
+EqIY5/xXOXYUTZj6e9UR2QtxQxaFvOb7rnn6Pk9Cj3wg+pOsAY6Xi0/fgy+ti43k
+TM5/eEAxElXUEbqCL4+miH8g0pOCv1BuKlhre5yZb6In6jmErc9KvvA+jabn2u3d
+moPov5+c5g5o/yqKgAFmysTCDg3WUjPOtNLNdlX/0G2vqABTgR+oOVAd/pA26nck
+qxIwtmARFzpDAtmv95gEQSjQAyx0wjItAtvexusxX12gptxgunCiYuko9H1GYLy2
+TyEzs/HBOO3bFl6bsiFGqiHSjgvMF/x3eGDq8S3ZdYrk/BByeXqWmp35p8mV9rwt
 -----END RSA PRIVATE KEY-----


=====================================
certdir/badroot.srl
=====================================
@@ -1 +1 @@
-1AC753D35B847A76B0CD2C570710B4AD3E6FF4D5
+10599F2C87091E6AE8588703E8E8CB18D55CB412


=====================================
certdir/goodclient.crt
=====================================
@@ -1,24 +1,24 @@
 -----BEGIN CERTIFICATE-----
-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
+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
-GTAXBgNVBAMMEHJvb3QgY2VydGlmaWNhdGUwHhcNMjAwMjEyMjIxNTM3WhcNMjEw
-NjI2MjIxNTM3WjBAMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFTATBgNVBAoM
+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
-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
+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
 -----END CERTIFICATE-----


=====================================
certdir/goodclient.der deleted
=====================================
Binary files a/certdir/goodclient.der and /dev/null differ


=====================================
certdir/goodclient.key
=====================================
@@ -1,27 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-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
+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
 -----END RSA PRIVATE KEY-----


=====================================
certdir/goodclient.p12
=====================================
Binary files a/certdir/goodclient.p12 and b/certdir/goodclient.p12 differ


=====================================
certdir/goodclient.pk8
=====================================
Binary files a/certdir/goodclient.pk8 and b/certdir/goodclient.pk8 differ


=====================================
certdir/goodroot.crt
=====================================
@@ -1,32 +1,32 @@
 -----BEGIN CERTIFICATE-----
-MIIFdzCCA1+gAwIBAgIUGc1fU1BurY/TzdSmEN2P2Ul5U84wDQYJKoZIhvcNAQEL
+MIIFdzCCA1+gAwIBAgIUZok1lfYqJerJHIiWp/xDukOP1SYwDQYJKoZIhvcNAQEL
 BQAwSzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYDVQQKDAtQZ0pkYmMg
-dGVzdDEZMBcGA1UEAwwQcm9vdCBjZXJ0aWZpY2F0ZTAeFw0yMDAyMTIyMjE1Mzda
-Fw0yMjEyMDIyMjE1MzdaMEsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIG
+dGVzdDEZMBcGA1UEAwwQcm9vdCBjZXJ0aWZpY2F0ZTAeFw0yMTA2MjcxMzU2MzVa
+Fw0zMTA2MjUxMzU2MzVaMEsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIG
 A1UECgwLUGdKZGJjIHRlc3QxGTAXBgNVBAMMEHJvb3QgY2VydGlmaWNhdGUwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+EwtKkC0DvQdayFPLmTI2Xcw6
-byE+OOTby4dHTQXaxRqquVVM6nWhPHDzVmq9DdasKcbchmA3c4d62Kq7Sw6578V5
-C+8tjKDst/5NNCfLR8qOgZwJn0keTEIsjMT4pJf8mz+qZxN45qilBo/ubin0sxLU
-1suMXqf2+Od1wzKY7IuMb1p+/73AGMXQ9yAOCuQ2efldr/WGbDZDzDTqF0zOWgdT
-Bwn+UiLCIaxbSpPIygpTqdwaePdRoVzKv8lLXSH2hpYgPxn9pYFO02KXIj9zlTzm
-7vSwRKMTxZSLIFBVvGIVOYk0w8pL3MxZ77EFt2+275eP+fHYjMmx79QvDENc1UGq
-ktmC/0+lPo2hk9g0SZlgaXiY4VsnuQKnTTeytSAtu+UNcWR/uX3srIsH5ZbeaNYO
-JD189o3kmW50Hirbqvzo5ykU+lknGjk190wZ35y/J1iARq6n31xYvHMRzWU+zDCD
-/f33YTPFH+Hz0MlqqsFBAarHWbds19wIxMF4MRSG96oE661FSUjCzT2qX4WAkNav
-V92cL7CCnON+SJG4jfdjMKIegggljm1RKcGpg5x4kuwg6qnLULFGPpw0Y3zcDJQa
-Cy1WfmJv1Lg0Oi1NmGtgYUSVXmUttkbx5iu2yC93CxWa2Vf2inLwfyqN6K2sRvp6
-yg3T92AXajPuSCItwQIDAQABo1MwUTAdBgNVHQ4EFgQUZh+BTFHH2OFVuiZ2k5LI
-51IrQgQwHwYDVR0jBBgwFoAUZh+BTFHH2OFVuiZ2k5LI51IrQgQwDwYDVR0TAQH/
-BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAVe/hTGr4eBYnWAm7IYaK8GrNgepi
-fim9QZizBn9jKOwoRZAttwE9+59AE6wh+YBFZ5y+RQvEYiB1Pzqsyzh9QsZHVcdg
-NoJh6kAGz5CDlw2WbJ7hLBAmCLWHTDESfJvHqttCHVmwm1oJllMAgxcPBsqO8sa1
-5Gm39Ohze4vPP9cAjKQQvXV4msqykYl5htKIIZV736sgzT9bHi5CwahKwId4SK1f
-t6LGHfGRfBmNeH3+Ueg1I+vEDKyiQgRztYqrYQY04Gsr+f341bflCId5ZXEvePUE
-jrFJvL6pM9ocErWCPwUn2nSerfCtNLPKjo7iWX75Kf6rGQ4Ydo1VkTa9Q40IkKXy
-aawHi95KKX2cpEnXSbsKh1QQZFoON+3ih4OCWhMl1StkKMfAX/p/ptV6FXDZ8Ncy
-dH51EYQbFZDGHTlayqnTsZWQYTJwcEl2x/W+QzFZyGZWejIOADpBIEHGuL1tjp+6
-vXvBqn2+YQ8PZJVm9AvpDYfcc14bNBTes9uFqTBW0wBAuB/JFa+9pEfdZE/+MRVg
-ehZhV4XtF7Q1Pf2INj1g8+DSa5AKdMGEqEvuOYyZlUeKJ/+Sxt4AfyM/pfLLycm3
-7r9onVx6ha9IcKn8/rbz/JDPdI+0A9edMqIEQvuFmYardfZQtAMsGEasTiCLvcQj
-3iB68vF1iUJv+dY=
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCuXfIqe27Y9YAASUFqPwX9z5jL
+Yzs7HoYOsJiXeKlxuiIE8KrDxrdlkDY3Cb/eWgREq0IkbowrznDZ0rCIE88hom+d
+HHtqw6V1+sBLfuw1o83Jm2kQRbpa+Lacsfza9DUJj7Zy4m9DY+yKXULi5N0ncvI4
+YBeIceczcb/y0mpATUGsTfbetOkFOv3Zn/Di53/gWzVOftFzSYCyUOJ1ocJYmOjN
+2/Fey1Z2qNF/sVoxhusd59TDKtBu81uHuSS9mHlVin9GEjG/eD/zxzDgnamvpFKv
+tatGrjS42nZmKS656xpizvL3hPE+aLBZglqmvHFDIe7WMBok08EKleQGH1kazFXD
+Q4fJaZTwzRA/pDKVmmycJG6HrgN4nANq0CiUolmCg82ZGkYv/X0sQrLAUyqYD9sQ
+mtE83E0y2tSJ6swnQL7PoP6J5wYLVOOvCGdv0E6chb4EKlGaHD5Ylq3Tj7rJdhCh
+XADkiHHKFzsxA9YnnGvzNKm9F5IImwGgatdffVNof9RrTpJCuwnuV+7zqH29oqun
+XsMzXbbcxXgyOfKTZdAViHY043xB9bpfIv0LFCC4T4UGcq1n/B0Wu576Q/3ySHKh
+v1FXdG+MlR/3jdtVWQmig6krLQzBTnivbZJUCDj9BA8K+iRhpSuUj+h9WODMrpjb
+JzuxJxaN8wvFS6GuDwIDAQABo1MwUTAdBgNVHQ4EFgQUOoukTRhVzM0yLN1NY6kU
+YVVNaqYwHwYDVR0jBBgwFoAUOoukTRhVzM0yLN1NY6kUYVVNaqYwDwYDVR0TAQH/
+BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAV1Rq9UdWvotgJBHETTiz7bssIfbx
+C3OYw7aN6KlxtfDHnz/Xre8bn8y3U+Ahmwi5c1DCITHyWqkhZXJdN7POTFMlaUNu
+8OqhoNYrwQmxPEy6bItLWW+kYMDi88ufEaP3JXiYogKFI2Vff+tyZC65bJFWYBD+
+uvOviEtSeYoZaO0Z/OFZ5PNCq8LFwmNAcNFiTbhkQfW74BM2rwhdMqSVcXCbjn9E
+oieu0iB08ktpnAPsDMZ9MU1pGuPXjsza/N5CTCMfJ9EDlDkD1cVNk9Mms+r3IFXQ
+bnb5RxcNWKfHkQ5RTCmW0LusS1EZIKVOWxhkoDK7Kn6CqR6QSmS52hXB03Rsz1zH
+/4/X3HrO6DXjivZ04Im4rTzfLR/tHD3RrbMXPbEwWY/hftMgI9JKLsthCnjiD3Xh
+QHepbYvGElW5326L1nzBJW7Rbx6eR/+aBPEWTkyr6rW+CMxZEUHFmsD7GLbqXy6M
+rizrTdgg5dGrN3Tej9aYQiW5SZwld3TzTlDdBu5c+xUiku3bYJNO6VIttdSVng7b
+xzCTrk0vOSAnvr78FAdeRWNLUnD27mPRBEi5O06/NX2A0OhGE/p0UCpPjT24Pdh8
+0+ivlYIk8zceHC6XrthNKdkA9PuA/rmpyG4kwkOpkvO9nUwCNTrEVJGwhPTf2S7J
+2arAdVehUudv304=
 -----END CERTIFICATE-----


=====================================
pom.xml
=====================================
@@ -10,7 +10,7 @@
     <artifactId>postgresql</artifactId>
     <packaging>jar</packaging>
     <name>PostgreSQL JDBC Driver - JDBC 4.2</name>
-    <version>42.2.22</version>
+    <version>42.2.23</version>
     <description>Java JDBC 4.2 (JRE 8+) driver for PostgreSQL database</description>
     <url>https://github.com/pgjdbc/pgjdbc</url>
 


=====================================
src/main/java/org/postgresql/core/TypeInfo.java
=====================================
@@ -85,6 +85,8 @@ public interface TypeInfo {
 
   Iterator<String> getPGTypeNamesWithSQLTypes();
 
+  Iterator<Integer> getPGTypeOidsWithSQLTypes();
+
   /* @Nullable */ Class<? extends PGobject> getPGobject(String type);
 
   String getJavaClass(int oid) throws SQLException;


=====================================
src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java
=====================================
@@ -1647,7 +1647,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
       } else {
         decimalDigits = connection.getTypeInfo().getScale(typeOid, typeMod);
         columnSize = connection.getTypeInfo().getPrecision(typeOid, typeMod);
-        if (columnSize == 0) {
+        if ( sqlType != Types.NUMERIC && columnSize == 0 ) {
           columnSize = connection.getTypeInfo().getDisplaySize(typeOid, typeMod);
         }
       }
@@ -1680,17 +1680,18 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
       tuple[18] = null; // SCOPE_CATLOG
       tuple[19] = null; // SCOPE_SCHEMA
       tuple[20] = null; // SCOPE_TABLE
-      tuple[21] = baseTypeOid == 0
+      tuple[21] = baseTypeOid == 0 // SOURCE_DATA_TYPE
                   ? null
-                  : connection.encodeString(Integer.toString(connection.getTypeInfo().getSQLType(baseTypeOid))); // SOURCE_DATA_TYPE
+                  : connection.encodeString(Integer.toString(connection.getTypeInfo().getSQLType(baseTypeOid)));
 
       String autoinc = "NO";
       if (defval != null && defval.contains("nextval(") || identity != null) {
         autoinc = "YES";
       }
-      tuple[22] = connection.encodeString(autoinc);
+      tuple[22] = connection.encodeString(autoinc); // IS_AUTOINCREMENT
+
       // there is no way to tell if the value was actually autogenerated..
-      tuple[23] = connection.encodeString("");
+      tuple[23] = connection.encodeString(""); // IS_AUTOGENERATED
 
       v.add(new Tuple(tuple));
     }
@@ -2064,16 +2065,17 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
     while (rs.next()) {
       byte[] /* @Nullable */ [] tuple = new byte[8][];
       int typeOid = (int) rs.getLong("atttypid");
+      int sqlType = connection.getTypeInfo().getSQLType(typeOid);
       int typeMod = rs.getInt("atttypmod");
       int decimalDigits = connection.getTypeInfo().getScale(typeOid, typeMod);
       int columnSize = connection.getTypeInfo().getPrecision(typeOid, typeMod);
-      if (columnSize == 0) {
+      if ( sqlType != Types.NUMERIC && columnSize == 0) {
         columnSize = connection.getTypeInfo().getDisplaySize(typeOid, typeMod);
       }
       tuple[0] = connection.encodeString(Integer.toString(scope));
       tuple[1] = rs.getBytes("attname");
       tuple[2] =
-          connection.encodeString(Integer.toString(connection.getTypeInfo().getSQLType(typeOid)));
+          connection.encodeString(Integer.toString(sqlType));
       tuple[3] = connection.encodeString(connection.getTypeInfo().getPGType(typeOid));
       tuple[4] = connection.encodeString(Integer.toString(columnSize));
       tuple[5] = null; // unused
@@ -2170,6 +2172,49 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
     return createMetaDataStatement().executeQuery(sql);
   }
 
+  /*
+  This is for internal use only to see if a resultset is updateable.
+  Unique keys can also be used so we add them to the query.
+   */
+  protected ResultSet getPrimaryUniqueKeys(/* @Nullable */ String catalog, /* @Nullable */ String schema, String table)
+      throws SQLException {
+    String sql;
+    sql = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, "
+        + "  ct.relname AS TABLE_NAME, a.attname AS COLUMN_NAME, "
+        + "  (information_schema._pg_expandarray(i.indkey)).n AS KEY_SEQ, ci.relname AS PK_NAME, "
+        + "  information_schema._pg_expandarray(i.indkey) AS KEYS, a.attnum AS A_ATTNUM "
+        + "FROM pg_catalog.pg_class ct "
+        + "  JOIN pg_catalog.pg_attribute a ON (ct.oid = a.attrelid) "
+        + "  JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) "
+        + "  JOIN pg_catalog.pg_index i ON ( a.attrelid = i.indrelid) "
+        + "  JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) "
+        + "WHERE true ";
+
+    if (schema != null && !schema.isEmpty()) {
+      sql += " AND n.nspname = " + escapeQuotes(schema);
+    }
+
+    if (table != null && !table.isEmpty()) {
+      sql += " AND ct.relname = " + escapeQuotes(table);
+    }
+
+    sql += " AND (i.indisprimary or i.indisunique) ";
+    sql = "SELECT "
+        + "       result.TABLE_CAT, "
+        + "       result.TABLE_SCHEM, "
+        + "       result.TABLE_NAME, "
+        + "       result.COLUMN_NAME, "
+        + "       result.KEY_SEQ, "
+        + "       result.PK_NAME "
+        + "FROM "
+        + "     (" + sql + " ) result"
+        + " where "
+        + " result.A_ATTNUM = (result.KEYS).x ";
+    sql += " ORDER BY result.table_name, result.pk_name, result.key_seq";
+
+    return createMetaDataStatement().executeQuery(sql);
+  }
+
   /**
    * @param primaryCatalog primary catalog
    * @param primarySchema primary schema
@@ -2623,10 +2668,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
         + "as remarks, CASE WHEN t.typtype = 'd' then  (select CASE";
 
     StringBuilder sqlwhen = new StringBuilder();
-    for (Iterator<String> i = connection.getTypeInfo().getPGTypeNamesWithSQLTypes(); i.hasNext(); ) {
-      String pgType = i.next();
-      int sqlType = connection.getTypeInfo().getSQLType(pgType);
-      sqlwhen.append(" when typname = ").append(escapeQuotes(pgType)).append(" then ").append(sqlType);
+    for (Iterator<Integer> i = connection.getTypeInfo().getPGTypeOidsWithSQLTypes(); i.hasNext(); ) {
+      Integer typOid = i.next();
+      int sqlType = connection.getTypeInfo().getSQLType(typOid);
+      sqlwhen.append(" when t.oid = ").append(typOid).append(" then ").append(sqlType);
     }
     sql += sqlwhen.toString();
 


=====================================
src/main/java/org/postgresql/jdbc/PgResultSet.java
=====================================
@@ -1357,7 +1357,12 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
       PgResultSet rs = (PgResultSet) selectStatement.executeQuery();
 
       if (rs.next()) {
-        rowBuffer = rs.thisRow;
+        // we know that the row is updatable as it was tested above.
+        if ( rs.thisRow == null ) {
+          rowBuffer = null;
+        } else {
+          rowBuffer = castNonNull(rs.thisRow).updateableCopy();
+        }
       }
 
       castNonNull(rows).set(currentRow, castNonNull(rowBuffer));
@@ -1618,7 +1623,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
     /* @Nullable */ String[] s = quotelessTableName(castNonNull(tableName));
     String quotelessTableName = castNonNull(s[0]);
     /* @Nullable */ String quotelessSchemaName = s[1];
-    java.sql.ResultSet rs = connection.getMetaData().getPrimaryKeys("",
+    java.sql.ResultSet rs = ((PgDatabaseMetaData)connection.getMetaData()).getPrimaryUniqueKeys("",
         quotelessSchemaName, quotelessTableName);
 
     while (rs.next()) {


=====================================
src/main/java/org/postgresql/jdbc/TypeInfoCache.java
=====================================
@@ -38,6 +38,8 @@ public class TypeInfoCache implements TypeInfo {
   // pgname (String) -> java.sql.Types (Integer)
   private Map<String, Integer> pgNameToSQLType;
 
+  private Map<Integer, Integer> oidToSQLType;
+
   // pgname (String) -> java class name (String)
   // ie "text" -> "java.lang.String"
   private Map<String, String> pgNameToJavaClass;
@@ -134,6 +136,7 @@ public class TypeInfoCache implements TypeInfo {
     // needs to be synchronized because the iterator is returned
     // from getPGTypeNamesWithSQLTypes()
     pgNameToSQLType = Collections.synchronizedMap(new HashMap<String, Integer>((int) Math.round(types.length * 1.5)));
+    oidToSQLType = Collections.synchronizedMap(new HashMap<Integer, Integer>((int) Math.round(types.length * 1.5)));
 
     for (Object[] type : types) {
       String pgTypeName = (String) type[0];
@@ -155,6 +158,7 @@ public class TypeInfoCache implements TypeInfo {
     oidToPgName.put(oid, pgTypeName);
     pgArrayToPgType.put(arrayOid, oid);
     pgNameToSQLType.put(pgTypeName, sqlType);
+    oidToSQLType.put(oid, sqlType);
 
     // Currently we hardcode all core types array delimiter
     // to a comma. In a stock install the only exception is
@@ -167,6 +171,7 @@ public class TypeInfoCache implements TypeInfo {
     String pgArrayTypeName = pgTypeName + "[]";
     pgNameToJavaClass.put(pgArrayTypeName, "java.sql.Array");
     pgNameToSQLType.put(pgArrayTypeName, Types.ARRAY);
+    oidToSQLType.put(arrayOid, Types.ARRAY);
     pgNameToOid.put(pgArrayTypeName, arrayOid);
     pgArrayTypeName = "_" + pgTypeName;
     if (!pgNameToJavaClass.containsKey(pgArrayTypeName)) {
@@ -187,7 +192,11 @@ public class TypeInfoCache implements TypeInfo {
     return pgNameToSQLType.keySet().iterator();
   }
 
-  private String getSQLTypeQuery(boolean typnameParam) {
+  public Iterator<Integer> getPGTypeOidsWithSQLTypes() {
+    return oidToSQLType.keySet().iterator();
+  }
+
+  private String getSQLTypeQuery(boolean typoidParam) {
     // There's no great way of telling what's an array type.
     // People can name their own types starting with _.
     // Other types use typelem that aren't actually arrays, like box.
@@ -198,7 +207,7 @@ public class TypeInfoCache implements TypeInfo {
     // (keeping old behaviour of finding types, that should not be found without correct search
     // path)
     StringBuilder sql = new StringBuilder();
-    sql.append("SELECT typinput='array_in'::regproc as is_array, typtype, typname ");
+    sql.append("SELECT typinput='array_in'::regproc as is_array, typtype, typname, pg_type.oid ");
     sql.append("  FROM pg_catalog.pg_type ");
     sql.append("  LEFT JOIN (select ns.oid as nspoid, ns.nspname, r.r ");
     sql.append("          from pg_namespace as ns ");
@@ -208,8 +217,8 @@ public class TypeInfoCache implements TypeInfo {
     sql.append("         using ( nspname ) ");
     sql.append("       ) as sp ");
     sql.append("    ON sp.nspoid = typnamespace ");
-    if (typnameParam) {
-      sql.append(" WHERE typname = ? ");
+    if (typoidParam) {
+      sql.append(" WHERE pg_type.oid = ? ");
     }
     sql.append(" ORDER BY sp.r, pg_type.oid DESC;");
     return sql.toString();
@@ -258,14 +267,15 @@ public class TypeInfoCache implements TypeInfo {
       if (!pgNameToSQLType.containsKey(typeName)) {
         pgNameToSQLType.put(typeName, type);
       }
+
+      Integer typeOid = castNonNull(rs.getInt("oid"));
+      if (!oidToSQLType.containsKey(typeOid)) {
+        oidToSQLType.put(typeOid, type);
+      }
     }
     rs.close();
   }
 
-  public int getSQLType(int oid) throws SQLException {
-    return getSQLType(castNonNull(getPGType(oid)));
-  }
-
   private PreparedStatement prepareGetTypeInfoStatement() throws SQLException {
     PreparedStatement getTypeInfoStatement = this.getTypeInfoStatement;
     if (getTypeInfoStatement == null) {
@@ -276,19 +286,24 @@ public class TypeInfoCache implements TypeInfo {
   }
 
   public synchronized int getSQLType(String pgTypeName) throws SQLException {
-    if (pgTypeName.endsWith("[]")) {
-      return Types.ARRAY;
+    return getSQLType(castNonNull(getPGType(pgTypeName)));
+  }
+
+  public synchronized int getSQLType(int typeOid) throws SQLException {
+    if (typeOid == Oid.UNSPECIFIED) {
+      return Types.OTHER;
     }
-    Integer i = pgNameToSQLType.get(pgTypeName);
+
+    Integer i = oidToSQLType.get(typeOid);
     if (i != null) {
       return i;
     }
 
-    LOGGER.log(Level.FINEST, "querying SQL typecode for pg type '{0}'", pgTypeName);
+    LOGGER.log(Level.FINEST, "querying SQL typecode for pg type oid '{0}'", typeOid);
 
     PreparedStatement getTypeInfoStatement = prepareGetTypeInfoStatement();
 
-    getTypeInfoStatement.setString(1, pgTypeName);
+    getTypeInfoStatement.setInt(1, typeOid);
 
     // Go through BaseStatement to avoid transaction start.
     if (!((BaseStatement) getTypeInfoStatement)
@@ -298,14 +313,14 @@ public class TypeInfoCache implements TypeInfo {
 
     ResultSet rs = castNonNull(getTypeInfoStatement.getResultSet());
 
-    int type = Types.OTHER;
+    int sqlType = Types.OTHER;
     if (rs.next()) {
-      type = getSQLTypeFromQueryResult(rs);
+      sqlType = getSQLTypeFromQueryResult(rs);
     }
     rs.close();
 
-    pgNameToSQLType.put(pgTypeName, type);
-    return type;
+    oidToSQLType.put(typeOid, sqlType);
+    return sqlType;
   }
 
   private PreparedStatement getOidStatement(String pgTypeName) throws SQLException {


=====================================
src/main/java/org/postgresql/util/DriverInfo.java
=====================================
@@ -16,13 +16,13 @@ public final class DriverInfo {
   // Driver name
   public static final String DRIVER_NAME = "PostgreSQL JDBC Driver";
   public static final String DRIVER_SHORT_NAME = "PgJDBC";
-  public static final String DRIVER_VERSION = "42.2.22";
+  public static final String DRIVER_VERSION = "42.2.23";
   public static final String DRIVER_FULL_NAME = DRIVER_NAME + " " + DRIVER_VERSION;
 
   // Driver version
   public static final int MAJOR_VERSION = 42;
   public static final int MINOR_VERSION = 2;
-  public static final int PATCH_VERSION = 22;
+  public static final int PATCH_VERSION = 23;
 
   // JDBC specification
   public static final String JDBC_VERSION = "4.2";


=====================================
src/main/resources/META-INF/MANIFEST.MF
=====================================
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Implementation-Title: PostgreSQL JDBC Driver
 Bundle-License: BSD-2-Clause
 Automatic-Module-Name: org.postgresql.jdbc
-Implementation-Version: 42.2.22
+Implementation-Version: 42.2.23
 Specification-Vendor: Oracle Corporation
 Specification-Title: JDBC
 Implementation-Vendor-Id: org.postgresql


=====================================
src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
=====================================
@@ -73,6 +73,7 @@ public class DatabaseMetaDataTest {
     }
     TestUtil.createTable(con, "metadatatest",
         "id int4, name text, updated timestamptz, colour text, quest text");
+    TestUtil.createTable(con, "precision_test", "implicit_precision numeric");
     TestUtil.dropSequence(con, "sercoltest_b_seq");
     TestUtil.dropSequence(con, "sercoltest_c_seq");
     TestUtil.createTable(con, "sercoltest", "a int, b serial, c bigserial");
@@ -130,6 +131,7 @@ public class DatabaseMetaDataTest {
     TestUtil.dropTable(con, "sercoltest");
     TestUtil.dropSequence(con, "sercoltest_b_seq");
     TestUtil.dropSequence(con, "sercoltest_c_seq");
+    TestUtil.dropTable(con, "precision_test");
     TestUtil.dropTable(con, "\"a\\\"");
     TestUtil.dropTable(con, "\"a'\"");
     TestUtil.dropTable(con, "arraytable");
@@ -495,6 +497,16 @@ public class DatabaseMetaDataTest {
     TestUtil.closeDB(con1);
   }
 
+  @Test
+  public void testNumericPrecision() throws SQLException {
+    DatabaseMetaData dbmd = con.getMetaData();
+    assertNotNull(dbmd);
+    ResultSet rs = dbmd.getColumns(null, "public", "precision_test", "%");
+    assertTrue("It should have a row for the first column", rs.next());
+    assertEquals("The column size should be zero", 0, rs.getInt("COLUMN_SIZE"));
+    assertFalse("It should have a single column", rs.next());
+  }
+
   @Test
   public void testColumns() throws SQLException {
     // At the moment just test that no exceptions are thrown KJ


=====================================
src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java
=====================================
@@ -56,6 +56,8 @@ public class UpdateableResultTest extends BaseTest4 {
     // put some dummy data into second
     st2.execute("insert into second values (1,'anyvalue' )");
     st2.close();
+    TestUtil.createTable(con, "uniqueconstraint", "u1 int unique, name1 text");
+    TestUtil.execute("insert into uniqueconstraint values (1, 'dave')", con);
 
   }
 
@@ -68,6 +70,7 @@ public class UpdateableResultTest extends BaseTest4 {
     TestUtil.dropTable(con, "stream");
     TestUtil.dropTable(con, "nopkmulticol");
     TestUtil.dropTable(con, "booltable");
+    TestUtil.dropTable(con, "uniqueconstraint");
     super.tearDown();
   }
 
@@ -444,6 +447,26 @@ public class UpdateableResultTest extends BaseTest4 {
     st.close();
   }
 
+  @Test
+  public void test2193() throws Exception {
+    Statement st =
+        con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
+    ResultSet rs = st.executeQuery("select * from updateable");
+    assertNotNull(rs);
+    rs.moveToInsertRow();
+    rs.updateInt(1, 1);
+    rs.updateString(2, "jake");
+    rs.updateString(3, "avalue");
+    rs.insertRow();
+    rs.first();
+
+    rs.updateString(2, "bob");
+    rs.updateRow();
+    rs.refreshRow();
+    rs.updateString(2, "jake");
+    rs.updateRow();
+  }
+
   @Test
   public void testInsertRowIllegalMethods() throws Exception {
     Statement st =
@@ -703,4 +726,16 @@ public class UpdateableResultTest extends BaseTest4 {
     rs.close();
     st.close();
   }
+
+  @Test
+  public void testUniqueUpdatable() throws Exception {
+    Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
+        ResultSet.CONCUR_UPDATABLE);
+    ResultSet rs = st.executeQuery("SELECT * from uniqueconstraint");
+    assertTrue(rs.next());
+    assertTrue(rs.first());
+    rs.updateString("name1", "bob");
+    rs.close();
+    st.close();
+  }
 }


=====================================
src/test/java/org/postgresql/test/jdbc3/TestCommitError.java deleted
=====================================
@@ -1,33 +0,0 @@
-package org.postgresql.test.jdbc3;
-
-import org.postgresql.test.jdbc2.BaseTest4;
-
-import org.junit.Test;
-
-import java.sql.SQLException;
-import java.sql.Statement;
-
-public class TestCommitError extends BaseTest4 {
-
-  @Test
-  public void testCommitError() throws SQLException {
-    Statement stmt = con.createStatement();
-
-    con.setAutoCommit(false);
-    try {
-      stmt.executeQuery("select * from sometablethatdoesnotexist");
-    } catch (Exception ex ) {
-      // ignore it
-    }
-
-    try {
-      con.commit();
-    } catch (Exception ex ){
-      System.err.printf("exception thrown %s\n", ex.getMessage());
-      System.exit(0);
-    }
-    System.err.println("Should not get here");
-
-
-  }
-}


=====================================
src/test/java/org/postgresql/test/jdbc42/DatabaseMetaDataTest.java
=====================================
@@ -18,6 +18,7 @@ import org.junit.Test;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
+import java.sql.Types;
 
 public class DatabaseMetaDataTest {
 
@@ -26,12 +27,22 @@ public class DatabaseMetaDataTest {
   @Before
   public void setUp() throws Exception {
     conn = TestUtil.openDB();
+    TestUtil.createSchema(conn, "test_schema");
+    TestUtil.createEnumType(conn, "test_schema.test_enum", "'val'");
+    TestUtil.createTable(conn, "test_schema.off_path_table", "var test_schema.test_enum[]");
+    TestUtil.createEnumType(conn, "_test_enum", "'evil'");
+    TestUtil.createEnumType(conn, "test_enum", "'other'");
+    TestUtil.createTable(conn, "on_path_table", "a test_schema.test_enum[], b _test_enum, c test_enum[]");
     TestUtil.createTable(conn, "decimaltest", "a decimal, b decimal(10, 5)");
   }
 
   @After
   public void tearDown() throws Exception {
     TestUtil.dropTable(conn, "decimaltest");
+    TestUtil.dropTable(conn, "on_path_table");
+    TestUtil.dropType(conn, "test_enum");
+    TestUtil.dropType(conn, "_test_enum");
+    TestUtil.dropSchema(conn, "test_schema");
     TestUtil.closeDB(conn);
   }
 
@@ -52,4 +63,43 @@ public class DatabaseMetaDataTest {
 
     assertTrue(!rs.next());
   }
+
+  @Test
+  public void testGetCorrectSQLTypeForOffPathTypes() throws Exception {
+    DatabaseMetaData dbmd = conn.getMetaData();
+
+    ResultSet rs = dbmd.getColumns("%", "%", "off_path_table", "%");
+    assertTrue(rs.next());
+    assertEquals("var", rs.getString("COLUMN_NAME"));
+    assertEquals("Detects correct off-path type name", "\"test_schema\".\"_test_enum\"", rs.getString("TYPE_NAME"));
+    assertEquals("Detects correct SQL type for off-path types", Types.ARRAY, rs.getInt("DATA_TYPE"));
+
+    assertFalse(rs.next());
+  }
+
+  @Test
+  public void testGetCorrectSQLTypeForShadowedTypes() throws Exception {
+    DatabaseMetaData dbmd = conn.getMetaData();
+
+    ResultSet rs = dbmd.getColumns("%", "%", "on_path_table", "%");
+
+    assertTrue(rs.next());
+    assertEquals("a", rs.getString("COLUMN_NAME"));
+    assertEquals("Correctly maps types from other schemas","\"test_schema\".\"_test_enum\"", rs.getString("TYPE_NAME"));
+    assertEquals(Types.ARRAY, rs.getInt("DATA_TYPE"));
+
+    assertTrue(rs.next());
+    assertEquals("b", rs.getString("COLUMN_NAME"));
+    // = TYPE _test_enum AS ENUM ('evil')
+    assertEquals( "_test_enum", rs.getString("TYPE_NAME"));
+    assertEquals(Types.VARCHAR, rs.getInt("DATA_TYPE"));
+
+    assertTrue(rs.next());
+    assertEquals("c", rs.getString("COLUMN_NAME"));
+    // = array of TYPE test_enum AS ENUM ('value')
+    assertEquals("Correctly detects shadowed array type name","___test_enum", rs.getString("TYPE_NAME"));
+    assertEquals("Correctly detects type of shadowed name", Types.ARRAY, rs.getInt("DATA_TYPE"));
+
+    assertFalse(rs.next());
+  }
 }



View it on GitLab: https://salsa.debian.org/java-team/libpostgresql-jdbc-java/-/commit/62407510e3a9425b8c1f8826bf77b07ddc9af51d

-- 
View it on GitLab: https://salsa.debian.org/java-team/libpostgresql-jdbc-java/-/commit/62407510e3a9425b8c1f8826bf77b07ddc9af51d
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20210727/de4969bb/attachment.htm>


More information about the pkg-java-commits mailing list