sequel 2.9.0 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/CHANGELOG +56 -0
  2. data/{README → README.rdoc} +85 -57
  3. data/Rakefile +10 -5
  4. data/bin/sequel +7 -16
  5. data/doc/advanced_associations.rdoc +5 -17
  6. data/doc/cheat_sheet.rdoc +18 -20
  7. data/doc/dataset_filtering.rdoc +8 -32
  8. data/doc/schema.rdoc +20 -0
  9. data/lib/sequel_core.rb +35 -1
  10. data/lib/sequel_core/adapters/ado.rb +1 -1
  11. data/lib/sequel_core/adapters/db2.rb +2 -2
  12. data/lib/sequel_core/adapters/dbi.rb +2 -11
  13. data/lib/sequel_core/adapters/do.rb +205 -0
  14. data/lib/sequel_core/adapters/do/mysql.rb +38 -0
  15. data/lib/sequel_core/adapters/do/postgres.rb +92 -0
  16. data/lib/sequel_core/adapters/do/sqlite.rb +31 -0
  17. data/lib/sequel_core/adapters/firebird.rb +298 -0
  18. data/lib/sequel_core/adapters/informix.rb +10 -1
  19. data/lib/sequel_core/adapters/jdbc.rb +78 -19
  20. data/lib/sequel_core/adapters/jdbc/h2.rb +69 -0
  21. data/lib/sequel_core/adapters/jdbc/mysql.rb +10 -0
  22. data/lib/sequel_core/adapters/jdbc/postgresql.rb +7 -3
  23. data/lib/sequel_core/adapters/mysql.rb +53 -77
  24. data/lib/sequel_core/adapters/odbc.rb +1 -1
  25. data/lib/sequel_core/adapters/openbase.rb +1 -1
  26. data/lib/sequel_core/adapters/oracle.rb +2 -2
  27. data/lib/sequel_core/adapters/postgres.rb +16 -14
  28. data/lib/sequel_core/adapters/shared/mysql.rb +44 -9
  29. data/lib/sequel_core/adapters/shared/oracle.rb +4 -5
  30. data/lib/sequel_core/adapters/shared/postgres.rb +86 -82
  31. data/lib/sequel_core/adapters/shared/sqlite.rb +39 -24
  32. data/lib/sequel_core/adapters/sqlite.rb +11 -1
  33. data/lib/sequel_core/connection_pool.rb +10 -2
  34. data/lib/sequel_core/core_sql.rb +13 -3
  35. data/lib/sequel_core/database.rb +131 -30
  36. data/lib/sequel_core/database/schema.rb +5 -5
  37. data/lib/sequel_core/dataset.rb +31 -6
  38. data/lib/sequel_core/dataset/convenience.rb +11 -11
  39. data/lib/sequel_core/dataset/query.rb +2 -2
  40. data/lib/sequel_core/dataset/sql.rb +6 -6
  41. data/lib/sequel_core/exceptions.rb +4 -0
  42. data/lib/sequel_core/migration.rb +4 -4
  43. data/lib/sequel_core/schema/generator.rb +19 -3
  44. data/lib/sequel_core/schema/sql.rb +24 -20
  45. data/lib/sequel_core/sql.rb +13 -16
  46. data/lib/sequel_core/version.rb +11 -0
  47. data/lib/sequel_model.rb +2 -0
  48. data/lib/sequel_model/base.rb +2 -2
  49. data/lib/sequel_model/hooks.rb +46 -7
  50. data/lib/sequel_model/record.rb +11 -9
  51. data/lib/sequel_model/schema.rb +1 -1
  52. data/lib/sequel_model/validations.rb +72 -61
  53. data/spec/adapters/firebird_spec.rb +371 -0
  54. data/spec/adapters/mysql_spec.rb +118 -62
  55. data/spec/adapters/oracle_spec.rb +5 -5
  56. data/spec/adapters/postgres_spec.rb +33 -18
  57. data/spec/adapters/sqlite_spec.rb +2 -2
  58. data/spec/integration/dataset_test.rb +3 -3
  59. data/spec/integration/schema_test.rb +55 -5
  60. data/spec/integration/spec_helper.rb +11 -0
  61. data/spec/integration/type_test.rb +59 -16
  62. data/spec/sequel_core/connection_pool_spec.rb +14 -0
  63. data/spec/sequel_core/core_sql_spec.rb +24 -14
  64. data/spec/sequel_core/database_spec.rb +96 -11
  65. data/spec/sequel_core/dataset_spec.rb +97 -37
  66. data/spec/sequel_core/expression_filters_spec.rb +51 -40
  67. data/spec/sequel_core/object_graph_spec.rb +2 -2
  68. data/spec/sequel_core/schema_generator_spec.rb +31 -6
  69. data/spec/sequel_core/schema_spec.rb +25 -9
  70. data/spec/sequel_core/spec_helper.rb +4 -1
  71. data/spec/sequel_core/version_spec.rb +7 -0
  72. data/spec/sequel_model/associations_spec.rb +1 -1
  73. data/spec/sequel_model/hooks_spec.rb +68 -13
  74. data/spec/sequel_model/model_spec.rb +4 -4
  75. data/spec/sequel_model/record_spec.rb +22 -0
  76. data/spec/sequel_model/spec_helper.rb +2 -1
  77. data/spec/sequel_model/validations_spec.rb +107 -7
  78. metadata +15 -5
