sequel 3.21.0 → 3.31.0

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 (225) hide show
  1. data/CHANGELOG +485 -3
  2. data/README.rdoc +20 -6
  3. data/Rakefile +37 -19
  4. data/bin/sequel +1 -5
  5. data/doc/association_basics.rdoc +249 -43
  6. data/doc/dataset_basics.rdoc +4 -4
  7. data/doc/dataset_filtering.rdoc +8 -0
  8. data/doc/mass_assignment.rdoc +54 -0
  9. data/doc/migration.rdoc +15 -538
  10. data/doc/model_hooks.rdoc +72 -27
  11. data/doc/opening_databases.rdoc +89 -50
  12. data/doc/prepared_statements.rdoc +40 -13
  13. data/doc/reflection.rdoc +8 -2
  14. data/doc/release_notes/3.22.0.txt +39 -0
  15. data/doc/release_notes/3.23.0.txt +172 -0
  16. data/doc/release_notes/3.24.0.txt +420 -0
  17. data/doc/release_notes/3.25.0.txt +88 -0
  18. data/doc/release_notes/3.26.0.txt +88 -0
  19. data/doc/release_notes/3.27.0.txt +82 -0
  20. data/doc/release_notes/3.28.0.txt +304 -0
  21. data/doc/release_notes/3.29.0.txt +459 -0
  22. data/doc/release_notes/3.30.0.txt +135 -0
  23. data/doc/release_notes/3.31.0.txt +146 -0
  24. data/doc/schema_modification.rdoc +547 -0
  25. data/doc/sharding.rdoc +7 -1
  26. data/doc/testing.rdoc +129 -0
  27. data/doc/transactions.rdoc +137 -0
  28. data/doc/virtual_rows.rdoc +2 -2
  29. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  30. data/lib/sequel/adapters/ado.rb +40 -18
  31. data/lib/sequel/adapters/amalgalite.rb +17 -9
  32. data/lib/sequel/adapters/db2.rb +175 -86
  33. data/lib/sequel/adapters/dbi.rb +15 -15
  34. data/lib/sequel/adapters/do/mysql.rb +5 -7
  35. data/lib/sequel/adapters/do/postgres.rb +0 -5
  36. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  37. data/lib/sequel/adapters/do.rb +17 -36
  38. data/lib/sequel/adapters/firebird.rb +27 -208
  39. data/lib/sequel/adapters/ibmdb.rb +448 -0
  40. data/lib/sequel/adapters/informix.rb +6 -23
  41. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  42. data/lib/sequel/adapters/jdbc/db2.rb +45 -0
  43. data/lib/sequel/adapters/jdbc/derby.rb +247 -0
  44. data/lib/sequel/adapters/jdbc/firebird.rb +29 -0
  45. data/lib/sequel/adapters/jdbc/h2.rb +56 -29
  46. data/lib/sequel/adapters/jdbc/hsqldb.rb +170 -0
  47. data/lib/sequel/adapters/jdbc/informix.rb +26 -0
  48. data/lib/sequel/adapters/jdbc/jtds.rb +34 -0
  49. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  50. data/lib/sequel/adapters/jdbc/mysql.rb +11 -11
  51. data/lib/sequel/adapters/jdbc/oracle.rb +81 -25
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +9 -13
  53. data/lib/sequel/adapters/jdbc/sqlite.rb +2 -6
  54. data/lib/sequel/adapters/jdbc/sqlserver.rb +71 -0
  55. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  56. data/lib/sequel/adapters/jdbc.rb +231 -78
  57. data/lib/sequel/adapters/mock.rb +335 -0
  58. data/lib/sequel/adapters/mysql.rb +82 -184
  59. data/lib/sequel/adapters/mysql2.rb +26 -25
  60. data/lib/sequel/adapters/odbc/db2.rb +17 -0
  61. data/lib/sequel/adapters/odbc/mssql.rb +1 -6
  62. data/lib/sequel/adapters/odbc.rb +28 -9
  63. data/lib/sequel/adapters/openbase.rb +3 -5
  64. data/lib/sequel/adapters/oracle.rb +351 -53
  65. data/lib/sequel/adapters/postgres.rb +194 -33
  66. data/lib/sequel/adapters/shared/access.rb +32 -9
  67. data/lib/sequel/adapters/shared/db2.rb +321 -0
  68. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  69. data/lib/sequel/adapters/shared/informix.rb +53 -0
  70. data/lib/sequel/adapters/shared/mssql.rb +231 -106
  71. data/lib/sequel/adapters/shared/mysql.rb +181 -63
  72. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +149 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +231 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +214 -82
  75. data/lib/sequel/adapters/shared/progress.rb +4 -7
  76. data/lib/sequel/adapters/shared/sqlite.rb +201 -57
  77. data/lib/sequel/adapters/sqlite.rb +29 -21
  78. data/lib/sequel/adapters/swift/mysql.rb +12 -7
  79. data/lib/sequel/adapters/swift/postgres.rb +0 -5
  80. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  81. data/lib/sequel/adapters/swift.rb +5 -5
  82. data/lib/sequel/adapters/tinytds.rb +160 -19
  83. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  85. data/lib/sequel/ast_transformer.rb +190 -0
  86. data/lib/sequel/connection_pool/threaded.rb +3 -2
  87. data/lib/sequel/connection_pool.rb +1 -1
  88. data/lib/sequel/core.rb +46 -5
  89. data/lib/sequel/database/connecting.rb +5 -6
  90. data/lib/sequel/database/dataset.rb +4 -4
  91. data/lib/sequel/database/dataset_defaults.rb +59 -1
  92. data/lib/sequel/database/logging.rb +1 -1
  93. data/lib/sequel/database/misc.rb +104 -19
  94. data/lib/sequel/database/query.rb +153 -58
  95. data/lib/sequel/database/schema_generator.rb +17 -7
  96. data/lib/sequel/database/schema_methods.rb +59 -29
  97. data/lib/sequel/dataset/actions.rb +231 -76
  98. data/lib/sequel/dataset/features.rb +91 -8
  99. data/lib/sequel/dataset/graph.rb +38 -11
  100. data/lib/sequel/dataset/misc.rb +50 -23
  101. data/lib/sequel/dataset/mutation.rb +5 -6
  102. data/lib/sequel/dataset/prepared_statements.rb +48 -27
  103. data/lib/sequel/dataset/query.rb +236 -43
  104. data/lib/sequel/dataset/sql.rb +665 -253
  105. data/lib/sequel/dataset.rb +8 -0
  106. data/lib/sequel/exceptions.rb +4 -0
  107. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  108. data/lib/sequel/extensions/migration.rb +6 -4
  109. data/lib/sequel/extensions/named_timezones.rb +5 -0
  110. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  111. data/lib/sequel/extensions/to_dot.rb +95 -83
  112. data/lib/sequel/model/associations.rb +1020 -337
  113. data/lib/sequel/model/base.rb +414 -132
  114. data/lib/sequel/model/errors.rb +1 -1
  115. data/lib/sequel/model/exceptions.rb +5 -1
  116. data/lib/sequel/model.rb +15 -8
  117. data/lib/sequel/plugins/association_pks.rb +22 -4
  118. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  119. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  120. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  121. data/lib/sequel/plugins/force_encoding.rb +6 -6
  122. data/lib/sequel/plugins/identity_map.rb +114 -7
  123. data/lib/sequel/plugins/many_through_many.rb +65 -7
  124. data/lib/sequel/plugins/prepared_statements.rb +151 -0
  125. data/lib/sequel/plugins/prepared_statements_associations.rb +84 -0
  126. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  127. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  128. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  129. data/lib/sequel/plugins/serialization.rb +88 -44
  130. data/lib/sequel/plugins/serialization_modification_detection.rb +51 -0
  131. data/lib/sequel/plugins/sharding.rb +21 -54
  132. data/lib/sequel/plugins/single_table_inheritance.rb +3 -1
  133. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  134. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  135. data/lib/sequel/plugins/xml_serializer.rb +3 -3
  136. data/lib/sequel/sql.rb +109 -52
  137. data/lib/sequel/timezones.rb +57 -38
  138. data/lib/sequel/version.rb +1 -1
  139. data/spec/adapters/db2_spec.rb +146 -0
  140. data/spec/adapters/mssql_spec.rb +111 -29
  141. data/spec/adapters/mysql_spec.rb +135 -123
  142. data/spec/adapters/oracle_spec.rb +49 -77
  143. data/spec/adapters/postgres_spec.rb +267 -78
  144. data/spec/adapters/spec_helper.rb +6 -5
  145. data/spec/adapters/sqlite_spec.rb +35 -21
  146. data/spec/core/connection_pool_spec.rb +71 -92
  147. data/spec/core/core_sql_spec.rb +21 -30
  148. data/spec/core/database_spec.rb +788 -512
  149. data/spec/core/dataset_spec.rb +1073 -1053
  150. data/spec/core/expression_filters_spec.rb +159 -42
  151. data/spec/core/mock_adapter_spec.rb +419 -0
  152. data/spec/core/object_graph_spec.rb +86 -114
  153. data/spec/core/schema_generator_spec.rb +3 -3
  154. data/spec/core/schema_spec.rb +298 -38
  155. data/spec/core/spec_helper.rb +6 -48
  156. data/spec/extensions/association_autoreloading_spec.rb +1 -10
  157. data/spec/extensions/association_dependencies_spec.rb +2 -12
  158. data/spec/extensions/association_pks_spec.rb +66 -32
  159. data/spec/extensions/caching_spec.rb +23 -50
  160. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  161. data/spec/extensions/columns_introspection_spec.rb +91 -0
  162. data/spec/extensions/composition_spec.rb +18 -13
  163. data/spec/extensions/dataset_associations_spec.rb +199 -0
  164. data/spec/extensions/defaults_setter_spec.rb +64 -0
  165. data/spec/extensions/hook_class_methods_spec.rb +65 -91
  166. data/spec/extensions/identity_map_spec.rb +114 -22
  167. data/spec/extensions/instance_filters_spec.rb +11 -21
  168. data/spec/extensions/instance_hooks_spec.rb +53 -0
  169. data/spec/extensions/json_serializer_spec.rb +4 -5
  170. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  171. data/spec/extensions/list_spec.rb +17 -39
  172. data/spec/extensions/many_through_many_spec.rb +283 -250
  173. data/spec/extensions/migration_spec.rb +35 -32
  174. data/spec/extensions/named_timezones_spec.rb +23 -3
  175. data/spec/extensions/nested_attributes_spec.rb +97 -88
  176. data/spec/extensions/optimistic_locking_spec.rb +9 -20
  177. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  178. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  179. data/spec/extensions/prepared_statements_spec.rb +53 -0
  180. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  181. data/spec/extensions/pretty_table_spec.rb +1 -6
  182. data/spec/extensions/rcte_tree_spec.rb +41 -43
  183. data/spec/extensions/schema_dumper_spec.rb +5 -8
  184. data/spec/extensions/schema_spec.rb +13 -21
  185. data/spec/extensions/serialization_modification_detection_spec.rb +37 -0
  186. data/spec/extensions/serialization_spec.rb +72 -43
  187. data/spec/extensions/sharding_spec.rb +66 -140
  188. data/spec/extensions/single_table_inheritance_spec.rb +18 -29
  189. data/spec/extensions/spec_helper.rb +13 -61
  190. data/spec/extensions/sql_expr_spec.rb +20 -60
  191. data/spec/extensions/tactical_eager_loading_spec.rb +9 -19
  192. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  193. data/spec/extensions/timestamps_spec.rb +6 -6
  194. data/spec/extensions/to_dot_spec.rb +4 -7
  195. data/spec/extensions/touch_spec.rb +13 -14
  196. data/spec/extensions/tree_spec.rb +11 -26
  197. data/spec/extensions/typecast_on_load_spec.rb +1 -6
  198. data/spec/extensions/update_primary_key_spec.rb +30 -24
  199. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  200. data/spec/extensions/validation_helpers_spec.rb +16 -35
  201. data/spec/extensions/xml_serializer_spec.rb +16 -4
  202. data/spec/integration/associations_test.rb +537 -21
  203. data/spec/integration/database_test.rb +4 -2
  204. data/spec/integration/dataset_test.rb +461 -65
  205. data/spec/integration/eager_loader_test.rb +19 -21
  206. data/spec/integration/model_test.rb +80 -1
  207. data/spec/integration/plugin_test.rb +304 -116
  208. data/spec/integration/prepared_statement_test.rb +212 -122
  209. data/spec/integration/schema_test.rb +161 -30
  210. data/spec/integration/spec_helper.rb +39 -30
  211. data/spec/integration/timezone_test.rb +38 -12
  212. data/spec/integration/transaction_test.rb +172 -5
  213. data/spec/integration/type_test.rb +17 -3
  214. data/spec/model/association_reflection_spec.rb +201 -7
  215. data/spec/model/associations_spec.rb +865 -662
  216. data/spec/model/base_spec.rb +275 -95
  217. data/spec/model/dataset_methods_spec.rb +7 -27
  218. data/spec/model/eager_loading_spec.rb +677 -676
  219. data/spec/model/hooks_spec.rb +309 -67
  220. data/spec/model/model_spec.rb +222 -168
  221. data/spec/model/plugins_spec.rb +24 -13
  222. data/spec/model/record_spec.rb +381 -218
  223. data/spec/model/spec_helper.rb +13 -71
  224. data/spec/model/validations_spec.rb +11 -0
  225. metadata +115 -73
