activerecord-jdbc-adapter 51.7-java → 52.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/.travis.yml +26 -51
  4. data/README.md +9 -11
  5. data/Rakefile +19 -74
  6. data/activerecord-jdbc-adapter.gemspec +2 -2
  7. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  8. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  9. data/lib/arjdbc/abstract/core.rb +2 -12
  10. data/lib/arjdbc/abstract/database_statements.rb +24 -10
  11. data/lib/arjdbc/abstract/statement_cache.rb +4 -4
  12. data/lib/arjdbc/db2/adapter.rb +52 -2
  13. data/lib/arjdbc/jdbc.rb +4 -0
  14. data/lib/arjdbc/jdbc/column.rb +11 -5
  15. data/lib/arjdbc/jdbc/connection_methods.rb +9 -2
  16. data/lib/arjdbc/jdbc/jdbc.rake +4 -0
  17. data/lib/arjdbc/mssql.rb +7 -0
  18. data/lib/arjdbc/mssql/adapter.rb +804 -0
  19. data/lib/arjdbc/mssql/column.rb +200 -0
  20. data/lib/arjdbc/mssql/connection_methods.rb +79 -0
  21. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  22. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  23. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  24. data/lib/arjdbc/mssql/types.rb +343 -0
  25. data/lib/arjdbc/mssql/utils.rb +82 -0
  26. data/lib/arjdbc/mysql/adapter.rb +22 -14
  27. data/lib/arjdbc/mysql/connection_methods.rb +9 -18
  28. data/lib/arjdbc/postgresql/adapter.rb +102 -75
  29. data/lib/arjdbc/postgresql/column.rb +3 -6
  30. data/lib/arjdbc/postgresql/connection_methods.rb +3 -12
  31. data/lib/arjdbc/postgresql/oid_types.rb +12 -86
  32. data/lib/arjdbc/sqlite3/adapter.rb +88 -92
  33. data/lib/arjdbc/sqlite3/connection_methods.rb +0 -1
  34. data/lib/arjdbc/tasks/database_tasks.rb +36 -16
  35. data/lib/arjdbc/tasks/databases.rake +75 -32
  36. data/lib/arjdbc/tasks/databases3.rake +215 -0
  37. data/lib/arjdbc/tasks/databases4.rake +39 -0
  38. data/lib/arjdbc/version.rb +1 -1
  39. data/rakelib/01-tomcat.rake +2 -2
  40. data/rakelib/02-test.rake +3 -0
  41. data/rakelib/compile.rake +70 -0
  42. data/rakelib/db.rake +7 -21
  43. data/rakelib/rails.rake +4 -5
  44. data/src/java/arjdbc/ArJdbcModule.java +15 -5
  45. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +2 -2
  46. data/src/java/arjdbc/jdbc/ConnectionFactory.java +87 -0
  47. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +1 -0
  48. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +29 -113
  49. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +14 -259
  50. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +2 -2
  51. data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
  52. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +13 -21
  53. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +50 -44
  54. data/src/java/arjdbc/util/DateTimeUtils.java +5 -141
  55. data/src/java/arjdbc/util/QuotingUtils.java +7 -6
  56. metadata +26 -11
  57. data/src/java/arjdbc/jdbc/RubyConnectionFactory.java +0 -61
  58. 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
@@ -65,6 +57,10 @@ module ActiveRecord
65
57
  true
66
58
  end
67
59
 
60
+ def supports_set_server_option?
61
+ false
62
+ end
63
+
68
64
  # HELPER METHODS ===========================================
69
65
 
70
66
  # Reloading the type map in abstract/statement_cache.rb blows up postgres
@@ -90,10 +86,6 @@ module ActiveRecord
90
86
  exception.error_code if exception.is_a?(JDBCError)
91
87
  end
92
88
 
93
- def create_table(table_name, **options) #:nodoc:
94
- super(table_name, options: "ENGINE=InnoDB", **options)
95
- end
96
-
97
89
  #--
98
90
  # QUOTING ==================================================
99
91
  #+
@@ -146,6 +138,22 @@ module ActiveRecord
146
138
  ::ActiveRecord::ConnectionAdapters::MySQL::Column
147
139
  end
148
140
 