@@ -5,6 +5,7 @@ module Sequel
5
5
  SYNCHRONOUS = {'0' => :off, '1' => :normal, '2' => :full}.freeze
6
6
  TABLES_FILTER = "type = 'table' AND NOT name = 'sqlite_sequence'"
7
7
  TEMP_STORE = {'0' => :default, '1' => :file, '2' => :memory}.freeze
8
+ TYPES = Sequel::Schema::SQL::TYPES.merge(Bignum=>'integer')
8
9
 
9
10
  # Run all alter_table commands in a transaction. This is technically only
10
11
  # needed for drop column.
@@ -68,8 +69,15 @@ module Sequel
68
69
  end
69
70
 
70
71
  # Array of symbols specifying the table names in the current database.
71
- def tables
72
- self[:sqlite_master].filter(TABLES_FILTER).map {|r| r[:name].to_sym}
72
+ #
73
+ # Options:
74
+ # * :server - Set the server to use.
75
+ def tables(opts={})
76
+ ds = self[:sqlite_master].server(opts[:server]).filter(TABLES_FILTER)
77
+ ds.identifier_output_method = nil
78
+ ds.identifier_input_method = nil
79
+ ds2 = dataset
80
+ ds.map{|r| ds2.send(:output_identifier, r[:name])}
73
81
  end
74
82
 
75
83
  # A symbol signifying the value of the temp_store PRAGMA.
@@ -85,21 +93,22 @@ module Sequel
85
93
 
86
94
  private
87
95
 
88
- # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers by default.
89
- def upcase_identifiers_default
90
- false
96
+ # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
97
+ def identifier_input_method_default
98
+ nil
91
99
  end
92
-
93
- # SQLite supports schema parsing using the table_info PRAGMA, so
94
- # parse the output of that into the format Sequel expects.
95
- def schema_parse_table(table_name, opts)
96
- parse_pragma(table_name, opts).map do |row|
97
- [row.delete(:name).to_sym, row]
98
- end
100
+
101
+ # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
102
+ def identifier_output_method_default
103
+ nil
99
104
  end
100
105
 
106
+ # Parse the output of the table_info pragma
101
107
  def parse_pragma(table_name, opts)
102
- self["PRAGMA table_info(?)", table_name].map do |row|
108
+ ds2 = dataset
109
+ ds = self["PRAGMA table_info(?)", ds2.send(:input_identifier, table_name)]
110
+ ds.identifier_output_method = nil
111
+ ds.map do |row|
103
112
  row.delete(:cid)
104
113
  row[:allow_null] = row.delete(:notnull).to_i == 0
105
114
  row[:default] = row.delete(:dflt_value)
@@ -110,6 +119,20 @@ module Sequel
110
119
  row
111
120
  end
112
121
  end
122
+
123
+ # SQLite supports schema parsing using the table_info PRAGMA, so
124
+ # parse the output of that into the format Sequel expects.
125
+ def schema_parse_table(table_name, opts)
126
+ ds = dataset
127
+ parse_pragma(table_name, opts).map do |row|
128
+ [ds.send(:output_identifier, row.delete(:name)), row]
129
+ end
130
+ end
131
+
132
+ # Override the standard type conversions with SQLite specific ones
133
+ def type_literal_base(column)
134
+ TYPES[column[:type]]
135
+ end
113
136
  end
114
137
 
115
138
  # Instance methods for datasets that connect to an SQLite database