@@ -1,7 +1,7 @@
1
1
  module Sequel
2
2
  class Database
3
3
  # ---------------------
4
- # :section: Methods that modify the database schema
4
+ # :section: 2 - Methods that modify the database schema
5
5
  # These methods execute code on the database that modifies the database's schema.
6
6
  # ---------------------
7
7
 
@@ -21,7 +21,7 @@ module Sequel
21
21
  UNSIGNED = ' UNSIGNED'.freeze
22
22
 
23
23
  # The order of column modifiers to use when defining a column.
24
- COLUMN_DEFINITION_ORDER = [:default, :null, :unique, :primary_key, :auto_increment, :references]
24
+ COLUMN_DEFINITION_ORDER = [:collate, :default, :null, :unique, :primary_key, :auto_increment, :references]
25
25
 
26
26
  # Adds a column to the specified table. This method expects a column name,
27
27
  # a datatype and optionally a hash with additional constraints and options:
@@ -29,7 +29,7 @@ module Sequel
29
29
  # DB.add_column :items, :name, :text, :unique => true, :null => false
30
30
  # DB.add_column :items, :category, :text, :default => 'ruby'
31
31
  #
32
- # See alter_table.
32
+ # See <tt>alter_table</tt>.
33
33
  def add_column(table, *args)
