activerecord-jdbc-adapter 50.8-java → 51.1-java

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 (62) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -2
  3. data/.travis.yml +26 -51
  4. data/Gemfile +3 -1
  5. data/README.md +9 -11
  6. data/Rakefile +15 -78
  7. data/activerecord-jdbc-adapter.gemspec +2 -2
  8. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  9. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  10. data/lib/arjdbc/abstract/core.rb +4 -12
  11. data/lib/arjdbc/abstract/database_statements.rb +4 -10
  12. data/lib/arjdbc/abstract/statement_cache.rb +4 -4
  13. data/lib/arjdbc/abstract/transaction_support.rb +2 -9
  14. data/lib/arjdbc/jdbc.rb +4 -0
  15. data/lib/arjdbc/jdbc/column.rb +11 -5
  16. data/lib/arjdbc/jdbc/connection_methods.rb +9 -2
  17. data/lib/arjdbc/jdbc/error.rb +1 -1
  18. data/lib/arjdbc/jdbc/jdbc.rake +4 -0
  19. data/lib/arjdbc/mssql.rb +7 -0
  20. data/lib/arjdbc/mssql/adapter.rb +804 -0
  21. data/lib/arjdbc/mssql/column.rb +200 -0
  22. data/lib/arjdbc/mssql/connection_methods.rb +79 -0
  23. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  24. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  25. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  26. data/lib/arjdbc/mssql/types.rb +343 -0
  27. data/lib/arjdbc/mssql/utils.rb +82 -0
  28. data/lib/arjdbc/mysql/adapter.rb +14 -11
  29. data/lib/arjdbc/mysql/connection_methods.rb +9 -18
  30. data/lib/arjdbc/postgresql/adapter.rb +108 -59
  31. data/lib/arjdbc/postgresql/column.rb +3 -6
  32. data/lib/arjdbc/postgresql/connection_methods.rb +3 -12
  33. data/lib/arjdbc/postgresql/oid_types.rb +14 -93
  34. data/lib/arjdbc/sqlite3/adapter.rb +171 -140
  35. data/lib/arjdbc/sqlite3/connection_methods.rb +1 -2
  36. data/lib/arjdbc/tasks/database_tasks.rb +36 -16
  37. data/lib/arjdbc/tasks/databases.rake +75 -32
  38. data/lib/arjdbc/tasks/databases3.rake +215 -0
  39. data/lib/arjdbc/tasks/databases4.rake +39 -0
  40. data/lib/arjdbc/version.rb +1 -1
  41. data/rakelib/01-tomcat.rake +2 -2
  42. data/rakelib/02-test.rake +3 -0
  43. data/rakelib/compile.rake +70 -0
  44. data/rakelib/db.rake +7 -21
  45. data/rakelib/rails.rake +4 -5
  46. data/src/java/arjdbc/ArJdbcModule.java +15 -5
  47. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +2 -2
  48. data/src/java/arjdbc/jdbc/ConnectionFactory.java +87 -0
  49. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +1 -0
  50. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +41 -120
  51. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +14 -310
  52. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +2 -2
  53. data/src/java/arjdbc/postgresql/ByteaUtils.java +1 -0
  54. data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
  55. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +13 -21
  56. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +46 -41
  57. data/src/java/arjdbc/util/DateTimeUtils.java +5 -141
  58. data/src/java/arjdbc/util/QuotingUtils.java +7 -6
  59. data/src/java/arjdbc/util/StringHelper.java +20 -6
  60. metadata +25 -16
  61. data/src/java/arjdbc/jdbc/RubyConnectionFactory.java +0 -61
  62. data/src/java/arjdbc/postgresql/PgDateTimeUtils.java +0 -52
@@ -31,16 +31,8 @@ module ActiveRecord
31
31
 
32
32
  include ArJdbc::MySQL
33
33
 
