sequel 3.21.0 → 3.39.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 (352) hide show
  1. data/CHANGELOG +1061 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +103 -63
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +67 -51
  7. data/doc/advanced_associations.rdoc +189 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/cheat_sheet.rdoc +21 -21
  10. data/doc/core_extensions.rdoc +374 -0
  11. data/doc/dataset_basics.rdoc +10 -10
  12. data/doc/dataset_filtering.rdoc +54 -42
  13. data/doc/mass_assignment.rdoc +56 -0
  14. data/doc/migration.rdoc +89 -557
  15. data/doc/model_hooks.rdoc +80 -29
  16. data/doc/object_model.rdoc +547 -0
  17. data/doc/opening_databases.rdoc +114 -53
  18. data/doc/prepared_statements.rdoc +41 -15
  19. data/doc/querying.rdoc +137 -56
  20. data/doc/reflection.rdoc +36 -10
  21. data/doc/release_notes/3.22.0.txt +39 -0
  22. data/doc/release_notes/3.23.0.txt +172 -0
  23. data/doc/release_notes/3.24.0.txt +420 -0
  24. data/doc/release_notes/3.25.0.txt +88 -0
  25. data/doc/release_notes/3.26.0.txt +88 -0
  26. data/doc/release_notes/3.27.0.txt +82 -0
  27. data/doc/release_notes/3.28.0.txt +304 -0
  28. data/doc/release_notes/3.29.0.txt +459 -0
  29. data/doc/release_notes/3.30.0.txt +135 -0
  30. data/doc/release_notes/3.31.0.txt +146 -0
  31. data/doc/release_notes/3.32.0.txt +202 -0
  32. data/doc/release_notes/3.33.0.txt +157 -0
  33. data/doc/release_notes/3.34.0.txt +671 -0
  34. data/doc/release_notes/3.35.0.txt +144 -0
  35. data/doc/release_notes/3.36.0.txt +245 -0
  36. data/doc/release_notes/3.37.0.txt +338 -0
  37. data/doc/release_notes/3.38.0.txt +234 -0
  38. data/doc/release_notes/3.39.0.txt +237 -0
  39. data/doc/schema_modification.rdoc +585 -0
  40. data/doc/sharding.rdoc +99 -8
  41. data/doc/sql.rdoc +154 -112
  42. data/doc/testing.rdoc +169 -0
  43. data/doc/thread_safety.rdoc +17 -0
  44. data/doc/transactions.rdoc +137 -0
  45. data/doc/validations.rdoc +1 -1
  46. data/doc/virtual_rows.rdoc +78 -43
  47. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  48. data/lib/sequel/adapters/ado.rb +40 -18
  49. data/lib/sequel/adapters/amalgalite.rb +17 -9
  50. data/lib/sequel/adapters/db2.rb +175 -86
  51. data/lib/sequel/adapters/dbi.rb +15 -15
  52. data/lib/sequel/adapters/do/mysql.rb +17 -11
  53. data/lib/sequel/adapters/do/postgres.rb +2 -61
  54. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  55. data/lib/sequel/adapters/do.rb +18 -36
  56. data/lib/sequel/adapters/firebird.rb +27 -208
  57. data/lib/sequel/adapters/ibmdb.rb +453 -0
  58. data/lib/sequel/adapters/informix.rb +6 -23
  59. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  60. data/lib/sequel/adapters/jdbc/db2.rb +56 -0
  61. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  62. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  63. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  64. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  65. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  66. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  67. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  68. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  69. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  70. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  71. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  73. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  74. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  75. data/lib/sequel/adapters/jdbc.rb +279 -97
  76. data/lib/sequel/adapters/mock.rb +372 -0
  77. data/lib/sequel/adapters/mysql.rb +125 -222
  78. data/lib/sequel/adapters/mysql2.rb +65 -56
  79. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  80. data/lib/sequel/adapters/odbc.rb +28 -9
  81. data/lib/sequel/adapters/openbase.rb +3 -5
  82. data/lib/sequel/adapters/oracle.rb +349 -53
  83. data/lib/sequel/adapters/postgres.rb +368 -138
  84. data/lib/sequel/adapters/shared/access.rb +32 -9
  85. data/lib/sequel/adapters/shared/db2.rb +343 -0
  86. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  87. data/lib/sequel/adapters/shared/informix.rb +53 -0
  88. data/lib/sequel/adapters/shared/mssql.rb +401 -116
  89. data/lib/sequel/adapters/shared/mysql.rb +424 -89
  90. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  91. data/lib/sequel/adapters/shared/oracle.rb +257 -45
  92. data/lib/sequel/adapters/shared/postgres.rb +675 -279
  93. data/lib/sequel/adapters/shared/progress.rb +5 -8
  94. data/lib/sequel/adapters/shared/sqlite.rb +285 -96
  95. data/lib/sequel/adapters/sqlite.rb +101 -39
  96. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  97. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  98. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  99. data/lib/sequel/adapters/swift.rb +28 -19
  100. data/lib/sequel/adapters/tinytds.rb +174 -22
  101. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  102. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  103. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  104. data/lib/sequel/ast_transformer.rb +194 -0
  105. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  106. data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
  107. data/lib/sequel/connection_pool/single.rb +5 -0
  108. data/lib/sequel/connection_pool/threaded.rb +43 -14
  109. data/lib/sequel/connection_pool.rb +10 -2
  110. data/lib/sequel/core.rb +143 -11
  111. data/lib/sequel/database/connecting.rb +38 -28
  112. data/lib/sequel/database/dataset.rb +4 -4
  113. data/lib/sequel/database/dataset_defaults.rb +63 -2
  114. data/lib/sequel/database/logging.rb +7 -2
  115. data/lib/sequel/database/misc.rb +190 -46
  116. data/lib/sequel/database/query.rb +272 -110
  117. data/lib/sequel/database/schema_generator.rb +103 -36
  118. data/lib/sequel/database/schema_methods.rb +300 -67
  119. data/lib/sequel/dataset/actions.rb +344 -90
  120. data/lib/sequel/dataset/features.rb +101 -8
  121. data/lib/sequel/dataset/graph.rb +42 -15
  122. data/lib/sequel/dataset/misc.rb +52 -25
  123. data/lib/sequel/dataset/mutation.rb +12 -7
  124. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  125. data/lib/sequel/dataset/query.rb +305 -54
  126. data/lib/sequel/dataset/sql.rb +720 -292
  127. data/lib/sequel/dataset.rb +8 -0
  128. data/lib/sequel/exceptions.rb +4 -0
  129. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  130. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  131. data/lib/sequel/extensions/blank.rb +4 -0
  132. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  133. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  134. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  135. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  136. data/lib/sequel/extensions/inflector.rb +4 -0
  137. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  138. data/lib/sequel/extensions/migration.rb +100 -11
  139. data/lib/sequel/extensions/named_timezones.rb +9 -0
  140. data/lib/sequel/extensions/null_dataset.rb +94 -0
  141. data/lib/sequel/extensions/pagination.rb +4 -0
  142. data/lib/sequel/extensions/pg_array.rb +537 -0
  143. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  144. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  145. data/lib/sequel/extensions/pg_hstore.rb +313 -0
  146. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  147. data/lib/sequel/extensions/pg_inet.rb +113 -0
  148. data/lib/sequel/extensions/pg_interval.rb +191 -0
  149. data/lib/sequel/extensions/pg_json.rb +208 -0
  150. data/lib/sequel/extensions/pg_range.rb +512 -0
  151. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  152. data/lib/sequel/extensions/pg_row.rb +572 -0
  153. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  154. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  155. data/lib/sequel/extensions/pretty_table.rb +17 -72
  156. data/lib/sequel/extensions/query.rb +8 -4
  157. data/lib/sequel/extensions/query_literals.rb +79 -0
  158. data/lib/sequel/extensions/schema_caching.rb +76 -0
  159. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  160. data/lib/sequel/extensions/select_remove.rb +39 -0
  161. data/lib/sequel/extensions/server_block.rb +140 -0
  162. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  163. data/lib/sequel/extensions/sql_expr.rb +8 -110
  164. data/lib/sequel/extensions/string_date_time.rb +4 -0
  165. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  166. data/lib/sequel/extensions/to_dot.rb +99 -83
  167. data/lib/sequel/model/associations.rb +1263 -409
  168. data/lib/sequel/model/base.rb +624 -171
  169. data/lib/sequel/model/errors.rb +1 -1
  170. data/lib/sequel/model/exceptions.rb +24 -2
  171. data/lib/sequel/model/inflections.rb +1 -1
  172. data/lib/sequel/model.rb +30 -11
  173. data/lib/sequel/no_core_ext.rb +2 -0
  174. data/lib/sequel/plugins/active_model.rb +13 -1
  175. data/lib/sequel/plugins/association_pks.rb +22 -4
  176. data/lib/sequel/plugins/caching.rb +25 -18
  177. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  178. data/lib/sequel/plugins/composition.rb +44 -12
  179. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  180. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  181. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  182. data/lib/sequel/plugins/dirty.rb +214 -0
  183. data/lib/sequel/plugins/eager_each.rb +59 -0
  184. data/lib/sequel/plugins/force_encoding.rb +6 -6
  185. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  186. data/lib/sequel/plugins/identity_map.rb +134 -15
  187. data/lib/sequel/plugins/instance_filters.rb +10 -0
  188. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  189. data/lib/sequel/plugins/json_serializer.rb +58 -6
  190. data/lib/sequel/plugins/list.rb +13 -2
  191. data/lib/sequel/plugins/many_through_many.rb +103 -51
  192. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  193. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  194. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  195. data/lib/sequel/plugins/pg_row.rb +121 -0
  196. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  197. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  198. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  199. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  200. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  201. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  202. data/lib/sequel/plugins/schema.rb +8 -3
  203. data/lib/sequel/plugins/serialization.rb +98 -49
  204. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  205. data/lib/sequel/plugins/sharding.rb +21 -54
  206. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  207. data/lib/sequel/plugins/static_cache.rb +99 -0
  208. data/lib/sequel/plugins/subclasses.rb +29 -3
  209. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  210. data/lib/sequel/plugins/timestamps.rb +1 -1
  211. data/lib/sequel/plugins/tree.rb +3 -3
  212. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  213. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  214. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  215. data/lib/sequel/plugins/validation_helpers.rb +55 -4
  216. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  217. data/lib/sequel/sql.rb +649 -122
  218. data/lib/sequel/timezones.rb +67 -40
  219. data/lib/sequel/version.rb +1 -1
  220. data/spec/adapters/db2_spec.rb +146 -0
  221. data/spec/adapters/firebird_spec.rb +1 -1
  222. data/spec/adapters/mssql_spec.rb +194 -66
  223. data/spec/adapters/mysql_spec.rb +475 -306
  224. data/spec/adapters/oracle_spec.rb +92 -117
  225. data/spec/adapters/postgres_spec.rb +1982 -325
  226. data/spec/adapters/spec_helper.rb +9 -6
  227. data/spec/adapters/sqlite_spec.rb +203 -75
  228. data/spec/core/connection_pool_spec.rb +218 -93
  229. data/spec/core/database_spec.rb +956 -522
  230. data/spec/core/dataset_spec.rb +1631 -1242
  231. data/spec/core/expression_filters_spec.rb +690 -334
  232. data/spec/core/mock_adapter_spec.rb +453 -0
  233. data/spec/core/object_graph_spec.rb +88 -129
  234. data/spec/core/schema_generator_spec.rb +4 -4
  235. data/spec/core/schema_spec.rb +556 -53
  236. data/spec/core/spec_helper.rb +7 -48
  237. data/spec/core_extensions_spec.rb +626 -0
  238. data/spec/extensions/active_model_spec.rb +13 -0
  239. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  240. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  241. data/spec/extensions/association_dependencies_spec.rb +15 -25
  242. data/spec/extensions/association_pks_spec.rb +66 -32
  243. data/spec/extensions/association_proxies_spec.rb +4 -4
  244. data/spec/extensions/boolean_readers_spec.rb +25 -25
  245. data/spec/extensions/caching_spec.rb +47 -51
  246. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  247. data/spec/extensions/columns_introspection_spec.rb +91 -0
  248. data/spec/extensions/composition_spec.rb +18 -13
  249. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  250. data/spec/extensions/constraint_validations_spec.rb +316 -0
  251. data/spec/extensions/dataset_associations_spec.rb +199 -0
  252. data/spec/extensions/defaults_setter_spec.rb +88 -0
  253. data/spec/extensions/dirty_spec.rb +155 -0
  254. data/spec/extensions/eager_each_spec.rb +34 -0
  255. data/spec/extensions/eval_inspect_spec.rb +67 -0
  256. data/spec/extensions/force_encoding_spec.rb +4 -2
  257. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  258. data/spec/extensions/identity_map_spec.rb +142 -24
  259. data/spec/extensions/inflector_spec.rb +0 -4
  260. data/spec/extensions/instance_filters_spec.rb +11 -21
  261. data/spec/extensions/instance_hooks_spec.rb +72 -0
  262. data/spec/extensions/json_serializer_spec.rb +49 -12
  263. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  264. data/spec/extensions/list_spec.rb +49 -40
  265. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  266. data/spec/extensions/many_through_many_spec.rb +368 -254
  267. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  268. data/spec/extensions/migration_spec.rb +140 -35
  269. data/spec/extensions/named_timezones_spec.rb +29 -11
  270. data/spec/extensions/nested_attributes_spec.rb +268 -89
  271. data/spec/extensions/null_dataset_spec.rb +85 -0
  272. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  273. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  274. data/spec/extensions/pg_array_spec.rb +320 -0
  275. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  276. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  277. data/spec/extensions/pg_hstore_spec.rb +194 -0
  278. data/spec/extensions/pg_inet_spec.rb +47 -0
  279. data/spec/extensions/pg_interval_spec.rb +72 -0
  280. data/spec/extensions/pg_json_spec.rb +99 -0
  281. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  282. data/spec/extensions/pg_range_spec.rb +395 -0
  283. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  284. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  285. data/spec/extensions/pg_row_spec.rb +323 -0
  286. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  287. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  288. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  289. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  290. data/spec/extensions/prepared_statements_spec.rb +87 -0
  291. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  292. data/spec/extensions/pretty_table_spec.rb +7 -6
  293. data/spec/extensions/query_literals_spec.rb +167 -0
  294. data/spec/extensions/query_spec.rb +9 -3
  295. data/spec/extensions/rcte_tree_spec.rb +50 -43
  296. data/spec/extensions/schema_caching_spec.rb +41 -0
  297. data/spec/extensions/schema_dumper_spec.rb +434 -49
  298. data/spec/extensions/schema_spec.rb +30 -49
  299. data/spec/extensions/select_remove_spec.rb +38 -0
  300. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  301. data/spec/extensions/serialization_spec.rb +86 -48
  302. data/spec/extensions/server_block_spec.rb +90 -0
  303. data/spec/extensions/sharding_spec.rb +69 -143
  304. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  305. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  306. data/spec/extensions/spec_helper.rb +34 -67
  307. data/spec/extensions/split_array_nil_spec.rb +24 -0
  308. data/spec/extensions/sql_expr_spec.rb +29 -60
  309. data/spec/extensions/static_cache_spec.rb +145 -0
  310. data/spec/extensions/subclasses_spec.rb +14 -0
  311. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  312. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  313. data/spec/extensions/timestamps_spec.rb +6 -6
  314. data/spec/extensions/to_dot_spec.rb +8 -11
  315. data/spec/extensions/touch_spec.rb +13 -14
  316. data/spec/extensions/tree_spec.rb +11 -26
  317. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  318. data/spec/extensions/update_primary_key_spec.rb +30 -24
  319. data/spec/extensions/validation_class_methods_spec.rb +58 -67
  320. data/spec/extensions/validation_helpers_spec.rb +31 -37
  321. data/spec/extensions/xml_serializer_spec.rb +29 -4
  322. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  323. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  324. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  325. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  326. data/spec/integration/associations_test.rb +659 -21
  327. data/spec/integration/database_test.rb +11 -5
  328. data/spec/integration/dataset_test.rb +717 -129
  329. data/spec/integration/eager_loader_test.rb +38 -54
  330. data/spec/integration/migrator_test.rb +2 -3
  331. data/spec/integration/model_test.rb +81 -2
  332. data/spec/integration/plugin_test.rb +604 -147
  333. data/spec/integration/prepared_statement_test.rb +272 -128
  334. data/spec/integration/schema_test.rb +367 -57
  335. data/spec/integration/spec_helper.rb +42 -32
  336. data/spec/integration/timezone_test.rb +38 -12
  337. data/spec/integration/transaction_test.rb +183 -8
  338. data/spec/integration/type_test.rb +31 -8
  339. data/spec/model/association_reflection_spec.rb +207 -8
  340. data/spec/model/associations_spec.rb +1206 -693
  341. data/spec/model/base_spec.rb +334 -100
  342. data/spec/model/dataset_methods_spec.rb +45 -27
  343. data/spec/model/eager_loading_spec.rb +828 -692
  344. data/spec/model/hooks_spec.rb +355 -67
  345. data/spec/model/model_spec.rb +251 -179
  346. data/spec/model/plugins_spec.rb +24 -13
  347. data/spec/model/record_spec.rb +506 -232
  348. data/spec/model/spec_helper.rb +16 -77
  349. data/spec/model/validations_spec.rb +38 -2
  350. data/spec/rcov.opts +2 -0
  351. metadata +209 -80
  352. data/spec/core/core_sql_spec.rb +0 -451