141
+ # defined in MySQL::DatabaseStatements which is not included
142
+ def default_insert_value(column)
143
+ Arel.sql("DEFAULT") unless column.auto_increment?
144
+ end
145
+
146
+ # FIXME: optimize insert_fixtures_set by using JDBC Statement.addBatch()/executeBatch()
147
+ def combine_multi_statements(total_sql)
148
+ total_sql
149
+ end
150
+
151
+ def with_multi_statements
152
+ yield
153
+ end
154
+
155
+ def discard_remaining_results
156
+ end
149
157
  end
150
158
  end
151
159
  end
@@ -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
@@ -8,6 +8,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
10
  require 'active_record/connection_adapters/postgresql/schema_creation'
11
+ require 'active_record/connection_adapters/postgresql/schema_definitions'
11
12
  require 'active_record/connection_adapters/postgresql/schema_dumper'
12
13
  require 'active_record/connection_adapters/postgresql/schema_statements'
13
14
  require 'active_record/connection_adapters/postgresql/type_metadata'
@@ -30,9 +31,6 @@ module ArJdbc
30
31
  # @private
31
32
  IndexDefinition = ::ActiveRecord::ConnectionAdapters::IndexDefinition
32
33
 
33
- # @private
34
- ForeignKeyDefinition = ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition
35
-
36
34
  # @private
37
35
  Type = ::ActiveRecord::Type
38
36
 
@@ -50,35 +48,12 @@ module ArJdbc
50
48
  ADAPTER_NAME
51
49
  end
52
50
 
53
- # TODO: Update this to pull info from the DatabaseMetaData object?
54
51
  def postgresql_version
55
52
  @postgresql_version ||=
56
53
  begin
57
54
  version = @connection.database_product
58
- if match = version.match(/([\d\.]*\d).*?/)
59
- version = match[1].split('.').map(&:to_i)
60
- # PostgreSQL version representation does not have more than 4 digits
61
- # From version 10 onwards, PG has changed its versioning policy to
62
- # limit it to only 2 digits. i.e. in 10.x, 10 being the major
63
- # version and x representing the patch release
64
- # Refer to:
65
- # https://www.postgresql.org/support/versioning/
66
- # https://www.postgresql.org/docs/10/static/libpq-status.html -> PQserverVersion()
67
- # for more info
68
-
69
- if version.size >= 3
70
- (version[0] * 100 + version[1]) * 100 + version[2]
71
- elsif version.size == 2
72
- if version[0] >= 10
73
- version[0] * 100 * 100 + version[1]
74
- else
75
- (version[0] * 100 + version[1]) * 100
76
- end
77
- elsif version.size == 1
78
- version[0] * 100 * 100
79
- else
80
- 0
81
- end
55
+ if version =~ /PostgreSQL (\d+)\.(\d+)\.(\d+)/
56
+ ($1.to_i * 10000) + ($2.to_i * 100) + $3.to_i
82
57
  else
83
58
  0
84
59
  end
@@ -239,8 +214,6 @@ module ArJdbc
239
214
 
240
215
  def supports_ddl_transactions?; true end
241
216
 
242
- def supports_advisory_locks?; true end
243
-
244
217
  def supports_explain?; true end
245
218
 
246
219
  def supports_expression_index?; true end
@@ -257,26 +230,18 @@ module ArJdbc
257
230
 
258
231
  def supports_views?; true end
259
232
 
260
- def supports_datetime_with_precision?; true end
261
-
262
- def supports_comments?; true end
263
-
264
233
  # Does PostgreSQL support standard conforming strings?
265
234
  def supports_standard_conforming_strings?
266
235
  standard_conforming_strings?
267
236
  @standard_conforming_strings != :unsupported
268
237
  end
269
238
 
270
- def supports_hex_escaped_bytea?
271
- postgresql_version >= 90000
272
- end
273
-
274
- def supports_materialized_views?
239
+ def supports_foreign_tables? # we don't really support this yet, its a reminder :)
275
240
  postgresql_version >= 90300
276
241
  end
277
242
 
278
- def supports_json?
279
- postgresql_version >= 90200
243
+ def supports_hex_escaped_bytea?
244
+ postgresql_version >= 90000
280
245
  end
281
246
 
282
247
  def supports_insert_with_returning?
@@ -374,8 +339,8 @@ module ArJdbc
374
339
  end
375
340
 
376
341
  def explain(arel, binds = [])
377
- sql = "EXPLAIN #{to_sql(arel, binds)}"
378
- ActiveRecord::ConnectionAdapters::PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query(sql, 'EXPLAIN', binds))
342
+ sql, binds = to_sql_and_binds(arel, binds)
343
+ ActiveRecord::ConnectionAdapters::PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query("EXPLAIN #{sql}", 'EXPLAIN', binds))
379
344
  end