34
34
  alter_table(table) {add_column(*args)}
35
35
  end
@@ -40,9 +40,9 @@ module Sequel
40
40
  # DB.add_index :posts, [:author, :title], :unique => true
41
41
  #
42
42
  # Options:
43
- # * :ignore_errors - Ignore any DatabaseErrors that are raised
43
+ # :ignore_errors :: Ignore any DatabaseErrors that are raised
44
44
  #
45
- # See alter_table.
45
+ # See <tt>alter_table</tt>.
46
46
  def add_index(table, columns, options={})
47
47
  e = options[:ignore_errors]
48
48
  begin
@@ -65,17 +65,17 @@ module Sequel
65
65
  # end
66
66
  #
67
67
  # Note that +add_column+ accepts all the options available for column
68
- # definitions using create_table, and +add_index+ accepts all the options
68
+ # definitions using <tt>create_table</tt>, and +add_index+ accepts all the options
69
69
  # available for index definition.
70
70
  #
71
- # See Schema::AlterTableGenerator and the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
71
+ # See <tt>Schema::AlterTableGenerator</tt> and the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
72
72
  def alter_table(name, generator=nil, &block)
73
73
  generator ||= Schema::AlterTableGenerator.new(self, &block)
74
- alter_table_sql_list(name, generator.operations).flatten.each {|sql| execute_ddl(sql)}
75
74
  remove_cached_schema(name)
