pg 0.18.3 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.appveyor.yml +36 -0
  4. data/.gems +6 -0
  5. data/.github/workflows/binary-gems.yml +86 -0
  6. data/.github/workflows/source-gem.yml +129 -0
  7. data/.gitignore +13 -0
  8. data/.hgsigs +34 -0
  9. data/.hgtags +41 -0
  10. data/.irbrc +23 -0
  11. data/.pryrc +23 -0
  12. data/.tm_properties +21 -0
  13. data/.travis.yml +49 -0
  14. data/BSDL +2 -2
  15. data/Gemfile +14 -0
  16. data/History.rdoc +448 -4
  17. data/Manifest.txt +8 -21
  18. data/README-Windows.rdoc +4 -4
  19. data/README.ja.rdoc +1 -2
  20. data/README.rdoc +69 -17
  21. data/Rakefile +33 -135
  22. data/Rakefile.cross +70 -69
  23. data/certs/ged.pem +24 -0
  24. data/certs/larskanis-2022.pem +26 -0
  25. data/ext/errorcodes.def +109 -0
  26. data/ext/errorcodes.rb +1 -1
  27. data/ext/errorcodes.txt +35 -2
  28. data/ext/extconf.rb +120 -54
  29. data/ext/gvl_wrappers.c +8 -0
  30. data/ext/gvl_wrappers.h +44 -33
  31. data/ext/pg.c +213 -171
  32. data/ext/pg.h +92 -98
  33. data/ext/pg_binary_decoder.c +84 -15
  34. data/ext/pg_binary_encoder.c +24 -21
  35. data/ext/pg_coder.c +175 -39
  36. data/ext/pg_connection.c +1730 -1135
  37. data/ext/pg_copy_coder.c +94 -27
  38. data/ext/pg_record_coder.c +521 -0
  39. data/ext/pg_result.c +640 -221
  40. data/ext/pg_text_decoder.c +608 -40
  41. data/ext/pg_text_encoder.c +253 -99
  42. data/ext/pg_tuple.c +569 -0
  43. data/ext/pg_type_map.c +61 -21
  44. data/ext/pg_type_map_all_strings.c +19 -5
  45. data/ext/pg_type_map_by_class.c +54 -24
  46. data/ext/pg_type_map_by_column.c +79 -40
  47. data/ext/pg_type_map_by_mri_type.c +48 -19
  48. data/ext/pg_type_map_by_oid.c +55 -25
  49. data/ext/pg_type_map_in_ruby.c +51 -20
  50. data/ext/{util.c → pg_util.c} +12 -12
  51. data/ext/{util.h → pg_util.h} +2 -2
  52. data/lib/pg/basic_type_map_based_on_result.rb +47 -0
  53. data/lib/pg/basic_type_map_for_queries.rb +193 -0
  54. data/lib/pg/basic_type_map_for_results.rb +81 -0
  55. data/lib/pg/basic_type_registry.rb +301 -0
  56. data/lib/pg/binary_decoder.rb +23 -0
  57. data/lib/pg/coder.rb +24 -3
  58. data/lib/pg/connection.rb +723 -65
  59. data/lib/pg/constants.rb +2 -1
  60. data/lib/pg/exceptions.rb +9 -2
  61. data/lib/pg/result.rb +24 -7
  62. data/lib/pg/text_decoder.rb +24 -22
  63. data/lib/pg/text_encoder.rb +40 -8
  64. data/lib/pg/tuple.rb +30 -0
  65. data/lib/pg/type_map_by_column.rb +3 -2
  66. data/lib/pg/version.rb +4 -0
  67. data/lib/pg.rb +61 -36
  68. data/misc/openssl-pg-segfault.rb +31 -0
  69. data/misc/postgres/History.txt +9 -0
  70. data/misc/postgres/Manifest.txt +5 -0
  71. data/misc/postgres/README.txt +21 -0
  72. data/misc/postgres/Rakefile +21 -0
  73. data/misc/postgres/lib/postgres.rb +16 -0
  74. data/misc/ruby-pg/History.txt +9 -0
  75. data/misc/ruby-pg/Manifest.txt +5 -0
  76. data/misc/ruby-pg/README.txt +21 -0
  77. data/misc/ruby-pg/Rakefile +21 -0
  78. data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
  79. data/pg.gemspec +32 -0
  80. data/rakelib/task_extension.rb +46 -0
  81. data/sample/array_insert.rb +1 -1
  82. data/sample/async_api.rb +4 -8
  83. data/sample/async_copyto.rb +1 -1
  84. data/sample/async_mixed.rb +1 -1
  85. data/sample/check_conn.rb +1 -1
  86. data/sample/copydata.rb +71 -0
  87. data/sample/copyfrom.rb +1 -1
  88. data/sample/copyto.rb +1 -1
  89. data/sample/cursor.rb +1 -1
  90. data/sample/disk_usage_report.rb +6 -15
  91. data/sample/issue-119.rb +2 -2
  92. data/sample/losample.rb +1 -1
  93. data/sample/minimal-testcase.rb +2 -2
  94. data/sample/notify_wait.rb +1 -1
  95. data/sample/pg_statistics.rb +6 -15
  96. data/sample/replication_monitor.rb +9 -18
  97. data/sample/test_binary_values.rb +1 -1
  98. data/sample/wal_shipper.rb +2 -2
  99. data/sample/warehouse_partitions.rb +8 -17
  100. data.tar.gz.sig +0 -0
  101. metadata +80 -230
  102. metadata.gz.sig +0 -0
  103. data/ChangeLog +0 -5804
  104. data/lib/pg/basic_type_mapping.rb +0 -399
  105. data/spec/data/expected_trace.out +0 -26
  106. data/spec/data/random_binary_data +0 -0
  107. data/spec/helpers.rb +0 -355
  108. data/spec/pg/basic_type_mapping_spec.rb +0 -251
  109. data/spec/pg/connection_spec.rb +0 -1538
  110. data/spec/pg/result_spec.rb +0 -449
  111. data/spec/pg/type_map_by_class_spec.rb +0 -138
  112. data/spec/pg/type_map_by_column_spec.rb +0 -222
  113. data/spec/pg/type_map_by_mri_type_spec.rb +0 -136
  114. data/spec/pg/type_map_by_oid_spec.rb +0 -149
  115. data/spec/pg/type_map_in_ruby_spec.rb +0 -164
  116. data/spec/pg/type_map_spec.rb +0 -22
  117. data/spec/pg/type_spec.rb +0 -690
  118. data/spec/pg_spec.rb +0 -50