380
345
 
381
346
  # @note Only for "better" AR 4.0 compatibility.
@@ -412,12 +377,6 @@ module ArJdbc
412
377
  @connection.configure_connection
413
378
  end
414
379
 
415
- def default_sequence_name(table_name, pk = "id") #:nodoc:
416
- serial_sequence(table_name, pk)
417
- rescue ActiveRecord::StatementInvalid
418
- %Q("#{table_name}_#{pk}_seq")
419
- end
420
-
421
380
  def last_insert_id_result(sequence_name)
422
381
  exec_query("SELECT currval('#{sequence_name}')", 'SQL')
423
382
  end
@@ -435,10 +394,8 @@ module ArJdbc
435
394
 
436
395
  # Set the client message level.
437
396
  def client_min_messages=(level)
438
- # NOTE: for now simply ignore the writer (no warn on Redshift) so that
439
- # the AR copy-pasted PpstgreSQL parts stay the same as much as possible
440
- return nil if redshift? # not supported on Redshift
441
- execute("SET client_min_messages TO '#{level}'", 'SCHEMA')
397
+ # Not supported on Redshift
398
+ redshift? ? nil : super
442
399
  end
443
400
 
444
401
  # ORDER BY clause for the passed order option.
@@ -528,6 +485,77 @@ module ArJdbc
528
485
  execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
529
486
  end
530
487
 