75
+ apply_alter_table(name, generator.operations)
76
76
  nil
77
77
  end
78
-
78
+
79
79
  # Creates a table with the columns given in the provided block:
80
80
  #
81
81
  # DB.create_table :posts do
@@ -89,7 +89,7 @@ module Sequel
89
89
  # :temp :: Create the table as a temporary table.
90
90
  # :ignore_index_errors :: Ignore any errors when creating indexes.
91
91
  #
92
- # See Schema::Generator and the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
92
+ # See <tt>Schema::Generator</tt> and the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
93
93
  def create_table(name, options={}, &block)
94
94
  remove_cached_schema(name)
95
95
  options = {:generator=>options} if options.is_a?(Schema::Generator)
@@ -99,19 +99,28 @@ module Sequel
99
99
  nil
100
100
  end
101
101
 
102
- # Forcibly creates a table, attempting to drop it unconditionally (and catching any errors), then creating it.
102
+ # Forcibly create a table, attempting to drop it if it already exists, then creating it.
103
103
  #
104
104
  # DB.create_table!(:a){Integer :a}
105
- # # DROP TABLE a
105
+ # # SELECT * FROM a LIMIT a -- check existence
106
+ # # DROP TABLE a -- drop table if already exists
106
107
  # # CREATE TABLE a (a integer)