@@ -1,35 +1,59 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
- if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
4
3
  describe "Database schema parser" do
5
4
  before do
6
5
  @iom = INTEGRATION_DB.identifier_output_method
7
6
  @iim = INTEGRATION_DB.identifier_input_method
8
7
  @defsch = INTEGRATION_DB.default_schema
9
- clear_sqls
8
+ @qi = INTEGRATION_DB.quote_identifiers?
10
9
  end
11
10
  after do
12
11
  INTEGRATION_DB.identifier_output_method = @iom
13
12
  INTEGRATION_DB.identifier_input_method = @iim
14
13
  INTEGRATION_DB.default_schema = @defsch
15
- INTEGRATION_DB.drop_table(:items) if INTEGRATION_DB.table_exists?(:items)
14
+ INTEGRATION_DB.quote_identifiers = @qi
15
+ INTEGRATION_DB.drop_table?(:items)
16
16
  end
17
17
 
18
- specify "should handle a database with a identifier_output_method" do
18
+ specify "should handle a database with a identifier methods" do
19
19
  INTEGRATION_DB.identifier_output_method = :reverse
20
20
  INTEGRATION_DB.identifier_input_method = :reverse
21
+ INTEGRATION_DB.quote_identifiers = true
21
22
  INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
22
23
  INTEGRATION_DB.create_table!(:items){Integer :number}