data/certs/ged.pem ADDED
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIID+DCCAmCgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
3
+ REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMjAxMDcyMzU4MTRaFw0yMzAxMDcyMzU4
4
+ MTRaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
5
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
6
+ L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
7
+ M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
8
+ 5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
9
+ Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
10
+ vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
11
+ dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
12
+ ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
13
+ N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
14
+ VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
15
+ 9w0BAQsFAAOCAYEASrm1AbEoxACZ9WXJH3R5axV3U0CA4xaETlL2YT+2nOfVBMQ9
16
+ 0ZlkPx6j4ghKJgAIi1TMfDM2JyPJsppQh8tiNccDjWc62UZRY/dq26cMqf/lcI+a
17
+ 6YBuEYvzZfearwVs8tHnXtwYV3WSCoCOQaB+nq2lA1O+nkKNl41WOsVbNama5jx3
18
+ 8cQtVSEEmZy6jIDJ8c5TmBJ7BQUDEUEWA/A3V42Xyctoj7DvUXWE0lP+X6ypAVSr
19
+ lFh3TS64D7NTvxkmg7natUoCvobl6kGl4yMaqE4YRTlfuzhpf91TSOntClqrAOsS
20
+ K1s56WndQj3IoBocdY9mQhDZLtLHofSkymoP8btBlj5SsN24TiF0VMSZlctSCYZg
21
+ GKyHim/MMlIfGOWsgfioq5jzwmql7W4CDubbb8Lkg70v+hN2E/MnNVAcNE3gyaGc
22
+ P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
23
+ btEP+7EplFuoiMfd
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
3
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMjAyMTQxMzMwNTZaFw0yMzAy
4
+ MTQxMzMwNTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
5
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
6
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
7
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
8
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
9
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
10
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
11
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
12
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
13
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjgYEwfzAJ
14
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOIdbSMr3VFrTCO9/cTM0
15
+ 0exHzBcwIgYDVR0RBBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwIgYDVR0S
16
+ BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
17
+ AFWP7F/y3Oq3NgrqUOnjKOeDaBa7AqNhHS+PZg+C90lnJzMgOs4KKgZYxqSQVSab
18
+ SCEmzIO/StkXY4NpJ4fYLrHemf/fJy1wPyu+fNdp5SEEUwEo+2toRFlzTe4u4LdS
19
+ QC636nPPTMt8H3xz2wf/lUIUeo2Qc95Qt2BQM465ibbG9kmA3c7Sopx6yOabYOAl
20
+ KPRbOSEPiWYcF9Suuz8Gdf8jxEtPlnZiwRvnYJ+IHMq3XQCJWPpMzdDMbtlgHbXE
21
+ vq1zOTLMSYAS0UB3uionR4yo1hLz60odwkCm7qf0o2Ci/5OjtB0a89VuyqRU2vUJ
22
+ QH95WBjDJ6lCCW7J0mrMPnJQSUFTmufsU6jOChvPaCeAzW1YwrsP/YKnvwueG7ip
23
+ VOdW6RitjtFxhS7evRL0201+KUvLz12zZWWjOcujlQs64QprxOtiv/MiisKb1Ng+
24
+ oL1mUdzB8KrZL4/WbG5YNX6UTtJbIOu9qEFbBAy4/jtIkJX+dlNoFwd4GXQW1YNO
25
+ nA==
26
+ -----END CERTIFICATE-----
data/ext/errorcodes.def CHANGED
@@ -186,6 +186,10 @@
186
186
  VALUE klass = define_error_class( "InvalidParameterValue", "22" );