@@ -132,20 +155,12 @@ module Sequel
132
155
  end
133
156
 
134
157
  # SQLite performs a TRUNCATE style DELETE if no filter is specified.
135
- # Since we want to always return the count of records, do a specific
136
- # count in the case of no filter.
158
+ # Since we want to always return the count of records, add a condition
159
+ # that is always true and then delete.
137
160
  def delete(opts = {})
138
161
  # check if no filter is specified
139
162
  opts = @opts.merge(opts)
140
- unless opts[:where]
141
- @db.transaction(opts[:server]) do
142
- unfiltered_count = count
143
- execute_dui(delete_sql(opts))
144
- unfiltered_count
145
- end
146
- else
147
- execute_dui(delete_sql(opts))
148
- end
163
+ super(opts[:where] ? opts : opts.merge(:where=>{1=>1}))
149
164
  end
150
165
 
151
166
  # Insert the values into the database.
@@ -46,6 +46,12 @@ module Sequel
46
46
  db.translator.add_translator("decimal", &prok)
47
47
  db.translator.add_translator("money", &prok)
48
48
 
49
+ # Handle floating point values with Float
50
+ prok = proc{|t,v| Float(v) rescue v}
51
+ db.translator.add_translator("float", &prok)
52
+ db.translator.add_translator("real", &prok)
53
+ db.translator.add_translator("double precision", &prok)
54
+
49
55
  db
50
56
  end
51
57
 
@@ -82,10 +88,14 @@ module Sequel
82
88
  return yield(conn) if conn.transaction_active?
83
89
  begin
84
90
  result = nil
91
+ log_info('Transaction.begin')
85
92
  conn.transaction{result = yield(conn)}
86
93
  result
87
94
  rescue ::Exception => e
95
+ log_info('Transaction.rollback')
88
96
  transaction_error(e, SQLite3::Exception)
97
+ ensure
98
+ log_info('Transaction.commit') unless e
89
99
  end
90
100
  end
91
101
  end
@@ -191,7 +201,7 @@ module Sequel
191
201
  # Yield a hash for each row in the dataset.
192
202
  def fetch_rows(sql)
193
203
  execute(sql) do |result|
194
- @columns = result.columns.map {|c| c.to_sym}
204
+ @columns = result.columns.map{|c| output_identifier(c)}
195
205
  column_count = @columns.size
196
206
  result.each do |values|
197
207
  row = {}
@@ -156,9 +156,17 @@ class Sequel::ConnectionPool
156
156
  # the server is less than the maximum size of the pool.
157
157
  def make_new(server)
158
158
  if @created_count[server] < @max_size
159
+ raise(Sequel::Error, "No connection proc specified") unless @connection_proc
160
+ begin
161
+ conn = @connection_proc.call(server)
162
+ rescue Exception=>exception
163
+ e = Sequel::DatabaseConnectionError.new("#{exception.class} #{exception.message}")
164
+ e.set_backtrace(exception.backtrace)
165
+ raise e
166
+ end
167
+ raise(Sequel::DatabaseConnectionError, "Connection parameters not valid") unless conn
159
168
  set_created_count(server, @created_count[server] + 1)
160
- @connection_proc ? @connection_proc.call(server) : \
161
- (raise Error, "No connection proc specified")
169
+ conn
162
170
  end
163
171
  end
164
172
 
@@ -157,7 +157,14 @@ end
157
157
  class Symbol
158
158
  include Sequel::SQL::QualifyingMethods
159
159
  include Sequel::SQL::IdentifierMethods
160
- include Sequel::SQL::GenericExpressionMethods
160
+ include Sequel::SQL::AliasMethods
161
+ include Sequel::SQL::CastMethods
162
+ include Sequel::SQL::OrderMethods
163
+ include Sequel::SQL::BooleanMethods
164
+ include Sequel::SQL::NumericMethods
165
+ include Sequel::SQL::StringMethods
166
+ include Sequel::SQL::ComplexExpressionMethods
167
+ include Sequel::SQL::InequalityMethods if RUBY_VERSION < '1.9.0'
161
168
 
162
169
  # If no argument is given, returns a Sequel::SQL::ColumnAll object specifying all
163
170
  # columns for this table.
@@ -169,10 +176,13 @@ class Symbol
169
176
  end
170
177
 
171
178
  # Returns a Sequel::SQL::Function with this as the function name,