34
- def initialize(connection, logger, connection_parameters, config)
35
- # workaround to skip version check on JNDI to be lazy, dummy version is high enough for Rails 5.0 - 6.0
36
- is_jndi = ::ActiveRecord::ConnectionAdapters::JdbcConnection.jndi_config?(config)
37
- @version = '8.1.5' if is_jndi
38
-
39
- super
40
-
41
- # set to nil to have it lazy-load the real value when required
42
- @version = nil if is_jndi
43
-
34
+ def initialize(connection, logger, config)
35
+ super(connection, logger, nil, config)
44
36
  @prepared_statements = false unless config.key?(:prepared_statements)
45
37
  # configure_connection taken care of at ArJdbc::Abstract::Core
46
38
  end
@@ -61,6 +53,10 @@ module ActiveRecord
61
53
  true
62
54
  end
63
55
 
56
+ def supports_transaction_isolation?
57
+ true
58
+ end
59
+
64
60
  # HELPER METHODS ===========================================
65
61
 
66
62
  # Reloading the type map in abstract/statement_cache.rb blows up postgres
@@ -92,7 +88,14 @@ module ActiveRecord
92
88
 
93
89
  #--
94
90
  # QUOTING ==================================================
95
- #++
91
+ #+
92
+
93
+ # FIXME: 5.1 crashes without this. I think this is Arel hitting a fallback path in to_sql.rb.
94
+ # So maybe an untested code path in their source. Still means we are doing something wrong to
95
+ # even hit it.
96
+ def quote(value, comment=nil)
97
+ super(value)
98
+ end
96
99
 
97
100
  # NOTE: quote_string(string) provided by ArJdbc::MySQL (native code),
98
101
  # this piece is also native (mysql2) under MRI: `@connection.escape(string)`
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  ArJdbc::ConnectionMethods.module_eval do
3
3
  def mysql_connection(config)
4
- config = config.deep_dup
5
4
  # NOTE: this isn't "really" necessary but Rails (in tests) assumes being able to :
6
5
  # ActiveRecord::Base.mysql2_connection ActiveRecord::Base.configurations['arunit'].merge(database: ...)
7
6
  config = symbolize_keys_if_necessary(config)
@@ -11,20 +10,14 @@ ArJdbc::ConnectionMethods.module_eval do
11
10
 
12
11
  return jndi_connection(config) if jndi_config?(config)
13
12
 
14
- driver = config[:driver]
15
- mysql_driver = driver.nil? || driver.to_s.start_with?('com.mysql.')
16
- mariadb_driver = ! mysql_driver && driver.to_s.start_with?('org.mariadb.')
13
+ driver = config[:driver] ||=
14
+ defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
17
15
 
18
16
  begin
19
17
  require 'jdbc/mysql'
20
18
  ::Jdbc::MySQL.load_driver(:require) if defined?(::Jdbc::MySQL.load_driver)
21
19
  rescue LoadError # assuming driver.jar is on the class-path
22
- end if mysql_driver
23
-
24
- if driver.nil?
25
- config[:driver] ||=
26
- defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
27
- end
20
+ end if mysql_driver = driver[0, 10] == 'com.mysql.'
28
21
 
29
22
  config[:username] = 'root' unless config.key?(:username)
30
23
  # jdbc:mysql://[host][,failoverhost...][:port]/[database]
@@ -32,16 +25,15 @@ ArJdbc::ConnectionMethods.module_eval do
32
25
  # - if the port is not specified, it defaults to 3306
33
26
  # - alternate fail-over syntax: [host:port],[host:port]/[database]
34
27
  unless config[:url]
35
- host = config[:host]
36
- host ||= 'localhost' if mariadb_driver
37
- host = host.join(',') if host.respond_to?(:join)
28
+ host = config[:host]; host = host.join(',') if host.respond_to?(:join)
38
29
  config[:url] = "jdbc:mysql://#{host}#{ config[:port] ? ":#{config[:port]}" : nil }/#{config[:database]}"
39
30
  end
40
31
 
32
+ mariadb_driver = ! mysql_driver && driver.start_with?('org.mariadb.')
33
+
41
34
  properties = ( config[:properties] ||= {} )
42
35
  if mysql_driver
43
- properties['zeroDateTimeBehavior'] ||=
44
- config[:driver].to_s.start_with?('com.mysql.cj.') ? 'CONVERT_TO_NULL' : 'convertToNull'
36
+ properties['zeroDateTimeBehavior'] ||= 'convertToNull'
45
37
  properties['jdbcCompliantTruncation'] ||= false