23
- INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
24
- INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
24
+ begin
25
+ INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
26
+ INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
27
+ ensure
28
+ INTEGRATION_DB.drop_table(:items)
29
+ end
30
+ end
31
+
32
+ specify "should handle a dataset with identifier methods different than the database's" do
33
+ INTEGRATION_DB.identifier_output_method = :reverse
34
+ INTEGRATION_DB.identifier_input_method = :reverse
35
+ INTEGRATION_DB.quote_identifiers = true
36
+ INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
37
+ INTEGRATION_DB.create_table!(:items){Integer :number}
38
+ INTEGRATION_DB.identifier_output_method = @iom
39
+ INTEGRATION_DB.identifier_input_method = @iim
40
+ ds = INTEGRATION_DB[:items]
41
+ ds.identifier_output_method = :reverse
42
+ ds.identifier_input_method = :reverse
43
+ begin
44
+ INTEGRATION_DB.schema(ds, :reload=>true).should be_a_kind_of(Array)
45
+ INTEGRATION_DB.schema(ds, :reload=>true).first.first.should == :number
46
+ ensure
47
+ INTEGRATION_DB.identifier_output_method = :reverse
48
+ INTEGRATION_DB.identifier_input_method = :reverse
49
+ INTEGRATION_DB.drop_table(:items)
50
+ end
25
51
  end