107
108
  def create_table!(name, options={}, &block)
108
- drop_table(name) rescue nil
109
+ drop_table(name) if table_exists?(name)
109
110
  create_table(name, options, &block)
110
111
  end
111
112
 
112
- # Creates the table unless the table already exists
113
+ # Creates the table unless the table already exists.
114
+ #
115
+ # DB.create_table?(:a){Integer :a}
116
+ # # SELECT * FROM a LIMIT a -- check existence
117
+ # # CREATE TABLE a (a integer) -- if it doesn't already exist
113
118
  def create_table?(name, options={}, &block)
114
- create_table(name, options, &block) unless table_exists?(name)
119
+ if supports_create_table_if_not_exists?
120
+ create_table(name, options.merge(:if_not_exists=>true), &block)
121
+ elsif !table_exists?(name)
122
+ create_table(name, options, &block)
123
+ end
115
124
  end
116
125
 
117
126
  # Creates a view, replacing it if it already exists:
@@ -138,7 +147,7 @@ module Sequel
138
147
  #
139
148
  # DB.drop_column :items, :category
140
149
  #
141
- # See alter_table.
150
+ # See <tt>alter_table</tt>.
142
151
  def drop_column(table, *args)
143
152
  alter_table(table) {drop_column(*args)}
144
153
  end
@@ -148,17 +157,20 @@ module Sequel
148
157
  # DB.drop_index :posts, :title
149
158
  # DB.drop_index :posts, [:author, :title]
150
159
  #
151
- # See alter_table.
160
+ # See <tt>alter_table</tt>.
152
161
  def drop_index(table, columns, options={})
153
162
  alter_table(table){drop_index(columns, options)}
154
163
  end
155
164
 
156
165
  # Drops one or more tables corresponding to the given names:
157
166
  #
167
+ # DB.drop_table(:posts)
158
168
  # DB.drop_table(:posts, :comments)
169
+ # DB.drop_table(:posts, :comments, :cascade=>true)
159
170
  def drop_table(*names)
171
+ options = names.last.is_a?(Hash) ? names.pop : {}
160
172
  names.each do |n|
161
- execute_ddl(drop_table_sql(n))
173
+ execute_ddl(drop_table_sql(n, options))
162
174
  remove_cached_schema(n)
163
175
  end
164
176
  nil
@@ -167,9 +179,12 @@ module Sequel
167
179
  # Drops one or more views corresponding to the given names:
168
180
  #
169
181
  # DB.drop_view(:cheap_items)
182
+ # DB.drop_view(:cheap_items, :pricey_items)
183
+ # DB.drop_view(:cheap_items, :pricey_items, :cascade=>true)
170
184
  def drop_view(*names)
185
+ options = names.last.is_a?(Hash) ? names.pop : {}
171
186
  names.each do |n|
172
- execute_ddl("DROP VIEW #{quote_schema_table(n)}")
187
+ execute_ddl(drop_view_sql(n, options))
173
188
  remove_cached_schema(n)
174
189
  end
175
190
  nil
@@ -191,7 +206,7 @@ module Sequel
191
206
  #
192
207
  # DB.rename_column :items, :cntr, :counter
193
208
  #
194
- # See alter_table.
209
+ # See <tt>alter_table</tt>.
195
210
  def rename_column(table, *args)
196
211
  alter_table(table) {rename_column(*args)}
197
212
  end
@@ -200,7 +215,7 @@ module Sequel
200
215
  #
201
216
  # DB.set_column_default :items, :category, 'perl!'
202
217
  #
203
- # See alter_table.
218
+ # See <tt>alter_table</tt>.
204
219
  def set_column_default(table, *args)
205
220
  alter_table(table) {set_column_default(*args)}
206
221
  end
@@ -209,13 +224,18 @@ module Sequel
209
224
  #
210
225
  # DB.set_column_type :items, :price, :float
211
226
  #
212
- # See alter_table.
227
+ # See <tt>alter_table</tt>.
213
228
  def set_column_type(table, *args)