46
38
  # NOTE: this is "better" than passing what users are used to set on MRI
47
39
  # e.g. 'utf8mb4' will fail cause the driver will check for a Java charset
@@ -71,8 +63,8 @@ ArJdbc::ConnectionMethods.module_eval do
71
63
  end
72
64
  if config[:sslkey] || sslcert = config[:sslcert] # || config[:use_ssl]
73
65
  properties['useSSL'] ||= true # supported by MariaDB as well
66
+ properties['requireSSL'] ||= true if mysql_driver
74
67
  if mysql_driver
75
- properties['requireSSL'] ||= true
76
68
  properties['clientCertificateKeyStoreUrl'] ||= java.io.File.new(sslcert).to_url.to_s if sslcert
77
69
  if sslca = config[:sslca]
78
70
  properties['trustCertificateKeyStoreUrl'] ||= java.io.File.new(sslca).to_url.to_s
@@ -113,8 +105,7 @@ ArJdbc::ConnectionMethods.module_eval do
113
105
  rescue LoadError # assuming driver.jar is on the class-path
114
106
  end
115
107
 
116
- config[:driver] ||=
117
- defined?(::Jdbc::MariaDB.driver_name) ? ::Jdbc::MariaDB.driver_name : 'org.mariadb.jdbc.Driver'
108
+ config[:driver] ||= 'org.mariadb.jdbc.Driver'
118
109
 
119
110
  mysql_connection(config)
120
111
  end
@@ -7,6 +7,7 @@ require 'active_record/connection_adapters/postgresql/column'
7
7
  require 'active_record/connection_adapters/postgresql/explain_pretty_printer'
8
8
  require 'active_record/connection_adapters/postgresql/quoting'
9
9
  require 'active_record/connection_adapters/postgresql/referential_integrity'
10
+ require 'active_record/connection_adapters/postgresql/schema_creation'
10
11
  require 'active_record/connection_adapters/postgresql/schema_dumper'
11
12
  require 'active_record/connection_adapters/postgresql/schema_statements'
12
13
  require 'active_record/connection_adapters/postgresql/type_metadata'
@@ -54,30 +55,8 @@ module ArJdbc
54
55
  @postgresql_version ||=
55
56
  begin
56
57
  version = @connection.database_product
57
- if match = version.match(/([\d\.]*\d).*?/)
58
- version = match[1].split('.').map(&:to_i)
59
- # PostgreSQL version representation does not have more than 4 digits
60
- # From version 10 onwards, PG has changed its versioning policy to
61
- # limit it to only 2 digits. i.e. in 10.x, 10 being the major
62
- # version and x representing the patch release
63
- # Refer to:
64
- # https://www.postgresql.org/support/versioning/
65
- # https://www.postgresql.org/docs/10/static/libpq-status.html -> PQserverVersion()
66
- # for more info
67
-
68
- if version.size >= 3
69
- (version[0] * 100 + version[1]) * 100 + version[2]
70
- elsif version.size == 2
71
- if version[0] >= 10
72
- version[0] * 100 * 100 + version[1]
73
- else
74
- (version[0] * 100 + version[1]) * 100
75
- end
76
- elsif version.size == 1
77
- version[0] * 100 * 100
78
- else
79
- 0
80
- end
58
+ if version =~ /PostgreSQL (\d+)\.(\d+)\.(\d+)/
59
+ ($1.to_i * 10000) + ($2.to_i * 100) + $3.to_i
81
60
  else
82
61
  0
83
62
  end
@@ -146,8 +125,7 @@ module ArJdbc
146
125
  ActiveRecordError = ::ActiveRecord::ActiveRecordError
147
126
 