26
52
 
27
53
  specify "should not issue an sql query if the schema has been loaded unless :reload is true" do
28
54
  INTEGRATION_DB.create_table!(:items){Integer :number}
29
55
  INTEGRATION_DB.schema(:items, :reload=>true)
30
- clear_sqls
31
56
  INTEGRATION_DB.schema(:items)
32
- clear_sqls
33
57
  INTEGRATION_DB.schema(:items, :reload=>true)
34
58
  end
35
59
 
@@ -56,11 +80,10 @@ describe "Database schema parser" do
56
80
  col_info = col.last
57
81
  col_info.should be_a_kind_of(Hash)
58
82
  col_info[:type].should == :integer
59
- clear_sqls
60
83
  INTEGRATION_DB.schema(:items)
61
84
  end
62
85
 
63
- cspecify "should parse primary keys from the schema properly", [proc{|db| db.adapter_scheme != :jdbc}, :mssql] do
86
+ specify "should parse primary keys from the schema properly" do
64
87
  INTEGRATION_DB.create_table!(:items){Integer :number}
65
88
  INTEGRATION_DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == []
66
89
  INTEGRATION_DB.create_table!(:items){primary_key :number}
@@ -85,7 +108,17 @@ describe "Database schema parser" do
85
108
  INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
86
109
  end