187
187
  register_error_class( "22023", klass );
188
188
  }
189
+ {
190
+ VALUE klass = define_error_class( "InvalidPrecedingOrFollowingSize", "22" );
191
+ register_error_class( "22013", klass );
192
+ }
189
193
  {
190
194
  VALUE klass = define_error_class( "InvalidRegularExpression", "22" );
191
195
  register_error_class( "2201B", klass );
@@ -198,6 +202,14 @@
198
202
  VALUE klass = define_error_class( "InvalidRowCountInResultOffsetClause", "22" );
199
203
  register_error_class( "2201X", klass );
200
204
  }
205
+ {
206
+ VALUE klass = define_error_class( "InvalidTablesampleArgument", "22" );
207
+ register_error_class( "2202H", klass );
208
+ }
209
+ {
210
+ VALUE klass = define_error_class( "InvalidTablesampleRepeat", "22" );
211
+ register_error_class( "2202G", klass );
212
+ }
201
213
  {
202
214
  VALUE klass = define_error_class( "InvalidTimeZoneDisplacementValue", "22" );
203
215
  register_error_class( "22009", klass );
@@ -222,6 +234,10 @@
222
234
  VALUE klass = define_error_class( "NumericValueOutOfRange", "22" );
223
235
  register_error_class( "22003", klass );
224
236
  }
237
+ {
238
+ VALUE klass = define_error_class( "SequenceGeneratorLimitExceeded", "22" );
239
+ register_error_class( "2200H", klass );
240
+ }
225
241
  {
226
242
  VALUE klass = define_error_class( "StringDataLengthMismatch", "22" );
227
243
  register_error_class( "22026", klass );
@@ -286,6 +302,70 @@
286
302
  VALUE klass = define_error_class( "InvalidXmlProcessingInstruction", "22" );
287
303
  register_error_class( "2200T", klass );
288
304
  }
305
+ {
306
+ VALUE klass = define_error_class( "DuplicateJsonObjectKeyValue", "22" );
307
+ register_error_class( "22030", klass );
308
+ }
309
+ {
310
+ VALUE klass = define_error_class( "InvalidArgumentForSqlJsonDatetimeFunction", "22" );
311
+ register_error_class( "22031", klass );
312
+ }
313
+ {
314
+ VALUE klass = define_error_class( "InvalidJsonText", "22" );
315
+ register_error_class( "22032", klass );
316
+ }
317
+ {
318
+ VALUE klass = define_error_class( "InvalidSqlJsonSubscript", "22" );
319
+ register_error_class( "22033", klass );
320
+ }
321
+ {
322
+ VALUE klass = define_error_class( "MoreThanOneSqlJsonItem", "22" );
323
+ register_error_class( "22034", klass );
324
+ }
325
+ {
326
+ VALUE klass = define_error_class( "NoSqlJsonItem", "22" );
327
+ register_error_class( "22035", klass );
328
+ }
329
+ {
330
+ VALUE klass = define_error_class( "NonNumericSqlJsonItem", "22" );
331
+ register_error_class( "22036", klass );
332
+ }
333
+ {
334
+ VALUE klass = define_error_class( "NonUniqueKeysInAJsonObject", "22" );
335
+ register_error_class( "22037", klass );
336
+ }
337
+ {
338
+ VALUE klass = define_error_class( "SingletonSqlJsonItemRequired", "22" );
339
+ register_error_class( "22038", klass );
340
+ }
341
+ {
342
+ VALUE klass = define_error_class( "SqlJsonArrayNotFound", "22" );
343
+ register_error_class( "22039", klass );
344
+ }
345
+ {
346
+ VALUE klass = define_error_class( "SqlJsonMemberNotFound", "22" );
347
+ register_error_class( "2203A", klass );
348
+ }
349
+ {
350
+ VALUE klass = define_error_class( "SqlJsonNumberNotFound", "22" );
351
+ register_error_class( "2203B", klass );
352
+ }
353
+ {
354
+ VALUE klass = define_error_class( "SqlJsonObjectNotFound", "22" );
355
+ register_error_class( "2203C", klass );
356
+ }
357
+ {
358
+ VALUE klass = define_error_class( "TooManyJsonArrayElements", "22" );
359
+ register_error_class( "2203D", klass );
360
+ }
361
+ {
362
+ VALUE klass = define_error_class( "TooManyJsonObjectMembers", "22" );
363
+ register_error_class( "2203E", klass );
364
+ }
365
+ {
366
+ VALUE klass = define_error_class( "SqlJsonScalarRequired", "22" );
367
+ register_error_class( "2203F", klass );
368
+ }
289
369
  {
290
370
  VALUE klass = define_error_class( "IntegrityConstraintViolation", NULL );
291
371
  register_error_class( "23000", klass );
@@ -365,6 +445,10 @@
365
445
  VALUE klass = define_error_class( "InFailedSqlTransaction", "25" );
366
446
  register_error_class( "25P02", klass );
367
447
  }