488
+ # Returns an array of indexes for the given table.
489
+ def indexes(table_name)
490
+
491
+ # FIXME: AR version => table = Utils.extract_schema_qualified_name(table_name.to_s)
492
+ schema, table = extract_schema_and_table(table_name.to_s)
493
+
494
+ result = query(<<-SQL, 'SCHEMA')
495
+ SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
496
+ pg_catalog.obj_description(i.oid, 'pg_class') AS comment
497
+ FROM pg_class t
498
+ INNER JOIN pg_index d ON t.oid = d.indrelid
499
+ INNER JOIN pg_class i ON d.indexrelid = i.oid
500
+ LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
501
+ WHERE i.relkind = 'i'
502
+ AND d.indisprimary = 'f'
503
+ AND t.relname = '#{table}'
504
+ AND n.nspname = #{schema ? "'#{schema}'" : 'ANY (current_schemas(false))'}
505
+ ORDER BY i.relname
506
+ SQL
507
+
508
+ result.map do |row|
509
+ index_name = row[0]
510
+ # 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
511
+ unique = row[1].is_a?(String) ? row[1] == 't' : row[1] # JDBC gets us a boolean
512
+ indkey = row[2].is_a?(Java::OrgPostgresqlUtil::PGobject) ? row[2].value : row[2]
513
+ indkey = indkey.split(" ").map(&:to_i)
514
+ inddef = row[3]
515
+ oid = row[4]
516
+ comment = row[5]
517
+
518
+ using, expressions, where = inddef.scan(/ USING (\w+?) \((.+?)\)(?: WHERE (.+))?\z/m).flatten
519
+
520
+ orders = {}
521
+ opclasses = {}
522
+
523
+ if indkey.include?(0)
524
+ columns = expressions
525
+ else
526
+ columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact
527
+ SELECT a.attnum, a.attname
528
+ FROM pg_attribute a
529
+ WHERE a.attrelid = #{oid}
530
+ AND a.attnum IN (#{indkey.join(",")})
531
+ SQL
532
+
533
+ # add info on sort order (only desc order is explicitly specified, asc is the default)
534
+ # and non-default opclasses
535
+ expressions.scan(/(?<column>\w+)\s?(?<opclass>\w+_ops)?\s?(?<desc>DESC)?\s?(?<nulls>NULLS (?:FIRST|LAST))?/).each do |column, opclass, desc, nulls|
536
+ opclasses[column] = opclass.to_sym if opclass
537
+ if nulls
538
+ orders[column] = [desc, nulls].compact.join(' ')
539
+ elsif desc
540
+ orders[column] = :desc
541
+ end
542
+ end
543
+ end
544
+
545
+ IndexDefinition.new(
546
+ table_name,
547
+ index_name,
548
+ unique,
549
+ columns,
550
+ orders: orders,
551
+ opclasses: opclasses,
552
+ where: where,
553
+ using: using.to_sym,
554
+ comment: comment.presence
555
+ )
556
+ end
557
+ end
558
+
531
559
  # @private
532
560
  def column_name_for_operation(operation, node)
533
561
  case operation
@@ -562,8 +590,6 @@ module ArJdbc
562
590
  end
563
591
 
564
592
  def translate_exception(exception, message)
565
- return super unless exception.is_a?(ActiveRecord::JDBCError)
566
-
567
593
  # TODO: Can we base these on an error code of some kind?
568
594
  case exception.message
569
595
  when /duplicate key value violates unique constraint/
@@ -580,6 +606,10 @@ module ArJdbc
580
606
  ::ActiveRecord::SerializationFailure.new(message)
581
607
  when /deadlock detected/
582
608
  ::ActiveRecord::Deadlocked.new(message)
609
+ when /lock timeout/
610
+ ::ActiveRecord::LockWaitTimeout.new(message)
611
+ when /canceling statement/ # This needs to come after lock timeout because the lock timeout message also contains "canceling statement"
612
+ ::ActiveRecord::QueryCanceled.new(message)
583
613
  else
584
614
  super
585
615
  end
@@ -627,7 +657,6 @@ module ActiveRecord::ConnectionAdapters
627
657
 
628
658
  # Try to use as much of the built in postgres logic as possible
629
659
  # maybe someday we can extend the actual adapter
630
- include ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnDumper
631
660
  include ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity
632
661
  include ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
633
662
  include ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
@@ -651,14 +680,15 @@ module ActiveRecord::ConnectionAdapters
651
680
  # AR expects OID to be available on the adapter
652
681
  OID = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
653
682
 
654
- def initialize(connection, logger = nil, connection_parameters = nil, config = {})
683
+ def initialize(connection, logger = nil, config = {})
655
684
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
656
685
  @local_tz = nil
657
686
  @max_identifier_length = nil
658
687
 
659
- super(connection, logger, config) # configure_connection happens in super
688
+ super # configure_connection happens in super
660
689
 
661
- initialize_type_map(@type_map = Type::HashLookupTypeMap.new)
690
+ @type_map = Type::HashLookupTypeMap.new
691
+ initialize_type_map
662
692
 
663
693
  @use_insert_returning = @config.key?(:insert_returning) ?
664
694
  self.class.type_cast_config_to_boolean(@config[:insert_returning]) : nil
@@ -668,26 +698,23 @@ module ActiveRecord::ConnectionAdapters
668
698
  Arel::Visitors::PostgreSQL.new(self)
669
699
  end
670
700
 
671
- require 'active_record/connection_adapters/postgresql/schema_definitions'
672
-
673
- ColumnMethods = ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
674
- TableDefinition = ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition
675
- Table = ActiveRecord::ConnectionAdapters::PostgreSQL::Table
701
+ def exec_query(sql, name = nil, binds = [], prepare: false)
702
+ super
703
+ rescue ActiveRecord::StatementInvalid => e
704
+ raise unless e.cause.message.include?('cached plan must not change result type'.freeze)
676
705
 
677
- def create_table_definition(*args) # :nodoc:
678
- TableDefinition.new(*args)
706
+ if open_transactions > 0
707
+ # In a transaction, have to fail it - See AR code for details
708
+ raise ActiveRecord::PreparedStatementCacheExpired.new(e.cause.message)
709
+ else
710
+ # Not in a transaction, clear the prepared statement and try again
711
+ delete_cached_statement(sql)
712
+ retry
713
+ end
679
714
  end
680
715
 
681
716
  public :sql_for_insert
682
717
 
683
- def schema_creation # :nodoc:
684
- PostgreSQL::SchemaCreation.new self
685
- end
686
-
687
- def update_table_definition(table_name, base)
688
- Table.new(table_name, base)
689
- end
690
-
691
718
  def jdbc_connection_class(spec)
692
719
  ::ArJdbc::PostgreSQL.jdbc_connection_class
693
720
  end
@@ -696,7 +723,7 @@ module ActiveRecord::ConnectionAdapters
696
723
 
697
724
  # Prepared statements aren't schema aware so we need to make sure we
698
725
  # store different PreparedStatement objects for different schemas
699
- def sql_key(sql)
726
+ def cached_statement_key(sql)
700
727
  "#{schema_search_path}-#{sql}"
701
728
  end
702
729
 
@@ -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