148
127
  NATIVE_DATABASE_TYPES = {
149
- bigserial: 'bigserial',
150
- primary_key: 'serial primary key',
128
+ primary_key: 'bigserial primary key',
151
129
  bigint: { name: 'bigint' },
152
130
  binary: { name: 'bytea' },
153
131
  bit: { name: 'bit' },
@@ -178,10 +156,10 @@ module ArJdbc
178
156
  money: { name: 'money' },
179
157
  numeric: { name: 'numeric' },
180
158
  numrange: { name: 'numrange' },
159
+ oid: { name: 'oid' },
181
160
  path: { name: 'path' },
182
161
  point: { name: 'point' },
183
162
  polygon: { name: 'polygon' },
184
- serial: { name: 'serial' }, # auto-inc integer, bigserial, smallserial
185
163
  string: { name: 'character varying' },
186
164
  text: { name: 'text' },
187
165
  time: { name: 'time' },
@@ -239,8 +217,6 @@ module ArJdbc
239
217
 
240
218
  def supports_ddl_transactions?; true end
241
219
 
242
- def supports_advisory_locks?; true end
243
-
244
220
  def supports_explain?; true end
245
221
 
246
222
  def supports_expression_index?; true end
@@ -249,22 +225,14 @@ module ArJdbc
249
225
 
250
226
  def supports_index_sort_order?; true end
251
227
 
252
- def supports_migrations?; true end
253
-
254
228
  def supports_partial_index?; true end
255
229
 
256
- def supports_primary_key?; true end # Supports finding primary key on non-Active Record tables
257
-
258
230
  def supports_savepoints?; true end
259
231
 
260
- def supports_transaction_isolation?(level = nil); true end
232
+ def supports_transaction_isolation?; true end
261
233
 
262
234
  def supports_views?; true end
263
235
 
264
- def supports_datetime_with_precision?; true end
265
-
266
- def supports_comments?; true end
267
-
268
236
  # Does PostgreSQL support standard conforming strings?
269
237
  def supports_standard_conforming_strings?
270
238
  standard_conforming_strings?
@@ -275,18 +243,14 @@ module ArJdbc
275
243
  postgresql_version >= 90000
276
244
  end
277
245
 
278
- def supports_materialized_views?
279
- postgresql_version >= 90300
280
- end
281
-
282
- def supports_json?
283
- postgresql_version >= 90200
284
- end
285
-
286
246
  def supports_insert_with_returning?
287
247
  postgresql_version >= 80200
288
248
  end
289
249
 
250
+ def supports_pgcrypto_uuid?
251
+ postgresql_version >= 90400
252
+ end
253
+
290
254
  # Range data-types weren't introduced until PostgreSQL 9.2.
291
255
  def supports_ranges?
292
256
  postgresql_version >= 90200
@@ -296,6 +260,11 @@ module ArJdbc
296
260
  postgresql_version >= 90200
297
261
  end
298
262
 
263
+ # From AR 5.1 postgres_adapter.rb
264
+ def default_index_type?(index) # :nodoc:
265
+ index.using == :btree || super
266
+ end
267
+
299
268
  def enable_extension(name)
300
269
  execute("CREATE EXTENSION IF NOT EXISTS \"#{name}\"")
301
270
  end
@@ -347,7 +316,7 @@ module ArJdbc
347
316
  select_value("SELECT pg_advisory_unlock(#{lock_id})")
348
317
  end
349
318
 
350
- # Returns the configured supported identifier length supported by PostgreSQL
319
+ # Returns the max identifier length supported by PostgreSQL
351
320
  def max_identifier_length
352
321
  @max_identifier_length ||= select_one('SHOW max_identifier_length', 'SCHEMA'.freeze)['max_identifier_length'].to_i
353
322
  end
@@ -395,7 +364,8 @@ module ArJdbc
395
364
  # 'DISCARD ALL' fails if we are inside a transaction
396
365
  def clear_cache!
397
366
  super
398
- @connection.execute 'DEALLOCATE ALL' if supports_statement_cache? && @connection.active?
367
+ # Make sure all query plans are *really* gone
368
+ @connection.execute 'DEALLOCATE ALL' if active?
399
369
  end
400
370
 
401
371
  def reset!
@@ -406,12 +376,6 @@ module ArJdbc
406
376
  @connection.configure_connection
407
377
  end
408
378
 
409
- def default_sequence_name(table_name, pk = "id") #:nodoc:
410
- serial_sequence(table_name, pk)
411
- rescue ActiveRecord::StatementInvalid
412
- %Q("#{table_name}_#{pk}_seq")
413
- end
414
-
415
379
  def last_insert_id_result(sequence_name)
416
380
  exec_query("SELECT currval('#{sequence_name}')", 'SQL')
417
381
  end
@@ -511,7 +475,7 @@ module ArJdbc
511
475
  col_description(a.attrelid, a.attnum) AS comment
512
476
  FROM pg_attribute a
513
477
  LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
514
- WHERE a.attrelid = '#{quote_table_name(table_name)}'::regclass
478
+ WHERE a.attrelid = #{quote(quote_table_name(table_name))}::regclass
515
479
  AND a.attnum > 0 AND NOT a.attisdropped
516
480
  ORDER BY a.attnum
517
481
  end_sql
@@ -522,6 +486,67 @@ module ArJdbc
522
486
  execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
523
487
  end
524
488
 
489
+ # Returns an array of indexes for the given table.
490
+ def indexes(table_name, name = nil)
491
+ if name
492
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
493
+ Passing name to #indexes is deprecated without replacement.
494
+ MSG
495
+ end
496
+
497
+ # FIXME: AR version => table = Utils.extract_schema_qualified_name(table_name.to_s)
498
+ schema, table = extract_schema_and_table(table_name.to_s)
499
+
500
+ result = query(<<-SQL, 'SCHEMA')
501
+ SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
502
+ pg_catalog.obj_description(i.oid, 'pg_class') AS comment,
503
+ (SELECT COUNT(*) FROM pg_opclass o
504
+ JOIN (SELECT unnest(string_to_array(d.indclass::text, ' '))::int oid) c
505
+ ON o.oid = c.oid WHERE o.opcdefault = 'f')
506
+ FROM pg_class t
507
+ INNER JOIN pg_index d ON t.oid = d.indrelid
508
+ INNER JOIN pg_class i ON d.indexrelid = i.oid
509
+ LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
510
+ WHERE i.relkind = 'i'
511
+ AND d.indisprimary = 'f'
512
+ AND t.relname = '#{table}'
513
+ AND n.nspname = #{schema ? "'#{schema}'" : 'ANY (current_schemas(false))'}
514
+ ORDER BY i.relname
515
+ SQL
516
+
517
+ result.map do |row|
518
+ index_name = row[0]
519
+ # FIXME: These values [1,2] are returned in a different format than AR expects, maybe we could update it on the Java side to be more accurate
520
+ unique = row[1].is_a?(String) ? row[1] == 't' : row[1] # JDBC gets us a boolean
521
+ indkey = row[2].is_a?(Java::OrgPostgresqlUtil::PGobject) ? row[2].value : row[2]
522
+ indkey = indkey.split(" ").map(&:to_i)
523
+ inddef = row[3]
524
+ oid = row[4]
525
+ comment = row[5]
526
+ opclass = row[6]
527
+
528
+ using, expressions, where = inddef.scan(/ USING (\w+?) \((.+?)\)(?: WHERE (.+))?\z/m).flatten
529
+
530
+ if indkey.include?(0) || opclass > 0
531
+ columns = expressions
532
+ else
533
+ columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact
534
+ SELECT a.attnum, a.attname
535
+ FROM pg_attribute a
536
+ WHERE a.attrelid = #{oid}
537
+ AND a.attnum IN (#{indkey.join(",")})
538
+ SQL
539
+
540
+ # add info on sort order for columns (only desc order is explicitly specified, asc is the default)
541
+ orders = Hash[
542
+ expressions.scan(/(\w+) DESC/).flatten.map { |order_column| [order_column, :desc] }
543
+ ]
544
+ end
545
+
546
+ IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, using.to_sym, comment.presence)
547
+ end.compact
548
+ end
549
+
525
550
  # @private
526
551
  def column_name_for_operation(operation, node)
527
552
  case operation
@@ -556,13 +581,22 @@ module ArJdbc
556
581
  end
557
582
 
558
583
  def translate_exception(exception, message)
584
+ # TODO: Can we base these on an error code of some kind?
559
585
  case exception.message
560
586
  when /duplicate key value violates unique constraint/
561
587
  ::ActiveRecord::RecordNotUnique.new(message)
588
+ when /violates not-null constraint/
589
+ ::ActiveRecord::NotNullViolation.new(message)
562
590
  when /violates foreign key constraint/
563
591
  ::ActiveRecord::InvalidForeignKey.new(message)
564
592
  when /value too long/
565
593
  ::ActiveRecord::ValueTooLong.new(message)
594
+ when /out of range/
595
+ ::ActiveRecord::RangeError.new(message)
596
+ when /could not serialize/
597
+ ::ActiveRecord::SerializationFailure.new(message)
598
+ when /deadlock detected/
599
+ ::ActiveRecord::Deadlocked.new(message)
566
600
  else
567
601
  super
568
602
  end
@@ -634,11 +668,12 @@ module ActiveRecord::ConnectionAdapters
634
668
  # AR expects OID to be available on the adapter
635
669
  OID = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
636
670
 
637
- def initialize(connection, logger = nil, connection_parameters = nil, config = {})
671
+ def initialize(connection, logger = nil, config = {})
638
672
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
639
673
  @local_tz = nil
674
+ @max_identifier_length = nil
640
675
 
641
- super(connection, logger, config) # configure_connection happens in super
676
+ super # configure_connection happens in super
642
677
 
643
678
  initialize_type_map(@type_map = Type::HashLookupTypeMap.new)
644
679
 
@@ -652,7 +687,6 @@ module ActiveRecord::ConnectionAdapters
652
687
 
653
688
  require 'active_record/connection_adapters/postgresql/schema_definitions'
654
689
 
655
- ColumnDefinition = ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnDefinition
656
690
  ColumnMethods = ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
657
691
  TableDefinition = ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition
658
692
  Table = ActiveRecord::ConnectionAdapters::PostgreSQL::Table
@@ -661,6 +695,21 @@ module ActiveRecord::ConnectionAdapters
661
695
  TableDefinition.new(*args)
662
696
  end
663
697
 
698
+ def exec_query(sql, name = nil, binds = [], prepare: false)
699
+ super
700
+ rescue ActiveRecord::StatementInvalid => e
701
+ raise unless e.cause.message.include?('cached plan must not change result type'.freeze)
702
+
703
+ if open_transactions > 0
704
+ # In a transaction, have to fail it - See AR code for details
705
+ raise ActiveRecord::PreparedStatementCacheExpired.new(e.cause.message)
706
+ else
707
+ # Not in a transaction, clear the prepared statement and try again
708
+ delete_cached_statement(sql)
709
+ retry
710
+ end
711
+ end
712
+
664
713
  public :sql_for_insert
665
714
 
666
715
  def schema_creation # :nodoc:
@@ -679,7 +728,7 @@ module ActiveRecord::ConnectionAdapters
679
728
 
680
729
  # Prepared statements aren't schema aware so we need to make sure we
681
730
  # store different PreparedStatement objects for different schemas
682
- def sql_key(sql)
731
+ def cached_statement_key(sql)
683
732
  "#{schema_search_path}-#{sql}"
684
733
  end
685
734
 
@@ -15,7 +15,7 @@ module ArJdbc
15
15
  end
16
16
 
17
17
  # Extracts the value from a PostgreSQL column default definition.
18
- def extract_value_from_default(default)
18
+ def extract_value_from_default(default) # :nodoc:
19
19
  case default
20
20
  # Quoted types
21
21
  when /\A[\(B]?'(.*)'.*::"?([\w. ]+)"?(?:\[\])?\z/m
@@ -41,13 +41,10 @@ module ArJdbc
41
41
  end
42
42
  end
43
43
 
44
- def extract_default_function(default_value, default)
45
- default if has_default_function?(default_value, default)
44
+ def extract_default_function(default_value, default) # :nodoc:
45
+ default if ! default_value && ( %r{\w+\(.*\)|\(.*\)::\w+} === default )
46
46
  end
47
47
 
48
- def has_default_function?(default_value, default)
49
- !default_value && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP} === default
50
- end
51
48
  end
52
49
 
53
50
  end