448
+ {
449
+ VALUE klass = define_error_class( "IdleInTransactionSessionTimeout", "25" );
450
+ register_error_class( "25P03", klass );
451
+ }
368
452
  {
369
453
  VALUE klass = define_error_class( "InvalidSqlStatementName", NULL );
370
454
  register_error_class( "26000", klass );
@@ -466,6 +550,10 @@
466
550
  VALUE klass = define_error_class( "ERIESrfProtocolViolated", "39" );
467
551
  register_error_class( "39P02", klass );
468
552
  }
553
+ {
554
+ VALUE klass = define_error_class( "ERIEEventTriggerProtocolViolated", "39" );
555
+ register_error_class( "39P03", klass );
556
+ }
469
557
  {
470
558
  VALUE klass = define_error_class( "SavepointException", NULL );
471
559
  register_error_class( "3B000", klass );
@@ -571,6 +659,10 @@
571
659
  VALUE klass = define_error_class( "WrongObjectType", "42" );
572
660
  register_error_class( "42809", klass );
573
661
  }
662
+ {
663
+ VALUE klass = define_error_class( "GeneratedAlways", "42" );
664
+ register_error_class( "428C9", klass );
665
+ }
574
666
  {
575
667
  VALUE klass = define_error_class( "UndefinedColumn", "42" );
576
668
  register_error_class( "42703", klass );
@@ -739,6 +831,10 @@
739
831
  VALUE klass = define_error_class( "LockNotAvailable", "55" );
740
832
  register_error_class( "55P03", klass );
741
833
  }
834
+ {
835
+ VALUE klass = define_error_class( "UnsafeNewEnumValueUsage", "55" );
836
+ register_error_class( "55P04", klass );
837
+ }
742
838
  {
743
839
  VALUE klass = define_error_class( "OperatorIntervention", NULL );
744
840
  register_error_class( "57000", klass );
@@ -764,6 +860,10 @@
764
860
  VALUE klass = define_error_class( "DatabaseDropped", "57" );
765
861
  register_error_class( "57P04", klass );
766
862
  }
863
+ {
864
+ VALUE klass = define_error_class( "IdleSessionTimeout", "57" );
865
+ register_error_class( "57P05", klass );
866
+ }
767
867
  {
768
868
  VALUE klass = define_error_class( "SystemError", NULL );
769
869
  register_error_class( "58000", klass );
@@ -781,6 +881,11 @@
781
881
  VALUE klass = define_error_class( "DuplicateFile", "58" );
782
882
  register_error_class( "58P02", klass );
783
883
  }
884
+ {
885
+ VALUE klass = define_error_class( "SnapshotTooOld", NULL );
886
+ register_error_class( "72000", klass );
887
+ register_error_class( "72", klass );
888
+ }
784
889
  {
785
890
  VALUE klass = define_error_class( "ConfigFileError", NULL );
786
891
  register_error_class( "F0000", klass );
@@ -916,6 +1021,10 @@
916
1021
  VALUE klass = define_error_class( "TooManyRows", "P0" );
917
1022
  register_error_class( "P0003", klass );
918
1023
  }