172
- # and the given arguments.
173
- def [](*args)
179
+ # and the given arguments. This is aliased as Symbol#[] if ruby 1.9
180
+ # is not being used. ruby 1.9 includes Symbol#[], and Sequel
181
+ # doesn't override methods defined by ruby itself.
182
+ def sql_function(*args)
174
183
  Sequel::SQL::Function.new(self, *args)
175
184
  end
185
+ alias_method(:[], :sql_function) if RUBY_VERSION < '1.9.0'
176
186
 
177
187
  # If the given argument is an Integer or an array containing an Integer, returns
178
188
  # a Sequel::SQL::Subscript with this column and the given arg.
@@ -14,7 +14,7 @@ module Sequel
14
14
  include Schema::SQL
15
15
 
16
16
  # Array of supported database adapters
17
- ADAPTERS = %w'ado db2 dbi informix jdbc mysql odbc openbase oracle postgres sqlite'.collect{|x| x.to_sym}
17
+ ADAPTERS = %w'ado db2 dbi do firebird informix jdbc mysql odbc openbase oracle postgres sqlite'.collect{|x| x.to_sym}
18
18
 
19
19
  SQL_BEGIN = 'BEGIN'.freeze
20
20
  SQL_COMMIT = 'COMMIT'.freeze
@@ -22,22 +22,25 @@ module Sequel
22
22
 
23
23
  # Hash of adapters that have been used
24
24
  @@adapters = Hash.new
25
+
26
+ # The identifier input method to use by default
27
+ @@identifier_input_method = nil
28
+
29
+ # The identifier output method to use by default
30
+ @@identifier_output_method = nil
25
31
 
26
32
  # Whether to use the single threaded connection pool by default
27
33
  @@single_threaded = false
28
34
 
29
35
  # Whether to quote identifiers (columns and tables) by default
30
- @@quote_identifiers = true
31
-
32
- # Whether to upcase identifiers (columns and tables) by default
33
- @@upcase_identifiers = nil
36
+ @@quote_identifiers = nil
34
37
 
35
38
  # The default schema to use
36
39
  attr_accessor :default_schema
37
40
 
38
41
  # Array of SQL loggers to use for this database
39
42
  attr_accessor :loggers
40
-
43
+
41
44
  # The options for this database
42
45
  attr_reader :opts
43
46
 
@@ -46,12 +49,6 @@ module Sequel
46
49
 
47
50
  # The prepared statement objects for this database, keyed by name
48
51
  attr_reader :prepared_statements
49
-
50
- # Whether to quote identifiers (columns and tables) for this database
51
- attr_writer :quote_identifiers
52
-
53
- # Whether to upcase identifiers (columns and tables) for this database
54
- attr_writer :upcase_identifiers
55
52
 
56
53
  # Constructs a new instance of a database connection with the specified
57
54
  # options hash.
@@ -61,21 +58,26 @@ module Sequel
61
58
  # Takes the following options:
62
59
  # * :default_schema : The default schema to use, should generally be nil
63
60
  # * :disconnection_proc: A proc used to disconnect the connection.
61
+ # * :identifier_input_method: A string method symbol to call on identifiers going into the database
62
+ # * :identifier_output_method: A string method symbol to call on identifiers coming from the database
64
63
  # * :loggers : An array of loggers to use.
65
64
  # * :quote_identifiers : Whether to quote identifiers
66
65
  # * :single_threaded : Whether to use a single-threaded connection pool
66
+ # * :upcase_identifiers : Whether to upcase identifiers going into the database
67
67
  #
68
68
  # All options given are also passed to the ConnectionPool. If a block
69
69
  # is given, it is used as the connection_proc for the ConnectionPool.
70
70
  def initialize(opts = {}, &block)
71
- @opts = opts
71
+ @opts ||= opts
72
72
 
73
- @quote_identifiers = opts.include?(:quote_identifiers) ? opts[:quote_identifiers] : @@quote_identifiers
74
73
  @single_threaded = opts.include?(:single_threaded) ? opts[:single_threaded] : @@single_threaded
75
74
  @schemas = nil
76
- @default_schema = opts[:default_schema]
75
+ @default_schema = opts.include?(:default_schema) ? opts[:default_schema] : default_schema_default
77
76
  @prepared_statements = {}
78
77
  @transactions = []