87
110
 
88
- specify "should parse types from the schema properly" do
111
+ specify "should parse current timestamp defaults from the schema properly" do
112
+ INTEGRATION_DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
113
+ INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_TIMESTAMP
114
+ end
115
+
116
+ cspecify "should parse current date defaults from the schema properly", :mysql, :oracle do
117
+ INTEGRATION_DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
118
+ INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_DATE
119
+ end
120
+
121
+ cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
89
122
  INTEGRATION_DB.create_table!(:items){Integer :number}
90
123
  INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
91
124
  INTEGRATION_DB.create_table!(:items){Fixnum :number}
@@ -113,17 +146,20 @@ describe "Database schema parser" do
113
146
  INTEGRATION_DB.create_table!(:items){FalseClass :number}
114
147
  INTEGRATION_DB.schema(:items).first.last[:type].should == :boolean
115
148
  end
116
- end
117
- end
149
+ end if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
118
150
 
119
- begin
120
- INTEGRATION_DB.drop_table(:blah) rescue nil
151
+ test_indexes = begin
152
+ INTEGRATION_DB.drop_table?(:blah)
121
153
  INTEGRATION_DB.indexes(:blah)
154
+ true
122
155
  rescue Sequel::NotImplemented
156
+ false
123
157
  rescue
158
+ true
159
+ end
124
160
  describe "Database index parsing" do
125
161
  after do
126
- INTEGRATION_DB.drop_table(:items)
162
+ INTEGRATION_DB.drop_table?(:items)
127
163
  end
128
164
 
129
165
  specify "should parse indexes into a hash" do
@@ -149,17 +185,73 @@ describe "Database index parsing" do
149
185
  INTEGRATION_DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
150
186
  INTEGRATION_DB.indexes(:items).should == {}
151
187
  end
188
+ end if test_indexes
189
+
190
+ test_foreign_key_list = begin
191
+ INTEGRATION_DB.drop_table?(:blah)
192
+ INTEGRATION_DB.foreign_key_list(:blah)
193
+ true
194
+ rescue Sequel::NotImplemented
195
+ false
196
+ rescue
197
+ true
152
198
  end
153
- end
199
+ describe "Database foreign key parsing" do
200
+ before do
201
+ @db = INTEGRATION_DB
202
+ @pr = lambda do |table, *expected|
203
+ actual = @db.foreign_key_list(table).sort_by{|c| c[:columns].map{|s| s.to_s}.join << (c[:key]||[]).map{|s| s.to_s}.join}.map{|v| v.values_at(:columns, :table, :key)}
204
+ actual.zip(expected).each do |a, e|
205
+ if e.last.first == :pk
206
+ if a.last == nil
207
+ a.pop
208
+ e.pop
209
+ else
210
+ e.last.shift
211
+ end
212
+ end
213
+ a.should == e
214
+ end
215
+ actual.length.should == expected.length
216
+ end
217
+ end
218
+ after do
219
+ @db.drop_table?(:b, :a)
220
+ end
221
+
222
+ specify "should parse foreign key information into an array of hashes" do
223
+ @db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d; index :d, :unique=>true}
224
+ @db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
225
+ @pr[:a]
226
+ @pr[:b, [[:e], :a, [:pk, :c]]]
227
+
228
+ @db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
229
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
230
+
231
+ @db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
232
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
233
+
234
+ @db.alter_table(:a){add_index [:d, :c], :unique=>true}
235
+ @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
236
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
237
+ end
238
+
239
+ specify "should handle composite foreign and primary keys" do
240
+ @db.create_table!(:a, :engine=>:InnoDB){Integer :b; Integer :c; primary_key [:b, :c]; index [:c, :b], :unique=>true}
241
+ @db.create_table!(:b, :engine=>:InnoDB){Integer :e; Integer :f; foreign_key [:e, :f], :a; foreign_key [:f, :e], :a, :key=>[:c, :b]}
242
+ @pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:f, :e], :a, [:c, :b]]]
243
+ end
244
+ end if test_foreign_key_list
154
245
 
155
246
  describe "Database schema modifiers" do
156
247
  before do
157
248
  @db = INTEGRATION_DB
158
249
  @ds = @db[:items]
159
- clear_sqls
160
250
  end
161
251
  after do
162
- @db.drop_table(:items) if @db.table_exists?(:items)
252
+ # Use instead of drop_table? to work around issues on jdbc/db2
253
+ @db.drop_table(:items) rescue nil
254
+ @db.drop_table(:items2) rescue nil
163
255
  end
164
256
 
165
257
  specify "should create tables correctly" do
@@ -170,12 +262,60 @@ describe "Database schema modifiers" do
170
262
  @ds.columns!.should == [:number]
171
263
  end
172
264
 