1024
+ {
1025
+ VALUE klass = define_error_class( "AssertFailure", "P0" );
1026
+ register_error_class( "P0004", klass );
1027
+ }
919
1028
  {
920
1029
  VALUE klass = define_error_class( "InternalError", NULL );
921
1030
  register_error_class( "XX000", klass );
data/ext/errorcodes.rb CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ # -*- ruby -*-
2
2
 
3
3
  def camelize(lower_case_and_underscored_word)
4
4
  lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
data/ext/errorcodes.txt CHANGED
@@ -2,7 +2,7 @@
2
2
  # errcodes.txt
3
3
  # PostgreSQL error codes
4
4
  #
5
- # Copyright (c) 2003-2013, PostgreSQL Global Development Group
5
+ # Copyright (c) 2003-2021, PostgreSQL Global Development Group
6
6
  #
7
7
  # This list serves as the basis for generating source files containing error
8
8
  # codes. It is kept in a common format to make sure all these source files have
@@ -15,7 +15,10 @@
15
15
  # src/pl/plpgsql/src/plerrcodes.h
16
16
  # a list of PL/pgSQL condition names and their SQLSTATE codes
17
17
  #
18
- # doc/src/sgml/errcodes-list.sgml
18
+ # src/pl/tcl/pltclerrcodes.h
19
+ # the same, for PL/Tcl
20
+ #
21
+ # doc/src/sgml/errcodes-table.sgml
19
22
  # a SGML table of error codes for inclusion in the documentation
20
23
  #
21
24
  # The format of this file is one error code per line, with the following
@@ -174,15 +177,19 @@ Section: Class 22 - Data Exception
174
177
  22P06 E ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER nonstandard_use_of_escape_character
175
178
  22010 E ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE invalid_indicator_parameter_value
176
179
  22023 E ERRCODE_INVALID_PARAMETER_VALUE invalid_parameter_value
180
+ 22013 E ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE invalid_preceding_or_following_size
177
181
  2201B E ERRCODE_INVALID_REGULAR_EXPRESSION invalid_regular_expression
178
182
  2201W E ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE invalid_row_count_in_limit_clause
179
183
  2201X E ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE invalid_row_count_in_result_offset_clause
184
+ 2202H E ERRCODE_INVALID_TABLESAMPLE_ARGUMENT invalid_tablesample_argument
185
+ 2202G E ERRCODE_INVALID_TABLESAMPLE_REPEAT invalid_tablesample_repeat
180
186
  22009 E ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE invalid_time_zone_displacement_value
181
187
  2200C E ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER invalid_use_of_escape_character
182
188
  2200G E ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH most_specific_type_mismatch
183
189
  22004 E ERRCODE_NULL_VALUE_NOT_ALLOWED null_value_not_allowed
184
190
  22002 E ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER null_value_no_indicator_parameter
185
191
  22003 E ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE numeric_value_out_of_range
192
+ 2200H E ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED sequence_generator_limit_exceeded
186
193
  22026 E ERRCODE_STRING_DATA_LENGTH_MISMATCH string_data_length_mismatch
187
194
  22001 E ERRCODE_STRING_DATA_RIGHT_TRUNCATION string_data_right_truncation
188
195
  22011 E ERRCODE_SUBSTRING_ERROR substring_error
@@ -199,6 +206,22 @@ Section: Class 22 - Data Exception
199
206
  2200N E ERRCODE_INVALID_XML_CONTENT invalid_xml_content
200
207
  2200S E ERRCODE_INVALID_XML_COMMENT invalid_xml_comment
201
208
  2200T E ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION invalid_xml_processing_instruction
209
+ 22030 E ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE duplicate_json_object_key_value
210
+ 22031 E ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION invalid_argument_for_sql_json_datetime_function
211
+ 22032 E ERRCODE_INVALID_JSON_TEXT invalid_json_text
212
+ 22033 E ERRCODE_INVALID_SQL_JSON_SUBSCRIPT invalid_sql_json_subscript
213
+ 22034 E ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM more_than_one_sql_json_item
214
+ 22035 E ERRCODE_NO_SQL_JSON_ITEM no_sql_json_item
215
+ 22036 E ERRCODE_NON_NUMERIC_SQL_JSON_ITEM non_numeric_sql_json_item
216
+ 22037 E ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT non_unique_keys_in_a_json_object
217
+ 22038 E ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED singleton_sql_json_item_required
218
+ 22039 E ERRCODE_SQL_JSON_ARRAY_NOT_FOUND sql_json_array_not_found
219
+ 2203A E ERRCODE_SQL_JSON_MEMBER_NOT_FOUND sql_json_member_not_found
220
+ 2203B E ERRCODE_SQL_JSON_NUMBER_NOT_FOUND sql_json_number_not_found
221
+ 2203C E ERRCODE_SQL_JSON_OBJECT_NOT_FOUND sql_json_object_not_found
222
+ 2203D E ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS too_many_json_array_elements
223
+ 2203E E ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS too_many_json_object_members
224
+ 2203F E ERRCODE_SQL_JSON_SCALAR_REQUIRED sql_json_scalar_required
202
225
 
203
226
  Section: Class 23 - Integrity Constraint Violation
204
227
 
@@ -227,6 +250,7 @@ Section: Class 25 - Invalid Transaction State
227
250
  25007 E ERRCODE_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED schema_and_data_statement_mixing_not_supported
228
251
  25P01 E ERRCODE_NO_ACTIVE_SQL_TRANSACTION no_active_sql_transaction
229
252
  25P02 E ERRCODE_IN_FAILED_SQL_TRANSACTION in_failed_sql_transaction
253
+ 25P03 E ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT idle_in_transaction_session_timeout
230
254
 
231
255
  Section: Class 26 - Invalid SQL Statement Name
232
256
 
@@ -278,6 +302,7 @@ Section: Class 39 - External Routine Invocation Exception
278
302
  39004 E ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED null_value_not_allowed
279
303
  39P01 E ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED trigger_protocol_violated
280
304
  39P02 E ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED srf_protocol_violated
305
+ 39P03 E ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED event_trigger_protocol_violated
281
306
 
282
307
  Section: Class 3B - Savepoint Exception
283
308
 
@@ -319,6 +344,7 @@ Section: Class 42 - Syntax Error or Access Rule Violation
319
344
  42P21 E ERRCODE_COLLATION_MISMATCH collation_mismatch
320
345
  42P22 E ERRCODE_INDETERMINATE_COLLATION indeterminate_collation
321
346
  42809 E ERRCODE_WRONG_OBJECT_TYPE wrong_object_type
347
+ 428C9 E ERRCODE_GENERATED_ALWAYS generated_always
322
348
 
323
349
  # Note: for ERRCODE purposes, we divide namable objects into these categories:
324
350
  # databases, schemas, prepared statements, cursors, tables, columns,
@@ -391,6 +417,7 @@ Section: Class 55 - Object Not In Prerequisite State
391
417
  55006 E ERRCODE_OBJECT_IN_USE object_in_use
392
418
  55P02 E ERRCODE_CANT_CHANGE_RUNTIME_PARAM cant_change_runtime_param
393
419
  55P03 E ERRCODE_LOCK_NOT_AVAILABLE lock_not_available
420
+ 55P04 E ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE unsafe_new_enum_value_usage
394
421
 
395
422
  Section: Class 57 - Operator Intervention
396
423
 
@@ -401,6 +428,7 @@ Section: Class 57 - Operator Intervention
401
428
  57P02 E ERRCODE_CRASH_SHUTDOWN crash_shutdown
402
429
  57P03 E ERRCODE_CANNOT_CONNECT_NOW cannot_connect_now
403
430
  57P04 E ERRCODE_DATABASE_DROPPED database_dropped
431
+ 57P05 E ERRCODE_IDLE_SESSION_TIMEOUT idle_session_timeout
404
432
 
405
433
  Section: Class 58 - System Error (errors external to PostgreSQL itself)
406
434
 
@@ -410,6 +438,10 @@ Section: Class 58 - System Error (errors external to PostgreSQL itself)
410
438
  58P01 E ERRCODE_UNDEFINED_FILE undefined_file
411
439
  58P02 E ERRCODE_DUPLICATE_FILE duplicate_file
412
440
 
441
+ Section: Class 72 - Snapshot Failure
442
+ # (class borrowed from Oracle)
443
+ 72000 E ERRCODE_SNAPSHOT_TOO_OLD snapshot_too_old
444
+
413
445
  Section: Class F0 - Configuration File Error
414
446
 
415
447
  # (PostgreSQL-specific error class)
@@ -454,6 +486,7 @@ P0000 E ERRCODE_PLPGSQL_ERROR plp
454
486
  P0001 E ERRCODE_RAISE_EXCEPTION raise_exception
455
487
  P0002 E ERRCODE_NO_DATA_FOUND no_data_found
456
488
  P0003 E ERRCODE_TOO_MANY_ROWS too_many_rows
489
+ P0004 E ERRCODE_ASSERT_FAILURE assert_failure
457
490
 
458
491
  Section: Class XX - Internal Error
459
492
 
data/ext/extconf.rb CHANGED
@@ -15,6 +15,13 @@ if pgdir = with_config( 'pg' )
15
15
  ENV['PATH'] = "#{pgdir}/bin" + File::PATH_SEPARATOR + ENV['PATH']
16
16
  end
17
17
 
18
+ if enable_config("gvl-unlock", true)
19
+ $defs.push( "-DENABLE_GVL_UNLOCK" )
20
+ $stderr.puts "Calling libpq with GVL unlocked"
21
+ else
22
+ $stderr.puts "Calling libpq with GVL locked"
23
+ end
24
+
18
25
  if enable_config("windows-cross")
19
26
  # Avoid dependency to external libgcc.dll on x86-mingw32
20
27
  $LDFLAGS << " -static-libgcc"
@@ -24,75 +31,134 @@ if enable_config("windows-cross")
24
31
  else
25
32
  # Native build
26
33
 
27
- if pgconfig = ( with_config('pg-config') || with_config('pg_config') || find_executable('pg_config') )
34
+ pgconfig = with_config('pg-config') ||
35
+ with_config('pg_config') ||
36
+ find_executable('pg_config')
37
+
38
+ if pgconfig && pgconfig != 'ignore'
28
39
  $stderr.puts "Using config values from %s" % [ pgconfig ]
29
- incdir = `"#{pgconfig}" --includedir`.chomp
30
- libdir = `"#{pgconfig}" --libdir`.chomp
40
+ incdir = IO.popen([pgconfig, "--includedir"], &:read).chomp
41
+ libdir = IO.popen([pgconfig, "--libdir"], &:read).chomp
31
42
  dir_config 'pg', incdir, libdir
32
43
 
33
- # Try to use runtime path linker option, even if RbConfig doesn't know about it.
34
- # The rpath option is usually set implicit by dir_config(), but so far not
35
- # on MacOS-X.
36
- if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? && try_link('int main() {return 0;}', " -Wl,-rpath,#{libdir}")
37
- $LDFLAGS << " -Wl,-rpath,#{libdir}"
44
+ # Windows traditionally stores DLLs beside executables, not in libdir
45
+ dlldir = RUBY_PLATFORM=~/mingw|mswin/ ? IO.popen([pgconfig, "--bindir"], &:read).chomp : libdir
46
+
47
+ elsif checking_for "libpq per pkg-config" do
48
+ _cflags, ldflags, _libs = pkg_config("libpq")
49
+ dlldir = ldflags && ldflags[/-L([^ ]+)/] && $1
38
50
  end
51
+
39
52
  else
40
- $stderr.puts "No pg_config... trying anyway. If building fails, please try again with",
41
- " --with-pg-config=/path/to/pg_config"
42
- dir_config 'pg'
53
+ incdir, libdir = dir_config 'pg'
54
+ dlldir = libdir
55
+ end
56
+
57
+ # Try to use runtime path linker option, even if RbConfig doesn't know about it.
58
+ # The rpath option is usually set implicit by dir_config(), but so far not
59
+ # on MacOS-X.
60
+ if dlldir && RbConfig::CONFIG["RPATHFLAG"].to_s.empty?
61
+ append_ldflags "-Wl,-rpath,#{dlldir.quote}"
43
62
  end
44
63
  end
45
64
 
65
+ $stderr.puts "Using libpq from #{dlldir}"
46
66
 
47
- find_header( 'libpq-fe.h' ) or abort "Can't find the 'libpq-fe.h header"
48
- find_header( 'libpq/libpq-fs.h' ) or abort "Can't find the 'libpq/libpq-fs.h header"
49
- find_header( 'pg_config_manual.h' ) or abort "Can't find the 'pg_config_manual.h' header"
67
+ File.write("postgresql_lib_path.rb", <<-EOT)
68
+ module PG
69
+ POSTGRESQL_LIB_PATH = #{dlldir.inspect}
70
+ end
71
+ EOT
72
+ $INSTALLFILES = {
73
+ "./postgresql_lib_path.rb" => "$(RUBYLIBDIR)/pg/"
74
+ }
50
75
 
51
- abort "Can't find the PostgreSQL client library (libpq)" unless
52
- have_library( 'pq', 'PQconnectdb', ['libpq-fe.h'] ) ||
53
- have_library( 'libpq', 'PQconnectdb', ['libpq-fe.h'] ) ||
54
- have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
76
+ if RUBY_VERSION >= '2.3.0' && /solaris/ =~ RUBY_PLATFORM
77
+ append_cppflags( '-D__EXTENSIONS__' )
78
+ end
55
79
 
56
- # optional headers/functions
57
- have_func 'PQconnectionUsedPassword' or
80
+ begin
81
+ find_header( 'libpq-fe.h' ) or abort "Can't find the 'libpq-fe.h header"
82
+ find_header( 'libpq/libpq-fs.h' ) or abort "Can't find the 'libpq/libpq-fs.h header"
83
+ find_header( 'pg_config_manual.h' ) or abort "Can't find the 'pg_config_manual.h' header"
84
+
85
+ abort "Can't find the PostgreSQL client library (libpq)" unless
86
+ have_library( 'pq', 'PQconnectdb', ['libpq-fe.h'] ) ||
87
+ have_library( 'libpq', 'PQconnectdb', ['libpq-fe.h'] ) ||
88
+ have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
89
+
90
+ rescue SystemExit
91
+ install_text = case RUBY_PLATFORM
92
+ when /linux/
93
+ <<-EOT
94
+ Please install libpq or postgresql client package like so:
95
+ sudo apt install libpq-dev
96
+ sudo yum install postgresql-devel
97
+ sudo zypper in postgresql-devel
98
+ sudo pacman -S postgresql-libs
99
+ EOT
100
+ when /darwin/
101
+ <<-EOT
102
+ Please install libpq or postgresql client package like so:
103
+ brew install libpq
104
+ EOT
105
+ when /mingw/
106
+ <<-EOT
107
+ Please install libpq or postgresql client package like so:
108
+ ridk exec sh -c "pacman -S ${MINGW_PACKAGE_PREFIX}-postgresql"
109
+ EOT
110
+ else
111
+ <<-EOT
112
+ Please install libpq or postgresql client package.
113
+ EOT
114
+ end
115
+
116
+ $stderr.puts <<-EOT
117
+ *****************************************************************************
118
+
119
+ Unable to find PostgreSQL client library.
120
+
121
+ #{install_text}
122
+ or try again with:
123
+ gem install pg -- --with-pg-config=/path/to/pg_config
124
+
125
+ or set library paths manually with:
126
+ gem install pg -- --with-pg-include=/path/to/libpq-fe.h/ --with-pg-lib=/path/to/libpq.so/
127
+
128
+ EOT
129
+ raise
130
+ end
131
+
132
+ if /mingw/ =~ RUBY_PLATFORM && RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
133
+ # Work around: https://sourceware.org/bugzilla/show_bug.cgi?id=22504
134
+ checking_for "workaround gcc version with link issue" do
135
+ `#{RbConfig::MAKEFILE_CONFIG['CC']} --version`.chomp =~ /\s(\d+)\.\d+\.\d+(\s|$)/ &&
136
+ $1.to_i >= 6 &&
137
+ have_library(':libpq.lib') # Prefer linking to libpq.lib over libpq.dll if available
138
+ end
139
+ end
140
+
141
+ have_func 'PQconninfo', 'libpq-fe.h' or
58
142
  abort "Your PostgreSQL is too old. Either install an older version " +
59
- "of this gem or upgrade your database."
60
- have_func 'PQisthreadsafe'
61
- have_func 'PQprepare'
62
- have_func 'PQexecParams'
63
- have_func 'PQescapeString'
64
- have_func 'PQescapeStringConn'
65
- have_func 'PQescapeLiteral'
66
- have_func 'PQescapeIdentifier'
67
- have_func 'PQgetCancel'
68
- have_func 'lo_create'
69
- have_func 'pg_encoding_to_char'
70
- have_func 'pg_char_to_encoding'
71
- have_func 'PQsetClientEncoding'
72
- have_func 'PQlibVersion'
73
- have_func 'PQping'
74
- have_func 'PQsetSingleRowMode'
75
- have_func 'PQconninfo'
76
-
77
- have_func 'rb_encdb_alias'
78
- have_func 'rb_enc_alias'
79
- have_func 'rb_thread_call_without_gvl'
80
- have_func 'rb_thread_call_with_gvl'
81
- have_func 'rb_thread_fd_select'
82
- have_func 'rb_w32_wrap_io_handle'
83
- have_func 'rb_str_modify_expand'
84
- have_func 'rb_hash_dup'
85
-
86
- have_const 'PGRES_COPY_BOTH', 'libpq-fe.h'
87
- have_const 'PGRES_SINGLE_TUPLE', 'libpq-fe.h'
88
- have_const 'PG_DIAG_TABLE_NAME', 'libpq-fe.h'
89
-
90
- $defs.push( "-DHAVE_ST_NOTIFY_EXTRA" ) if
91
- have_struct_member 'struct pgNotify', 'extra', 'libpq-fe.h'
143
+ "of this gem or upgrade your database to at least PostgreSQL-9.3."
144
+ # optional headers/functions
145
+ have_func 'PQsslAttribute', 'libpq-fe.h' # since PostgreSQL-9.5
146
+ have_func 'PQresultVerboseErrorMessage', 'libpq-fe.h' # since PostgreSQL-9.6
147
+ have_func 'PQencryptPasswordConn', 'libpq-fe.h' # since PostgreSQL-10
148
+ have_func 'PQresultMemorySize', 'libpq-fe.h' # since PostgreSQL-12
149
+ have_func 'PQenterPipelineMode', 'libpq-fe.h' do |src| # since PostgreSQL-14
150
+ # Ensure header files fit as well
151
+ src + " int con(){ return PGRES_PIPELINE_SYNC; }"
152
+ end
153
+ have_func 'timegm'
154
+ have_func 'rb_gc_adjust_memory_usage' # since ruby-2.4
155
+ have_func 'rb_gc_mark_movable' # since ruby-2.7
156
+ have_func 'rb_io_wait' # since ruby-3.0
92
157
 
93
158
  # unistd.h confilicts with ruby/win32.h when cross compiling for win32 and ruby 1.9.1
94
159
  have_header 'unistd.h'
95
- have_header 'ruby/st.h' or have_header 'st.h' or abort "pg currently requires the ruby/st.h header"
160
+ have_header 'inttypes.h'
161
+ have_header('ruby/fiber/scheduler.h') if RUBY_PLATFORM=~/mingw|mswin/
96
162
 
97
163
  checking_for "C99 variable length arrays" do
98
164
  $defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }')
data/ext/gvl_wrappers.c CHANGED
@@ -5,9 +5,17 @@
5
5
 
6
6
  #include "pg.h"
7
7
 
8
+ #ifndef HAVE_PQENCRYPTPASSWORDCONN
9
+ char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm){return NULL;}
10
+ #endif
11
+
12
+ #ifdef ENABLE_GVL_UNLOCK
8
13
  FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
9
14
  FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_SKELETON );
15
+ #endif
10
16
  FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB );
17
+ #ifdef ENABLE_GVL_UNLOCK
11
18
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
12
19
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_SKELETON );
20
+ #endif
13
21
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_STUB );