214
229
  alter_table(table) {set_column_type(*args)}
215
230
  end
216
231
 
217
232
  private
218
233
 
234
+ # Apply the changes in the given alter table ops to the table given by name.
235
+ def apply_alter_table(name, ops)
236
+ alter_table_sql_list(name, ops).flatten.each{|sql| execute_ddl(sql)}
237
+ end
238
+
219
239
  # The SQL to execute to modify the DDL for the given table name. op
220
240
  # should be one of the operations returned by the AlterTableGenerator.
221
241
  def alter_table_sql(table, op)
@@ -224,7 +244,7 @@ module Sequel
224
244
  when :add_column
225
245
  "ADD COLUMN #{column_definition_sql(op)}"
226
246
  when :drop_column
227
- "DROP COLUMN #{quoted_name}"
247
+ "DROP COLUMN #{quoted_name}#{' CASCADE' if op[:cascade]}"
228
248
  when :rename_column
229
249
  "RENAME COLUMN #{quoted_name} TO #{quote_identifier(op[:new_name])}"
230
250
  when :set_column_type
@@ -240,7 +260,7 @@ module Sequel
240
260
  when :add_constraint
241
261
  "ADD #{constraint_definition_sql(op)}"
242
262
  when :drop_constraint
243
- "DROP CONSTRAINT #{quoted_name}"
263
+ "DROP CONSTRAINT #{quoted_name}#{' CASCADE' if op[:cascade]}"
244
264
  else
245
265
  raise Error, "Unsupported ALTER TABLE operation"
246
266
  end
@@ -275,7 +295,12 @@ module Sequel
275
295
  def column_definition_auto_increment_sql(sql, column)
276
296
  sql << " #{auto_increment_sql}" if column[:auto_increment]
277
297
  end
278
-
298
+
299
+ # Add collate SQL fragment to column creation SQL.
300
+ def column_definition_collate_sql(sql, column)
301
+ sql << " COLLATE #{column[:collate]}" if column[:collate]
302
+ end
303
+
279
304
  # Add default SQL fragment to column creation SQL.
280
305
  def column_definition_default_sql(sql, column)
281
306
  sql << " DEFAULT #{literal(column[:default])}" if column.include?(:default)
@@ -354,7 +379,7 @@ module Sequel
354
379
 
355
380
  # Execute the create index statements using the generator.
356
381
  def create_table_indexes_from_generator(name, generator, options)
357
- e = options[:ignore_index_errors]
382
+ e = options[:ignore_index_errors] || options[:if_not_exists]
358
383
  generator.indexes.each do |index|
359
384
  begin
360
385
  index_sql_list(name, [index]).each{|sql| execute_ddl(sql)}
@@ -366,7 +391,7 @@ module Sequel
366
391
 
367
392
  # DDL statement for creating a table with the given name, columns, and options
368
393
  def create_table_sql(name, generator, options)
369
- "CREATE #{temporary_table_sql if options[:temp]}TABLE #{quote_schema_table(name)} (#{column_list_sql(generator)})"
394
+ "CREATE #{temporary_table_sql if options[:temp]}TABLE#{' IF NOT EXISTS' if options[:if_not_exists]} #{options[:temp] ? quote_identifier(name) : quote_schema_table(name)} (#{column_list_sql(generator)})"
370
395
  end
371
396
 
372
397
  # Default index name for the table and columns, may be too long
@@ -382,10 +407,15 @@ module Sequel
382
407
  end
383
408
 
384
409
  # SQL DDL statement to drop the table with the given name.
385
- def drop_table_sql(name)
386
- "DROP TABLE #{quote_schema_table(name)}"
410
+ def drop_table_sql(name, options)
411
+ "DROP TABLE #{quote_schema_table(name)}#{' CASCADE' if options[:cascade]}"
387
412
  end
388
413
 
414
+ # SQL DDL statement to drop a view with the given name.
415
+ def drop_view_sql(name, options)
416
+ "DROP VIEW #{quote_schema_table(name)}#{' CASCADE' if options[:cascade]}"
417
+ end
418
+
389
419
  # Proxy the filter_expr call to the dataset, used for creating constraints.
390
420
  def filter_expr(*args, &block)
391
421
  schema_utility_dataset.literal(schema_utility_dataset.send(:filter_expr, *args, &block))