265
+ specify "should create tables from select statements correctly" do
266
+ @db.create_table!(:items){Integer :number}
267
+ @ds.insert([10])
268
+ @db.create_table(:items2, :as=>@db[:items])
269
+ @db.schema(:items2, :reload=>true).map{|x| x.first}.should == [:number]
270
+ @db[:items2].columns.should == [:number]
271
+ @db[:items2].all.should == [{:number=>10}]
272
+ end
273
+
274
+ specify "should handle create table in a rolled back transaction" do
275
+ @db.drop_table?(:items)
276
+ @db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
277
+ @db.table_exists?(:items).should be_false
278
+ end if INTEGRATION_DB.supports_transactional_ddl?
279
+
280
+ describe "join tables" do
281
+ after do
282
+ @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
283
+ @db.drop_table(:cats, :dogs)
284
+ @db.table_exists?(:cats_dogs).should == false
285
+ end
286
+
287
+ specify "should create join tables correctly" do
288
+ @db.create_table!(:cats){primary_key :id}
289
+ @db.create_table!(:dogs){primary_key :id}
290
+ @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
291
+ @db.table_exists?(:cats_dogs).should == true
292
+ end
293
+ end
294
+
173
295
  specify "should create temporary tables without raising an exception" do
174
296
  @db.create_table!(:items, :temp=>true){Integer :number}
175
297
  end
176
298
 
299
+ specify "should have create_table? only create the table if it doesn't already exist" do
300
+ @db.create_table!(:items){String :a}
301
+ @db.create_table?(:items){String :b}
302
+ @db[:items].columns.should == [:a]
303
+ @db.drop_table?(:items)
304
+ @db.create_table?(:items){String :b}
305
+ @db[:items].columns.should == [:b]
306
+ end
307
+
308
+ specify "should have create_table? work correctly with indexes" do
309
+ @db.create_table!(:items){String :a, :index=>true}
310
+ @db.create_table?(:items){String :b, :index=>true}
311
+ @db[:items].columns.should == [:a]
312
+ @db.drop_table?(:items)
313
+ @db.create_table?(:items){String :b, :index=>true}
314
+ @db[:items].columns.should == [:b]
315
+ end
316
+
177
317
  specify "should rename tables correctly" do
178
- @db.drop_table(:items) rescue nil
318
+ @db.drop_table?(:items)
179
319
  @db.create_table!(:items2){Integer :number}
180
320
  @db.rename_table(:items2, :items)
181
321
  @db.table_exists?(:items).should == true
@@ -215,24 +355,34 @@ describe "Database schema modifiers" do
215
355
  specify "should add columns to tables correctly" do
216
356
  @db.create_table!(:items){Integer :number}
217
357
  @ds.insert(:number=>10)
218
- @db.alter_table(:items){add_column :name, :text}
358
+ @db.alter_table(:items){add_column :name, String}
219
359
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name]
220
360
  @ds.columns!.should == [:number, :name]
221
361
  @ds.all.should == [{:number=>10, :name=>nil}]
222
362
  end
223
363
 
224
- cspecify "should add primary key columns to tables correctly", :h2 do
364
+ cspecify "should add primary key columns to tables correctly", :h2, :derby do
225
365
  @db.create_table!(:items){Integer :number}
226
366
  @ds.insert(:number=>10)
227
367
  @db.alter_table(:items){add_primary_key :id}
228
368
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :id]
229
369
  @ds.columns!.should == [:number, :id]
230
370
  @ds.map(:number).should == [10]
371
+ proc{@ds.insert(:id=>@ds.map(:id).first)}.should raise_error
372
+ end
373
+
374
+ specify "should drop primary key constraints from tables correctly" do
375
+ @db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
376
+ @ds.insert(:number=>10)
377
+ @db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
378
+ @ds.map(:number).should == [10]
379
+ proc{@ds.insert(10)}.should_not raise_error
231
380
  end
232
381
 
233
382
  specify "should add foreign key columns to tables correctly" do
234
383
  @db.create_table!(:items){primary_key :id}
235
- i = @ds.insert
384
+ @ds.insert
385
+ i = @ds.get(:id)
236
386
  @db.alter_table(:items){add_foreign_key :item_id, :items}
237
387
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
238
388
  @ds.columns!.should == [:id, :item_id]
@@ -269,7 +419,22 @@ describe "Database schema modifiers" do
269
419
  proc{@ds.insert(:n=>nil)}.should raise_error(Sequel::DatabaseError)
270
420
  end
271
421
 
272
- specify "should set column NULL/NOT NULL correctly" do
422
+ specify "should rename columns when the table is referenced by a foreign key" do
423
+ begin
424
+ @db.create_table!(:itemsfk){primary_key :id; Integer :a}
425
+ @db.create_table!(:items){foreign_key :id, :itemsfk}
426
+ @db[:itemsfk].insert(:a=>10)
427
+ @ds.insert(:id=>1)
428
+ @db.alter_table(:itemsfk){rename_column :a, :b}
429
+ @db[:itemsfk].insert(:b=>20)
430
+ @ds.insert(:id=>2)
431
+ @db[:itemsfk].select_order_map([:id, :b]).should == [[1, 10], [2, 20]]
432
+ ensure
433
+ @db.drop_table(:items, :itemsfk)
434
+ end
435
+ end
436
+
437
+ cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
273
438
  @db.create_table!(:items, :engine=>:InnoDB){Integer :id}
274
439
  @ds.insert(:id=>10)
275
440
  @db.alter_table(:items){set_column_allow_null :id, false}
@@ -277,7 +442,7 @@ describe "Database schema modifiers" do
277
442
  @ds.columns!.should == [:id]
278
443
  proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
279
444
  @db.alter_table(:items){set_column_allow_null :id, true}
280
- @ds.insert
445
+ @ds.insert(:id=>nil)
281
446
  @ds.all.should == [{:id=>10}, {:id=>nil}]
282
447
  end
283
448
 