78
+ if opts.include?(:upcase_identifiers)
79
+ @identifier_input_method = opts[:upcase_identifiers] ? :upcase : ""
80
+ end
79
81
  @pool = (@single_threaded ? SingleThreadedPool : ConnectionPool).new(connection_pool_default_options.merge(opts), &block)
80
82
  @pool.connection_proc = proc{|server| connect(server)} unless block
81
83
  @pool.disconnection_proc = proc{|conn| disconnect_connection(conn)} unless opts[:disconnection_proc]
@@ -119,6 +121,9 @@ module Sequel
119
121
  if conn_string =~ /\Ajdbc:/
120
122
  c = adapter_class(:jdbc)
121
123
  opts = {:uri=>conn_string}.merge(opts)
124
+ elsif conn_string =~ /\Ado:/
125
+ c = adapter_class(:do)
126
+ opts = {:uri=>conn_string}.merge(opts)
122
127
  else
123
128
  uri = URI.parse(conn_string)
124
129
  scheme = uri.scheme
@@ -150,6 +155,26 @@ module Sequel
150
155
  c.new(opts)
151
156
  end
152
157
  end
158
+
159
+ # The method to call on identifiers going into the database
160
+ def self.identifier_input_method
161
+ @@identifier_input_method
162
+ end
163
+
164
+ # Set the method to call on identifiers going into the database
165
+ def self.identifier_input_method=(v)
166
+ @@identifier_input_method = v || ""
167
+ end
168
+
169
+ # The method to call on identifiers coming from the database
170
+ def self.identifier_output_method
171
+ @@identifier_output_method
172
+ end
173
+
174
+ # Set the method to call on identifiers coming from the database
175
+ def self.identifier_output_method=(v)
176
+ @@identifier_output_method = v || ""
177
+ end
153
178
 
154
179
  # Sets the default quote_identifiers mode for new databases.
155
180
  # See Sequel.quote_identifiers=.
@@ -166,7 +191,7 @@ module Sequel
166
191
  # Sets the default quote_identifiers mode for new databases.
167
192
  # See Sequel.quote_identifiers=.
168
193
  def self.upcase_identifiers=(value)
169
- @@upcase_identifiers = value
194
+ self.identifier_input_method = value ? :upcase : nil
170
195
  end
171
196
 
172
197
  ### Private Class Methods ###
@@ -262,6 +287,12 @@ module Sequel
262
287
  execute(sql, opts, &block)
263
288
  end
264
289
 
290
+ # Method that should be used when issuing a INSERT
291
+ # statement. By default, calls execute_dui.
292
+ def execute_insert(sql, opts={}, &block)
293
+ execute_dui(sql, opts, &block)
294
+ end
295
+
265
296
  # Fetches records for an arbitrary SQL statement. If a block is given,
266
297
  # it is used to iterate over the records:
267
298
  #
@@ -296,11 +327,49 @@ module Sequel
296
327
  # DB.get(1) #=> 1
297
328
  #
298
329
  # # SELECT version()
299
- # DB.get(:version[]) #=> ...
330
+ # DB.get(:version.sql_function) #=> ...
300
331
  def get(expr)
301
332
  dataset.get(expr)
302
333
  end
303
334
 
335
+ # The method to call on identifiers going into the database
336
+ def identifier_input_method
337
+ case @identifier_input_method
338
+ when nil
339
+ @identifier_input_method = @opts.include?(:identifier_input_method) ? @opts[:identifier_input_method] : (@@identifier_input_method.nil? ? identifier_input_method_default : @@identifier_input_method)
340
+ @identifier_input_method == "" ? nil : @identifier_input_method
341
+ when ""
342
+ nil
343
+ else
344
+ @identifier_input_method
345
+ end
346
+ end
347
+
348
+ # Set the method to call on identifiers going into the database
349
+ def identifier_input_method=(v)
350
+ reset_schema_utility_dataset
351
+ @identifier_input_method = v || ""
352
+ end
353
+
354
+ # The method to call on identifiers coming from the database
355
+ def identifier_output_method
356
+ case @identifier_output_method
357
+ when nil
358
+ @identifier_output_method = @opts.include?(:identifier_output_method) ? @opts[:identifier_output_method] : (@@identifier_output_method.nil? ? identifier_output_method_default : @@identifier_output_method)
359
+ @identifier_output_method == "" ? nil : @identifier_output_method
360
+ when ""
361
+ nil
362
+ else
363
+ @identifier_output_method
364
+ end
365
+ end
366
+
367
+ # Set the method to call on identifiers coming from the database
368
+ def identifier_output_method=(v)
369
+ reset_schema_utility_dataset
370
+ @identifier_output_method = v || ""
371
+ end
372
+
304
373
  # Returns a string representation of the database object including the