@@ -291,45 +456,119 @@ describe "Database schema modifiers" do
291
456
  @ds.all.should == [{:id=>10}, {:id=>20}]
292
457
  end
293
458
 
294
- specify "should set column types correctly" do
459
+ cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
295
460
  @db.create_table!(:items){Integer :id}
296
461
  @ds.insert(:id=>10)
297
462
  @db.alter_table(:items){set_column_type :id, String}
298
463
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
299
464
  @ds.columns!.should == [:id]
300
- @ds.insert(:id=>20)
465
+ @ds.insert(:id=>'20')
301
466
  @ds.all.should == [{:id=>"10"}, {:id=>"20"}]
302
467
  end
303
468
 
304
- cspecify "should add unique constraints and foreign key table constraints correctly", :sqlite do
305
- @db.create_table!(:items){Integer :id; Integer :item_id}
469
+ cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
470
+ @db.create_table!(:items){Integer :id, :null=>false, :default=>2}
471
+ proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
472
+ @db.alter_table(:items){set_column_type :id, String}
473
+ proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
474
+
475
+ @db.create_table!(:items){Integer :id}
476
+ @ds.insert(:id=>nil)
477
+ @db.alter_table(:items){set_column_type :id, String}
478
+ @ds.insert(:id=>nil)
479
+ @ds.map(:id).should == [nil, nil]
480
+ end
481
+
482
+ cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
483
+ @db.create_table!(:items){Integer :id, :default=>0}
484
+ @ds.insert
485
+ @ds.map(:id).should == [0]
486
+ @db.alter_table(:items){set_column_type :id, String}
487
+ @ds.insert
488
+ @ds.map(:id).should == ['0', '0']
489
+
490
+ @db.create_table!(:items){String :id, :default=>'a'}
491
+ @ds.insert
492
+ @ds.map(:id).should == %w'a'
493
+ @db.alter_table(:items){set_column_type :id, String, :size=>1}
494
+ @ds.insert
495
+ @ds.map(:id).should == %w'a a'
496
+ end
497
+
498
+ specify "should add unnamed unique constraints and foreign key table constraints correctly" do
499
+ @db.create_table!(:items, :engine=>:InnoDB){Integer :id; Integer :item_id}
306
500
  @db.alter_table(:items) do
307
501
  add_unique_constraint [:item_id, :id]
308
502
  add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
309
503
  end
310
504
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
311
505
  @ds.columns!.should == [:id, :item_id]
506
+ proc{@ds.insert(1, 1)}.should_not raise_error
507
+ proc{@ds.insert(1, 1)}.should raise_error
508
+ proc{@ds.insert(1, 2)}.should raise_error
509
+ end
510
+
511
+ specify "should add named unique constraints and foreign key table constraints correctly" do
512
+ @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
513
+ @db.alter_table(:items) do
514
+ add_unique_constraint [:item_id, :id], :name=>:unique_iii
515
+ add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
516
+ end
517
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
518
+ @ds.columns!.should == [:id, :item_id]
519
+ proc{@ds.insert(1, 1)}.should_not raise_error
520
+ proc{@ds.insert(1, 1)}.should raise_error
521
+ proc{@ds.insert(1, 2)}.should raise_error
312
522
  end
313
523
 
314
- cspecify "should remove columns from tables correctly", :h2, :mssql do
524
+ specify "should drop unique constraints and foreign key table constraints correctly" do
315
525
  @db.create_table!(:items) do
316
- primary_key :id
317
- String :name
318
- Integer :number
319
- foreign_key :item_id, :items
526
+ Integer :id
527
+ Integer :item_id
528
+ unique [:item_id, :id], :name=>:items_uk
529
+ foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
530
+ end
531
+ @db.alter_table(:items) do
532
+ drop_constraint(:items_fk, :type=>:foreign_key)
533
+ drop_constraint(:items_uk, :type=>:unique)
320
534
  end
321
- @ds.insert(:number=>10)
322
- @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :number, :item_id]
323
- @ds.columns!.should == [:id, :name, :number, :item_id]
324
- @db.drop_column(:items, :number)
325
- @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :item_id]
326
- @ds.columns!.should == [:id, :name, :item_id]
327
- @db.drop_column(:items, :name)
328
535
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
329
536
  @ds.columns!.should == [:id, :item_id]
330
- @db.drop_column(:items, :item_id)
537
+ proc{@ds.insert(1, 2)}.should_not raise_error
538
+ proc{@ds.insert(1, 2)}.should_not raise_error
539
+ end
540
+
541
+ specify "should remove columns from tables correctly" do
542
+ @db.create_table!(:items) do
543
+ primary_key :id
544
+ Integer :i
545
+ end
546
+ @ds.insert(:i=>10)
547
+ @db.drop_column(:items, :i)
548
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
549
+ end
550
+
551
+ specify "should remove columns with defaults from tables correctly" do
552
+ @db.create_table!(:items) do
553
+ primary_key :id
554
+ Integer :i, :default=>20
555
+ end
556
+ @ds.insert(:i=>10)
557
+ @db.drop_column(:items, :i)
331
558
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
332
- @ds.columns!.should == [:id]
559
+ end
560
+
561
+ cspecify "should remove foreign key columns from tables correctly", :h2, :mssql, :hsqldb do
562
+ # MySQL with InnoDB cannot drop foreign key columns unless you know the
563
+ # name of the constraint, see Bug #14347
564
+ @db.create_table!(:items, :engine=>:MyISAM) do
565
+ primary_key :id
566
+ Integer :i
567
+ foreign_key :item_id, :items
568
+ end
569
+ @ds.insert(:i=>10)
570
+ @db.drop_column(:items, :item_id)
571
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :i]
333
572
  end