305
374
  # class name and the connection URI (or the opts if the URI
306
375
  # cannot be constructed).
@@ -336,9 +405,16 @@ module Sequel
336
405
  dataset.query(&block)
337
406
  end
338
407
 
408
+ # Whether to quote identifiers (columns and tables) for this database
409
+ def quote_identifiers=(v)
410
+ reset_schema_utility_dataset
411
+ @quote_identifiers = v
412
+ end
413
+
339
414
  # Returns true if the database quotes identifiers.
340
415
  def quote_identifiers?
341
- @quote_identifiers
416
+ return @quote_identifiers unless @quote_identifiers.nil?
417
+ @quote_identifiers = @opts.include?(:quote_identifiers) ? @opts[:quote_identifiers] : (@@quote_identifiers.nil? ? quote_identifiers_default : @@quote_identifiers)
342
418
  end
343
419
 
344
420
  # Returns a new dataset with the select method invoked.
@@ -348,7 +424,7 @@ module Sequel
348
424
 
349
425
  # Default serial primary key options.
350
426
  def serial_primary_key_options
351
- {:primary_key => true, :type => :integer, :auto_increment => true}
427
+ {:primary_key => true, :type => Integer, :auto_increment => true}
352
428
  end
353
429
 
354
430
  # Returns true if the database is using a single-threaded connection pool.
@@ -485,11 +561,15 @@ module Sequel
485
561
  value
486
562
  end
487
563
  end
564
+
565
+ # Set whether to upcase identifiers going into the database.
566
+ def upcase_identifiers=(v)
567
+ self.identifier_input_method = v ? :upcase : nil
568
+ end
488
569
 
489
570
  # Returns true if the database upcases identifiers.
490
571
  def upcase_identifiers?
491
- return @upcase_identifiers unless @upcase_identifiers.nil?
492
- @upcase_identifiers = @opts.include?(:upcase_identifiers) ? @opts[:upcase_identifiers] : (@@upcase_identifiers.nil? ? upcase_identifiers_default : @@upcase_identifiers)
572
+ identifier_input_method == :upcase
493
573
  end
494
574
 
495
575
  # Returns the URI identifying the database.
@@ -511,7 +591,11 @@ module Sequel
511
591
  uri.password = @opts[:password] if uri.user
512
592
  uri.to_s
513
593
  end
514
- alias_method :url, :uri
594
+
595
+ # Explicit alias of uri for easier subclassing.
596
+ def url
597
+ uri
598
+ end
515
599
 
516
600
  private
517
601
 
@@ -530,6 +614,31 @@ module Sequel
530
614
  {}
531
615
  end
532
616
 
617
+ # The default value for default_schema.
618
+ def default_schema_default
619
+ nil
620
+ end
621
+
622
+ # The method to apply to identifiers going into the database by default.
623
+ # Should be overridden in subclasses for databases that fold unquoted
624
+ # identifiers to lower case instead of uppercase, such as
625
+ # MySQL, PostgreSQL, and SQLite.
626
+ def identifier_input_method_default
627
+ :upcase
628
+ end
629
+
630
+ # The method to apply to identifiers coming the database by default.
631
+ # Should be overridden in subclasses for databases that fold unquoted
632
+ # identifiers to lower case instead of uppercase, such as
633
+ # MySQL, PostgreSQL, and SQLite.
634
+ def identifier_output_method_default
635
+ :downcase
636
+ end
637
+
638
+ def quote_identifiers_default
639
+ true
640
+ end
641
+
533
642
  # SQL to ROLLBACK a transaction.
534
643
  def rollback_transaction_sql
535
644
  SQL_ROLLBACK
@@ -576,14 +685,6 @@ module Sequel
576
685
  def transaction_error(e, *classes)
577
686
  raise_error(e, :classes=>classes) unless Error::Rollback === e
578
687
  end
579
-
580
- # Sets whether to upcase identifiers by default. Should be
581
- # overridden in subclasses for databases that fold unquoted
582
- # identifiers to lower case instead of uppercase, such as
583
- # MySQL, PostgreSQL, and SQLite.
584
- def upcase_identifiers_default
585
- true
586
- end
587
688
  end
588
689
  end
589
690