334
573
 
335
574
  specify "should remove multiple columns in a single alter_table block" do
@@ -340,20 +579,44 @@ describe "Database schema modifiers" do
340
579
  end
341
580
  @ds.insert(:number=>10)
342
581
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :name, :number]
343
- @ds.columns!.should == [:id, :name, :number]
344
582
  @db.alter_table(:items) do
345
583
  drop_column :name
346
584
  drop_column :number
347
585
  end
348
586
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
349
- @ds.columns!.should == [:id]
587
+ end
588
+
589
+ cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2], [:db2] do
590
+ @db.create_table!(:items) do
591
+ primary_key :id
592
+ String :name2
593
+ String :number2
594
+ constraint :bar, Sequel.~(:id=>nil)
595
+ end
596
+ @ds.insert(:name2=>'A12')
597
+ @db.alter_table(:items) do
598
+ add_column :number, Integer
599
+ drop_column :number2
600
+ rename_column :name2, :name
601
+ drop_constraint :bar
602
+ set_column_not_null :name
603
+ set_column_default :name, 'A13'
604
+ add_constraint :foo, Sequel.like(:name, 'A%')
605
+ end
606
+ @db[:items].first.should == {:id=>1, :name=>'A12', :number=>nil}
607
+ @db[:items].delete
608
+ proc{@db[:items].insert(:name=>nil)}.should raise_error(Sequel::DatabaseError)
609
+ @db[:items].insert(:number=>1)
610
+ @db[:items].get(:name).should == 'A13'
350
611
  end
351
612
  end
352
613
 
353
- begin
614
+ test_tables = begin
354
615
  INTEGRATION_DB.tables
616
+ true
355
617
  rescue Sequel::NotImplemented
356
- rescue
618
+ false
619
+ end
357
620
  describe "Database#tables" do
358
621
  before do
359
622
  class ::String
@@ -362,25 +625,72 @@ describe "Database#tables" do
362
625
  "xxxxx#{@@xxxxx += 1}"
363
626
  end
364
627
  end
365
- @iom = INTEGRATION_DB.identifier_output_method
366
- @iim = INTEGRATION_DB.identifier_input_method
367
- clear_sqls
628
+ @db = INTEGRATION_DB
629
+ @db.create_table(:sequel_test_table){Integer :a}
630
+ @db.create_view :sequel_test_view, @db[:sequel_test_table]
631
+ @iom = @db.identifier_output_method
632
+ @iim = @db.identifier_input_method
368
633
  end
369
634
  after do
370
- INTEGRATION_DB.identifier_output_method = @iom
371
- INTEGRATION_DB.identifier_input_method = @iim
635
+ @db.identifier_output_method = @iom
636
+ @db.identifier_input_method = @iim
637
+ @db.drop_view :sequel_test_view
638
+ @db.drop_table :sequel_test_table
372
639
  end
373
640
 
374
641
  specify "should return an array of symbols" do
375
- ts = INTEGRATION_DB.tables
642
+ ts = @db.tables
376
643
  ts.should be_a_kind_of(Array)
377
644
  ts.each{|t| t.should be_a_kind_of(Symbol)}
645
+ ts.should include(:sequel_test_table)
646
+ ts.should_not include(:sequel_test_view)
378
647
  end
379
648
 
380
649
  specify "should respect the database's identifier_output_method" do
381
- INTEGRATION_DB.identifier_output_method = :xxxxx
382
- INTEGRATION_DB.identifier_input_method = :xxxxx
383
- INTEGRATION_DB.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
650
+ @db.identifier_output_method = :xxxxx
651
+ @db.identifier_input_method = :xxxxx
652
+ @db.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
384
653
  end
654
+ end if test_tables
655
+
656
+ test_views = begin
657
+ INTEGRATION_DB.views
658
+ true
659
+ rescue Sequel::NotImplemented
660
+ false
385
661
  end
386
- end
662
+ describe "Database#views" do
663
+ before do
664
+ class ::String
665
+ @@xxxxx = 0
666
+ def xxxxx
667
+ "xxxxx#{@@xxxxx += 1}"
668
+ end
669
+ end
670
+ @db = INTEGRATION_DB
671
+ @db.create_table(:sequel_test_table){Integer :a}
672
+ @db.create_view :sequel_test_view, @db[:sequel_test_table]
673
+ @iom = @db.identifier_output_method
674
+ @iim = @db.identifier_input_method
675
+ end
676
+ after do
677
+ @db.identifier_output_method = @iom
678
+ @db.identifier_input_method = @iim
679
+ @db.drop_view :sequel_test_view
680
+ @db.drop_table :sequel_test_table
681
+ end
682
+
683
+ specify "should return an array of symbols" do
684
+ ts = @db.views
685
+ ts.should be_a_kind_of(Array)
686
+ ts.each{|t| t.should be_a_kind_of(Symbol)}
687
+ ts.should_not include(:sequel_test_table)
688
+ ts.should include(:sequel_test_view)
689
+ end
690
+
691
+ specify "should respect the database's identifier_output_method" do
692
+ @db.identifier_output_method = :xxxxx
693
+ @db.identifier_input_method = :xxxxx
694
+ @db.views.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
695
+ end
696
+ end if test_views