sequel 4.41.0 → 4.42.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +98 -0
  3. data/README.rdoc +23 -10
  4. data/doc/active_record.rdoc +4 -4
  5. data/doc/advanced_associations.rdoc +2 -2
  6. data/doc/association_basics.rdoc +5 -2
  7. data/doc/cheat_sheet.rdoc +3 -3
  8. data/doc/core_extensions.rdoc +2 -2
  9. data/doc/dataset_basics.rdoc +4 -4
  10. data/doc/dataset_filtering.rdoc +1 -1
  11. data/doc/migration.rdoc +19 -1
  12. data/doc/prepared_statements.rdoc +2 -2
  13. data/doc/release_notes/4.42.0.txt +221 -0
  14. data/doc/testing.rdoc +3 -1
  15. data/lib/sequel/adapters/ado/access.rb +0 -1
  16. data/lib/sequel/adapters/ado/mssql.rb +0 -1
  17. data/lib/sequel/adapters/do/mysql.rb +0 -1
  18. data/lib/sequel/adapters/do/postgres.rb +0 -1
  19. data/lib/sequel/adapters/do/sqlite3.rb +0 -1
  20. data/lib/sequel/adapters/ibmdb.rb +21 -25
  21. data/lib/sequel/adapters/jdbc.rb +8 -16
  22. data/lib/sequel/adapters/jdbc/as400.rb +0 -1
  23. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
  24. data/lib/sequel/adapters/jdbc/db2.rb +0 -1
  25. data/lib/sequel/adapters/jdbc/derby.rb +0 -1
  26. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
  27. data/lib/sequel/adapters/jdbc/h2.rb +0 -1
  28. data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
  29. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
  30. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
  31. data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
  32. data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
  34. data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
  36. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
  37. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
  38. data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
  39. data/lib/sequel/adapters/mock.rb +54 -12
  40. data/lib/sequel/adapters/mysql.rb +1 -1
  41. data/lib/sequel/adapters/mysql2.rb +11 -17
  42. data/lib/sequel/adapters/odbc/mssql.rb +0 -1
  43. data/lib/sequel/adapters/oracle.rb +8 -20
  44. data/lib/sequel/adapters/postgres.rb +11 -29
  45. data/lib/sequel/adapters/shared/access.rb +5 -12
  46. data/lib/sequel/adapters/shared/cubrid.rb +4 -13
  47. data/lib/sequel/adapters/shared/db2.rb +4 -2
  48. data/lib/sequel/adapters/shared/firebird.rb +2 -4
  49. data/lib/sequel/adapters/shared/informix.rb +4 -2
  50. data/lib/sequel/adapters/shared/mssql.rb +3 -5
  51. data/lib/sequel/adapters/shared/mysql.rb +4 -14
  52. data/lib/sequel/adapters/shared/oracle.rb +1 -3
  53. data/lib/sequel/adapters/shared/postgres.rb +16 -38
  54. data/lib/sequel/adapters/shared/progress.rb +0 -2
  55. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
  56. data/lib/sequel/adapters/shared/sqlite.rb +20 -16
  57. data/lib/sequel/adapters/sqlite.rb +8 -20
  58. data/lib/sequel/adapters/swift/mysql.rb +0 -1
  59. data/lib/sequel/adapters/swift/postgres.rb +0 -1
  60. data/lib/sequel/adapters/swift/sqlite.rb +0 -1
  61. data/lib/sequel/adapters/tinytds.rb +4 -12
  62. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  63. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
  64. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
  65. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  66. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
  67. data/lib/sequel/ast_transformer.rb +2 -2
  68. data/lib/sequel/database/dataset.rb +1 -1
  69. data/lib/sequel/database/dataset_defaults.rb +0 -66
  70. data/lib/sequel/database/features.rb +6 -0
  71. data/lib/sequel/database/misc.rb +31 -17
  72. data/lib/sequel/database/query.rb +7 -4
  73. data/lib/sequel/database/schema_methods.rb +1 -1
  74. data/lib/sequel/dataset.rb +8 -8
  75. data/lib/sequel/dataset/actions.rb +140 -46
  76. data/lib/sequel/dataset/features.rb +1 -5
  77. data/lib/sequel/dataset/graph.rb +7 -8
  78. data/lib/sequel/dataset/misc.rb +127 -56
  79. data/lib/sequel/dataset/mutation.rb +9 -20
  80. data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
  81. data/lib/sequel/dataset/prepared_statements.rb +102 -46
  82. data/lib/sequel/dataset/query.rb +155 -72
  83. data/lib/sequel/dataset/sql.rb +26 -9
  84. data/lib/sequel/extensions/columns_introspection.rb +3 -1
  85. data/lib/sequel/extensions/core_extensions.rb +5 -5
  86. data/lib/sequel/extensions/core_refinements.rb +5 -5
  87. data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
  88. data/lib/sequel/extensions/freeze_datasets.rb +69 -0
  89. data/lib/sequel/extensions/identifier_mangling.rb +196 -0
  90. data/lib/sequel/extensions/looser_typecasting.rb +11 -7
  91. data/lib/sequel/extensions/migration.rb +1 -1
  92. data/lib/sequel/extensions/null_dataset.rb +5 -2
  93. data/lib/sequel/extensions/pagination.rb +42 -23
  94. data/lib/sequel/extensions/pg_enum.rb +3 -3
  95. data/lib/sequel/extensions/query.rb +3 -3
  96. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
  97. data/lib/sequel/model/associations.rb +25 -8
  98. data/lib/sequel/model/base.rb +88 -29
  99. data/lib/sequel/model/dataset_module.rb +37 -0
  100. data/lib/sequel/plugins/association_pks.rb +4 -4
  101. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  102. data/lib/sequel/plugins/constraint_validations.rb +1 -2
  103. data/lib/sequel/plugins/csv_serializer.rb +2 -2
  104. data/lib/sequel/plugins/dataset_associations.rb +8 -8
  105. data/lib/sequel/plugins/eager_each.rb +2 -2
  106. data/lib/sequel/plugins/instance_filters.rb +1 -1
  107. data/lib/sequel/plugins/json_serializer.rb +2 -2
  108. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  109. data/lib/sequel/plugins/list.rb +4 -4
  110. data/lib/sequel/plugins/prepared_statements.rb +2 -4
  111. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
  112. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  113. data/lib/sequel/plugins/rcte_tree.rb +13 -13
  114. data/lib/sequel/plugins/sharding.rb +1 -1
  115. data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
  116. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  117. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  118. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  119. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  120. data/lib/sequel/sql.rb +69 -36
  121. data/lib/sequel/version.rb +1 -1
  122. data/spec/adapters/db2_spec.rb +10 -0
  123. data/spec/adapters/firebird_spec.rb +1 -1
  124. data/spec/adapters/mssql_spec.rb +4 -5
  125. data/spec/adapters/mysql_spec.rb +9 -9
  126. data/spec/adapters/postgres_spec.rb +67 -68
  127. data/spec/adapters/spec_helper.rb +6 -1
  128. data/spec/adapters/sqlite_spec.rb +29 -15
  129. data/spec/core/connection_pool_spec.rb +14 -14
  130. data/spec/core/database_spec.rb +38 -180
  131. data/spec/core/dataset_mutation_spec.rb +253 -0
  132. data/spec/core/dataset_spec.rb +394 -537
  133. data/spec/core/expression_filters_spec.rb +34 -32
  134. data/spec/core/mock_adapter_spec.rb +27 -35
  135. data/spec/core/placeholder_literalizer_spec.rb +2 -4
  136. data/spec/core/schema_generator_spec.rb +4 -4
  137. data/spec/core/schema_spec.rb +1 -2
  138. data/spec/core_extensions_spec.rb +22 -29
  139. data/spec/extensions/active_model_spec.rb +6 -6
  140. data/spec/extensions/association_dependencies_spec.rb +2 -2
  141. data/spec/extensions/blacklist_security_spec.rb +3 -3
  142. data/spec/extensions/boolean_readers_spec.rb +12 -12
  143. data/spec/extensions/caching_spec.rb +13 -10
  144. data/spec/extensions/class_table_inheritance_spec.rb +38 -43
  145. data/spec/extensions/column_conflicts_spec.rb +1 -3
  146. data/spec/extensions/columns_introspection_spec.rb +2 -3
  147. data/spec/extensions/composition_spec.rb +5 -3
  148. data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
  149. data/spec/extensions/constraint_validations_spec.rb +14 -8
  150. data/spec/extensions/core_refinements_spec.rb +22 -29
  151. data/spec/extensions/csv_serializer_spec.rb +7 -6
  152. data/spec/extensions/date_arithmetic_spec.rb +15 -15
  153. data/spec/extensions/defaults_setter_spec.rb +2 -2
  154. data/spec/extensions/delay_add_association_spec.rb +1 -1
  155. data/spec/extensions/dirty_spec.rb +19 -10
  156. data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
  157. data/spec/extensions/eager_each_spec.rb +12 -16
  158. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  159. data/spec/extensions/eval_inspect_spec.rb +4 -3
  160. data/spec/extensions/force_encoding_spec.rb +12 -12
  161. data/spec/extensions/freeze_datasets_spec.rb +31 -0
  162. data/spec/extensions/graph_each_spec.rb +6 -18
  163. data/spec/extensions/hook_class_methods_spec.rb +7 -7
  164. data/spec/extensions/identifier_mangling_spec.rb +307 -0
  165. data/spec/extensions/instance_filters_spec.rb +5 -6
  166. data/spec/extensions/instance_hooks_spec.rb +12 -12
  167. data/spec/extensions/json_serializer_spec.rb +12 -15
  168. data/spec/extensions/lazy_attributes_spec.rb +4 -4
  169. data/spec/extensions/list_spec.rb +19 -21
  170. data/spec/extensions/many_through_many_spec.rb +108 -163
  171. data/spec/extensions/meta_def_spec.rb +7 -2
  172. data/spec/extensions/migration_spec.rb +10 -12
  173. data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
  174. data/spec/extensions/named_timezones_spec.rb +4 -3
  175. data/spec/extensions/nested_attributes_spec.rb +2 -2
  176. data/spec/extensions/null_dataset_spec.rb +17 -12
  177. data/spec/extensions/optimistic_locking_spec.rb +4 -5
  178. data/spec/extensions/pagination_spec.rb +8 -10
  179. data/spec/extensions/pg_array_associations_spec.rb +28 -27
  180. data/spec/extensions/pg_array_ops_spec.rb +2 -1
  181. data/spec/extensions/pg_array_spec.rb +6 -2
  182. data/spec/extensions/pg_enum_spec.rb +5 -3
  183. data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
  184. data/spec/extensions/pg_hstore_spec.rb +7 -6
  185. data/spec/extensions/pg_inet_ops_spec.rb +2 -1
  186. data/spec/extensions/pg_inet_spec.rb +2 -1
  187. data/spec/extensions/pg_interval_spec.rb +2 -1
  188. data/spec/extensions/pg_json_ops_spec.rb +2 -1
  189. data/spec/extensions/pg_json_spec.rb +6 -3
  190. data/spec/extensions/pg_loose_count_spec.rb +1 -0
  191. data/spec/extensions/pg_range_ops_spec.rb +3 -1
  192. data/spec/extensions/pg_range_spec.rb +9 -5
  193. data/spec/extensions/pg_row_ops_spec.rb +2 -1
  194. data/spec/extensions/pg_row_plugin_spec.rb +4 -6
  195. data/spec/extensions/pg_row_spec.rb +5 -3
  196. data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
  197. data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
  198. data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
  199. data/spec/extensions/prepared_statements_spec.rb +12 -11
  200. data/spec/extensions/pretty_table_spec.rb +1 -1
  201. data/spec/extensions/query_spec.rb +8 -5
  202. data/spec/extensions/rcte_tree_spec.rb +39 -39
  203. data/spec/extensions/round_timestamps_spec.rb +2 -2
  204. data/spec/extensions/schema_dumper_spec.rb +3 -2
  205. data/spec/extensions/schema_spec.rb +2 -2
  206. data/spec/extensions/scissors_spec.rb +1 -2
  207. data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
  208. data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
  209. data/spec/extensions/serialization_spec.rb +15 -13
  210. data/spec/extensions/set_overrides_spec.rb +14 -8
  211. data/spec/extensions/sharding_spec.rb +9 -18
  212. data/spec/extensions/shared_caching_spec.rb +3 -4
  213. data/spec/extensions/single_table_inheritance_spec.rb +11 -11
  214. data/spec/extensions/skip_create_refresh_spec.rb +2 -1
  215. data/spec/extensions/spec_helper.rb +1 -1
  216. data/spec/extensions/split_values_spec.rb +2 -2
  217. data/spec/extensions/sql_comments_spec.rb +6 -0
  218. data/spec/extensions/static_cache_spec.rb +7 -9
  219. data/spec/extensions/string_agg_spec.rb +30 -29
  220. data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
  221. data/spec/extensions/thread_local_timezones_spec.rb +2 -2
  222. data/spec/extensions/timestamps_spec.rb +28 -3
  223. data/spec/extensions/to_dot_spec.rb +1 -2
  224. data/spec/extensions/tree_spec.rb +33 -29
  225. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  226. data/spec/extensions/unlimited_update_spec.rb +1 -0
  227. data/spec/extensions/update_primary_key_spec.rb +11 -7
  228. data/spec/extensions/update_refresh_spec.rb +1 -1
  229. data/spec/extensions/uuid_spec.rb +0 -1
  230. data/spec/extensions/validate_associated_spec.rb +1 -1
  231. data/spec/extensions/validation_class_methods_spec.rb +10 -10
  232. data/spec/extensions/validation_helpers_spec.rb +10 -10
  233. data/spec/extensions/xml_serializer_spec.rb +7 -3
  234. data/spec/integration/associations_test.rb +31 -31
  235. data/spec/integration/dataset_test.rb +17 -19
  236. data/spec/integration/eager_loader_test.rb +24 -24
  237. data/spec/integration/model_test.rb +6 -6
  238. data/spec/integration/plugin_test.rb +43 -43
  239. data/spec/integration/prepared_statement_test.rb +6 -6
  240. data/spec/integration/schema_test.rb +63 -52
  241. data/spec/integration/spec_helper.rb +6 -1
  242. data/spec/integration/transaction_test.rb +13 -13
  243. data/spec/model/association_reflection_spec.rb +17 -17
  244. data/spec/model/associations_spec.rb +101 -96
  245. data/spec/model/base_spec.rb +175 -49
  246. data/spec/model/class_dataset_methods_spec.rb +5 -9
  247. data/spec/model/dataset_methods_spec.rb +5 -5
  248. data/spec/model/eager_loading_spec.rb +209 -235
  249. data/spec/model/hooks_spec.rb +15 -15
  250. data/spec/model/model_spec.rb +28 -21
  251. data/spec/model/plugins_spec.rb +4 -5
  252. data/spec/model/record_spec.rb +59 -57
  253. data/spec/model/spec_helper.rb +1 -1
  254. data/spec/model/validations_spec.rb +6 -6
  255. data/spec/spec_config.rb +1 -1
  256. metadata +10 -2
@@ -39,10 +39,15 @@ class Minitest::HooksSpec
39
39
  end
40
40
  end
41
41
 
42
+ IDENTIFIER_MANGLING = !ENV['SEQUEL_NO_MANGLE'] unless defined?(IDENTIFIER_MANGLING)
43
+
42
44
  unless defined?(DB)
43
45
  env_var = "SEQUEL_#{SEQUEL_ADAPTER_TEST.to_s.upcase}_URL"
44
46
  env_var = ENV.has_key?(env_var) ? env_var : 'SEQUEL_INTEGRATION_URL'
45
- DB = Sequel.connect(ENV[env_var])
47
+ opts = {}
48
+ opts[:identifier_mangling] = false unless IDENTIFIER_MANGLING
49
+ DB = Sequel.connect(ENV[env_var], opts)
50
+ DB.extension(:freeze_datasets) if ENV['SEQUEL_FREEZE_DATASETS']
46
51
  end
47
52
 
48
53
  if dch = ENV['SEQUEL_DUPLICATE_COLUMNS_HANDLER']
@@ -297,7 +297,7 @@ end if DB.adapter_scheme == :sqlite
297
297
 
298
298
  describe "An SQLite dataset" do
299
299
  before do
300
- @d = DB[:items]
300
+ @d = DB.dataset
301
301
  end
302
302
 
303
303
  it "should raise errors if given a regexp pattern match" do
@@ -347,6 +347,9 @@ describe "SQLite::Dataset#delete" do
347
347
  @d << {:name => 'def', :value => 4.56}
348
348
  @d << {:name => 'ghi', :value => 7.89}
349
349
  end
350
+ after do
351
+ DB.drop_table?(:items)
352
+ end
350
353
 
351
354
  it "should return the number of records affected when filtered" do
352
355
  @d.count.must_equal 3
@@ -458,7 +461,7 @@ describe "SQLite dataset" do
458
461
 
459
462
  it "should have #explain work when identifier_output_method is modified" do
460
463
  DB[:test].with_identifier_output_method(:upcase).explain.must_be_kind_of(String)
461
- end
464
+ end if IDENTIFIER_MANGLING
462
465
  end
463
466
 
464
467
  describe "A SQLite database" do
@@ -470,7 +473,7 @@ describe "A SQLite database" do
470
473
  end
471
474
  end
472
475
  after do
473
- @db.drop_table?(:test2)
476
+ @db.drop_table?(:test, :test2, :test3, :test3_backup0, :test3_backup1, :test3_backup2)
474
477
  end
475
478
 
476
479
  it "should support add_column operations" do
@@ -543,12 +546,10 @@ describe "A SQLite database" do
543
546
  @db.drop_column :test3, :value
544
547
 
545
548
  @db[:test].filter(:name => 'bar').delete
546
- @db[:test3][:name => 'def'][:test_id].must_equal nil
549
+ @db[:test3][:name => 'def'][:test_id].must_be_nil
547
550
 
548
551
  @db[:test].filter(:name => 'foo').update(:id=>100)
549
552
  @db[:test3][:name => 'abc'][:test_id].must_equal 100
550
-
551
- @db.drop_table? :test, :test3
552
553
  end
553
554
  end
554
555
 
@@ -582,9 +583,23 @@ describe "A SQLite database" do
582
583
  @db[:test3].first[:t].must_equal 'a'
583
584
  @db[:test3].delete
584
585
  end
586
+
587
+
588
+ it "should preserve autoincrement after table modification" do
589
+ @db.create_table!(:test2) do
590
+ primary_key :id
591
+ Integer :val, :null => false
592
+ end
593
+ @db.rename_column(:test2, :val, :value)
594
+
595
+ t = @db[:test2]
596
+ id1 = t.insert(:value=>1)
597
+ t.delete
598
+ id2 = t.insert(:value=>1)
599
+ id2.must_be :>, id1
600
+ end
585
601
 
586
602
  it "should handle quoted tables when dropping or renaming columns" do
587
- @db.quote_identifiers = true
588
603
  table_name = "T T"
589
604
  @db.drop_table?(table_name)
590
605
  @db.create_table! table_name do
@@ -640,7 +655,6 @@ describe "A SQLite database" do
640
655
  @db[:test3_backup1].columns.must_equal [:k]
641
656
  @db[:test3_backup2].columns.must_equal [:l]
642
657
  @db.loggers.delete(l)
643
- @db.drop_table?(:test3, :test3_backup0, :test3_backup1, :test3_backup2)
644
658
  end
645
659
 
646
660
  it "should support add_index" do
@@ -654,12 +668,12 @@ describe "A SQLite database" do
654
668
  end
655
669
 
656
670
  it "should keep applicable indexes when emulating schema methods" do
657
- @db.create_table!(:a){Integer :a; Integer :b}
658
- @db.add_index :a, :a
659
- @db.add_index :a, :b
660
- @db.add_index :a, [:b, :a]
661
- @db.drop_column :a, :b
662
- @db.indexes(:a).must_equal(:a_a_index=>{:unique=>false, :columns=>[:a]})
671
+ @db.create_table!(:test3){Integer :a; Integer :b}
672
+ @db.add_index :test3, :a
673
+ @db.add_index :test3, :b
674
+ @db.add_index :test3, [:b, :a]
675
+ @db.drop_column :test3, :b
676
+ @db.indexes(:test3).must_equal(:test3_a_index=>{:unique=>false, :columns=>[:a]})
663
677
  end
664
678
 
665
679
  it "should have support for various #transaction modes" do
@@ -679,7 +693,7 @@ describe "A SQLite database" do
679
693
  sqls.last.must_equal Sequel::Database::SQL_BEGIN
680
694
  end
681
695
 
682
- @db.transaction_mode.must_equal nil
696
+ @db.transaction_mode.must_be_nil
683
697
  @db.transaction_mode = :immediate
684
698
  @db.transaction_mode.must_equal :immediate
685
699
  @db.transaction do
@@ -192,7 +192,7 @@ describe "A connection pool with a max size of 1" do
192
192
 
193
193
  cc.must_equal 'herro'
194
194
  c1.must_equal 'herro'
195
- c2.must_equal nil
195
+ c2.must_be_nil
196
196
 
197
197
  @pool.available_connections.must_be :empty?
198
198
  @pool.allocated.must_equal(t1=>cc)
@@ -357,9 +357,9 @@ ThreadedConnectionPoolSpecs = shared_description do
357
357
  threads[6].must_be :alive?
358
358
  threads[7].must_be :alive?
359
359
  cc.size.must_equal 5
360
- cc[5].must_equal nil
361
- cc[6].must_equal nil
362
- cc[7].must_equal nil
360
+ cc[5].must_be_nil
361
+ cc[6].must_be_nil
362
+ cc[7].must_be_nil
363
363
 
364
364
  5.times{q.push nil}
365
365
  5.times{|i| threads[i].join}
@@ -614,12 +614,12 @@ describe "A connection pool with multiple servers" do
614
614
  pool.hold(:server1) do
615
615
  pool.allocated.length.must_equal 0
616
616
  pool.allocated(:server1).length.must_equal 1
617
- pool.allocated(:server2).must_equal nil
618
- pool.allocated(:server3).must_equal nil
617
+ pool.allocated(:server2).must_be_nil
618
+ pool.allocated(:server3).must_be_nil
619
619
  pool.available_connections.length.must_equal 1
620
620
  pool.available_connections(:server1).length.must_equal 0
621
- pool.available_connections(:server2).must_equal nil
622
- pool.available_connections(:server3).must_equal nil
621
+ pool.available_connections(:server2).must_be_nil
622
+ pool.available_connections(:server3).must_be_nil
623
623
 
624
624
  pool.add_servers([:server2, :server3])
625
625
  pool.hold(:server2){}
@@ -717,8 +717,8 @@ describe "A connection pool with multiple servers" do
717
717
  pool.available_connections(:server1).must_equal []
718
718
  pool.allocated(:server1).must_equal({})
719
719
  pool.remove_servers([:server1])
720
- pool.available_connections(:server1).must_equal nil
721
- pool.allocated(:server1).must_equal nil
720
+ pool.available_connections(:server1).must_be_nil
721
+ pool.allocated(:server1).must_be_nil
722
722
  end
723
723
 
724
724
  it "#remove_servers should not allow the removal of the default server" do
@@ -832,7 +832,7 @@ describe "A single threaded pool with multiple servers" do
832
832
  @pool.hold(:read_only){|c| c.must_equal :read_only}
833
833
  @pool.conn(:read_only).must_equal :read_only
834
834
  @pool.remove_servers([:read_only])
835
- @pool.conn(:read_only).must_equal nil
835
+ @pool.conn(:read_only).must_be_nil
836
836
  @pool.hold{}
837
837
  @pool.conn(:read_only).must_equal :default
838
838
  end
@@ -885,8 +885,8 @@ describe "A single threaded pool with multiple servers" do
885
885
  @pool.conn(:read_only).must_equal :read_only
886
886
  @pool.disconnect
887
887
  @max_size.must_equal 4
888
- @pool.conn.must_equal nil
889
- @pool.conn(:read_only).must_equal nil
888
+ @pool.conn.must_be_nil
889
+ @pool.conn(:read_only).must_be_nil
890
890
  end
891
891
 
892
892
  it ":disconnection_proc option should set the disconnection proc to use" do
@@ -1041,7 +1041,7 @@ AllConnectionPoolClassesSpecs = shared_description do
1041
1041
  x = nil
1042
1042
  c = @class.new(mock_db.call(proc{|c1| x = c1}){123})
1043
1043
  c.hold{}
1044
- x.must_equal nil
1044
+ x.must_be_nil
1045
1045
  c.disconnect
1046
1046
  x.must_equal 123
1047
1047
  end
@@ -79,127 +79,6 @@ describe "A new Database" do
79
79
  db.pool.must_be_kind_of(Sequel::ConnectionPool)
80
80
  end
81
81
 
82
- it "should respect the :quote_identifiers option" do
83
- db = Sequel::Database.new(:quote_identifiers=>false)
84
- db.quote_identifiers?.must_equal false
85
- db = Sequel::Database.new(:quote_identifiers=>true)
86
- db.quote_identifiers?.must_equal true
87
- end
88
-
89
- it "should upcase on input and downcase on output by default" do
90
- db = Sequel::Database.new
91
- db.send(:identifier_input_method_default).must_equal :upcase
92
- db.send(:identifier_output_method_default).must_equal :downcase
93
- end
94
-
95
- it "should respect the :identifier_input_method option" do
96
- Sequel.identifier_input_method = nil
97
- Sequel::Database.identifier_input_method.must_equal false
98
- db = Sequel::Database.new(:identifier_input_method=>nil)
99
- db.identifier_input_method.must_equal nil
100
- db.identifier_input_method = :downcase
101
- db.identifier_input_method.must_equal :downcase
102
- db = Sequel::Database.new(:identifier_input_method=>:upcase)
103
- db.identifier_input_method.must_equal :upcase
104
- db.identifier_input_method = nil
105
- db.identifier_input_method.must_equal nil
106
- Sequel.identifier_input_method = :downcase
107
- Sequel::Database.identifier_input_method.must_equal :downcase
108
- db = Sequel::Database.new(:identifier_input_method=>nil)
109
- db.identifier_input_method.must_equal nil
110
- db.identifier_input_method = :upcase
111
- db.identifier_input_method.must_equal :upcase
112
- db = Sequel::Database.new(:identifier_input_method=>:upcase)
113
- db.identifier_input_method.must_equal :upcase
114
- db.identifier_input_method = nil
115
- db.identifier_input_method.must_equal nil
116
- end
117
-
118
- it "should respect the :identifier_output_method option" do
119
- Sequel.identifier_output_method = nil
120
- Sequel::Database.identifier_output_method.must_equal false
121
- db = Sequel::Database.new(:identifier_output_method=>nil)
122
- db.identifier_output_method.must_equal nil
123
- db.identifier_output_method = :downcase
124
- db.identifier_output_method.must_equal :downcase
125
- db = Sequel::Database.new(:identifier_output_method=>:upcase)
126
- db.identifier_output_method.must_equal :upcase
127
- db.identifier_output_method = nil
128
- db.identifier_output_method.must_equal nil
129
- Sequel.identifier_output_method = :downcase
130
- Sequel::Database.identifier_output_method.must_equal :downcase
131
- db = Sequel::Database.new(:identifier_output_method=>nil)
132
- db.identifier_output_method.must_equal nil
133
- db.identifier_output_method = :upcase
134
- db.identifier_output_method.must_equal :upcase
135
- db = Sequel::Database.new(:identifier_output_method=>:upcase)
136
- db.identifier_output_method.must_equal :upcase
137
- db.identifier_output_method = nil
138
- db.identifier_output_method.must_equal nil
139
- end
140
-
141
- it "should use the default Sequel.quote_identifiers value" do
142
- Sequel.quote_identifiers = true
143
- Sequel::Database.new({}).quote_identifiers?.must_equal true
144
- Sequel.quote_identifiers = false
145
- Sequel::Database.new({}).quote_identifiers?.must_equal false
146
- Sequel::Database.quote_identifiers = true
147
- Sequel::Database.new({}).quote_identifiers?.must_equal true
148
- Sequel::Database.quote_identifiers = false
149
- Sequel::Database.new({}).quote_identifiers?.must_equal false
150
- end
151
-
152
- it "should use the default Sequel.identifier_input_method value" do
153
- Sequel.identifier_input_method = :downcase
154
- Sequel::Database.new({}).identifier_input_method.must_equal :downcase
155
- Sequel.identifier_input_method = :upcase
156
- Sequel::Database.new({}).identifier_input_method.must_equal :upcase
157
- Sequel::Database.identifier_input_method = :downcase
158
- Sequel::Database.new({}).identifier_input_method.must_equal :downcase
159
- Sequel::Database.identifier_input_method = :upcase
160
- Sequel::Database.new({}).identifier_input_method.must_equal :upcase
161
- end
162
-
163
- it "should use the default Sequel.identifier_output_method value" do
164
- Sequel.identifier_output_method = :downcase
165
- Sequel::Database.new({}).identifier_output_method.must_equal :downcase
166
- Sequel.identifier_output_method = :upcase
167
- Sequel::Database.new({}).identifier_output_method.must_equal :upcase
168
- Sequel::Database.identifier_output_method = :downcase
169
- Sequel::Database.new({}).identifier_output_method.must_equal :downcase
170
- Sequel::Database.identifier_output_method = :upcase
171
- Sequel::Database.new({}).identifier_output_method.must_equal :upcase
172
- end
173
-
174
- it "should respect the quote_indentifiers_default method if Sequel.quote_identifiers = nil" do
175
- Sequel.quote_identifiers = nil
176
- Sequel::Database.new({}).quote_identifiers?.must_equal true
177
- x = Class.new(Sequel::Database){def quote_identifiers_default; false end}
178
- x.new({}).quote_identifiers?.must_equal false
179
- y = Class.new(Sequel::Database){def quote_identifiers_default; true end}
180
- y.new({}).quote_identifiers?.must_equal true
181
- end
182
-
183
- it "should respect the identifier_input_method_default method" do
184
- class Sequel::Database
185
- @identifier_input_method = nil
186
- end
187
- x = Class.new(Sequel::Database){def identifier_input_method_default; :downcase end}
188
- x.new({}).identifier_input_method.must_equal :downcase
189
- y = Class.new(Sequel::Database){def identifier_input_method_default; :camelize end}
190
- y.new({}).identifier_input_method.must_equal :camelize
191
- end
192
-
193
- it "should respect the identifier_output_method_default method if Sequel.identifier_output_method is not called" do
194
- class Sequel::Database
195
- @identifier_output_method = nil
196
- end
197
- x = Class.new(Sequel::Database){def identifier_output_method_default; :upcase end}
198
- x.new({}).identifier_output_method.must_equal :upcase
199
- y = Class.new(Sequel::Database){def identifier_output_method_default; :underscore end}
200
- y.new({}).identifier_output_method.must_equal :underscore
201
- end
202
-
203
82
  it "should just use a :uri option for jdbc with the full connection string" do
204
83
  db = Sequel::Database.stub(:adapter_class, Sequel::Database) do
205
84
  Sequel.connect('jdbc:test://host/db_name')
@@ -384,7 +263,7 @@ describe "Database#uri" do
384
263
  end
385
264
 
386
265
  it "should return nil if a connection uri was not used" do
387
- Sequel.mock.uri.must_equal nil
266
+ Sequel.mock.uri.must_be_nil
388
267
  end
389
268
 
390
269
  it "should be aliased as #url" do
@@ -394,7 +273,7 @@ end
394
273
 
395
274
  describe "Database.adapter_scheme and #adapter_scheme" do
396
275
  it "should return the database scheme" do
397
- Sequel::Database.adapter_scheme.must_equal nil
276
+ Sequel::Database.adapter_scheme.must_be_nil
398
277
 
399
278
  @c = Class.new(Sequel::Database) do
400
279
  set_adapter_scheme :mau
@@ -407,7 +286,7 @@ end
407
286
 
408
287
  describe "Database#dataset" do
409
288
  before do
410
- @db = Sequel::Database.new
289
+ @db = Sequel.mock
411
290
  @ds = @db.dataset
412
291
  end
413
292
 
@@ -516,8 +395,11 @@ describe "Database#extend_datasets" do
516
395
  end
517
396
 
518
397
  it "should be able to override methods defined in the original Dataset class" do
519
- @db.extend_datasets(Module.new{def select(*a, &block) super.order(*a, &block) end})
520
- @db[:t].select(:a, :b).sql.must_equal 'SELECT a, b FROM t ORDER BY a, b'
398
+ @db.extend_datasets do
399
+ def select(*a, &block) super.order(*a, &block) end
400
+ def input_identifier(v) v.to_s end
401
+ end
402
+ @db[:t].with_quote_identifiers(false).select(:a, :b).sql.must_equal 'SELECT a, b FROM t ORDER BY a, b'
521
403
  end
522
404
 
523
405
  it "should reapply settings if dataset_class is changed" do
@@ -565,7 +447,7 @@ describe "Database#run" do
565
447
  end
566
448
 
567
449
  it "should return nil" do
568
- @db.run("DELETE FROM items").must_equal nil
450
+ @db.run("DELETE FROM items").must_be_nil
569
451
  end
570
452
 
571
453
  it "should accept options passed to execute_ddl" do
@@ -609,7 +491,7 @@ describe "Database#synchronize" do
609
491
  c1.must_equal 12345
610
492
  t2 = Thread.new{@db.synchronize{|c| c2 = c; q2.push nil}}
611
493
  @db.pool.available_connections.must_be :empty?
612
- c2.must_equal nil
494
+ c2.must_be_nil
613
495
  q1.push nil
614
496
  q.pop
615
497
  q2.pop
@@ -841,13 +723,13 @@ DatabaseTransactionSpecs = shared_description do
841
723
  rbc = nil
842
724
  @db.transaction do
843
725
  rbc = @db.rollback_checker
844
- rbc.call.must_equal nil
726
+ rbc.call.must_be_nil
845
727
  end
846
728
  rbc.call.must_equal false
847
729
 
848
730
  @db.transaction(:rollback=>:always) do
849
731
  rbc = @db.rollback_checker
850
- rbc.call.must_equal nil
732
+ rbc.call.must_be_nil
851
733
  end
852
734
  rbc.call.must_equal true
853
735
 
@@ -864,7 +746,7 @@ DatabaseTransactionSpecs = shared_description do
864
746
  end
865
747
 
866
748
  it "should return nil if Sequel::Rollback is called in the transaction" do
867
- @db.transaction{raise Sequel::Rollback}.must_equal nil
749
+ @db.transaction{raise Sequel::Rollback}.must_be_nil
868
750
  end
869
751
 
870
752
  it "should reraise Sequel::Rollback errors when using :rollback=>:reraise option is given" do
@@ -879,7 +761,7 @@ DatabaseTransactionSpecs = shared_description do
879
761
  it "should always rollback if :rollback=>:always option is given" do
880
762
  proc {@db.transaction(:rollback=>:always){raise ArgumentError}}.must_raise(ArgumentError)
881
763
  @db.sqls.must_equal ['BEGIN', 'ROLLBACK']
882
- @db.transaction(:rollback=>:always){raise Sequel::Rollback}.must_equal nil
764
+ @db.transaction(:rollback=>:always){raise Sequel::Rollback}.must_be_nil
883
765
  @db.sqls.must_equal ['BEGIN', 'ROLLBACK']
884
766
  @db.transaction(:rollback=>:always){1}.must_equal 1
885
767
  @db.sqls.must_equal ['BEGIN', 'ROLLBACK']
@@ -1158,7 +1040,7 @@ describe "Sequel.transaction" do
1158
1040
  end
1159
1041
 
1160
1042
  it "should handle Sequel::Rollback exceptions raised by the block to rollback on all databases" do
1161
- Sequel.transaction([@db1, @db2, @db3]){raise Sequel::Rollback}.must_equal nil
1043
+ Sequel.transaction([@db1, @db2, @db3]){raise Sequel::Rollback}.must_be_nil
1162
1044
  @sqls.must_equal ['BEGIN -- 1', 'BEGIN -- 2', 'BEGIN -- 3', 'ROLLBACK -- 3', 'ROLLBACK -- 2', 'ROLLBACK -- 1']
1163
1045
  end
1164
1046
 
@@ -1465,7 +1347,7 @@ end
1465
1347
 
1466
1348
  describe "Sequel::Database.load_adapter" do
1467
1349
  it "should not raise an error if subadapter does not exist" do
1468
- Sequel::Database.load_adapter(:foo, :subdir=>'bar').must_equal nil
1350
+ Sequel::Database.load_adapter(:foo, :subdir=>'bar').must_be_nil
1469
1351
  end
1470
1352
  end
1471
1353
 
@@ -1617,7 +1499,7 @@ describe "Database#fetch" do
1617
1499
  ds.select_sql.must_equal 'select * from xyz'
1618
1500
  ds.sql.must_equal 'select * from xyz'
1619
1501
 
1620
- ds.filter!{price.sql_number < 100}
1502
+ ds = ds.where{price.sql_number < 100}
1621
1503
  ds.select_sql.must_equal 'select * from xyz'
1622
1504
  ds.sql.must_equal 'select * from xyz'
1623
1505
  end
@@ -1950,7 +1832,7 @@ describe "Database#typecast_value" do
1950
1832
  @db.typecast_value(:boolean, '1').must_equal true
1951
1833
  @db.typecast_value(:boolean, 't').must_equal true
1952
1834
  @db.typecast_value(:boolean, 'true').must_equal true
1953
- @db.typecast_value(:boolean, '').must_equal nil
1835
+ @db.typecast_value(:boolean, '').must_be_nil
1954
1836
  end
1955
1837
 
1956
1838
  it "should typecast date values to Date" do
@@ -2405,37 +2287,11 @@ describe "Database#supports_transaction_isolation_levels?" do
2405
2287
  end
2406
2288
  end
2407
2289
 
2408
- describe "Database#input_identifier_meth" do
2409
- it "should be the input_identifer method of a default dataset for this database" do
2410
- db = Sequel::Database.new
2411
- db.send(:input_identifier_meth).call(:a).must_equal 'a'
2412
- db.identifier_input_method = :upcase
2413
- db.send(:input_identifier_meth).call(:a).must_equal 'A'
2414
- end
2415
- end
2416
-
2417
- describe "Database#output_identifier_meth" do
2418
- it "should be the output_identifer method of a default dataset for this database" do
2419
- db = Sequel::Database.new
2420
- db.send(:output_identifier_meth).call('A').must_equal :A
2421
- db.identifier_output_method = :downcase
2422
- db.send(:output_identifier_meth).call('A').must_equal :a
2423
- end
2424
- end
2425
-
2426
- describe "Database#metadata_dataset" do
2427
- it "should be a dataset with the default settings for identifier_input_method and identifier_output_method" do
2428
- ds = Sequel::Database.new.send(:metadata_dataset)
2429
- ds.literal(:a).must_equal 'A'
2430
- ds.send(:output_identifier, 'A').must_equal :a
2431
- end
2432
- end
2433
-
2434
2290
  describe "Database#column_schema_to_ruby_default" do
2435
2291
  it "should handle converting many default formats" do
2436
2292
  db = Sequel::Database.new
2437
2293
  p = lambda{|d,t| db.send(:column_schema_to_ruby_default, d, t)}
2438
- p[nil, :integer].must_equal nil
2294
+ p[nil, :integer].must_be_nil
2439
2295
  p[1, :integer].must_equal 1
2440
2296
  p['1', :integer].must_equal 1
2441
2297
  p['-1', :integer].must_equal(-1)
@@ -2471,7 +2327,7 @@ describe "Database#column_schema_to_ruby_default" do
2471
2327
  p["'2009-10-29T10:20:30-07:00'", :datetime].must_equal DateTime.parse('2009-10-29T10:20:30-07:00')
2472
2328
  p["'2009-10-29 10:20:30'", :datetime].must_equal DateTime.parse('2009-10-29 10:20:30')
2473
2329
  p["'10:20:30'", :time].must_equal Time.parse('10:20:30')
2474
- p["NaN", :float].must_equal nil
2330
+ p["NaN", :float].must_be_nil
2475
2331
 
2476
2332
  db = Sequel.mock(:host=>'postgres')
2477
2333
  p["''::text", :string].must_equal ""
@@ -2523,7 +2379,7 @@ describe "Database extensions" do
2523
2379
  end
2524
2380
  end
2525
2381
  before do
2526
- @db = Sequel.mock
2382
+ @db = Sequel.mock(:identifier_mangling=>false)
2527
2383
  end
2528
2384
  after do
2529
2385
  Sequel::Database.instance_variable_set(:@initialize_hook, Proc.new {|db| })
@@ -2535,25 +2391,21 @@ describe "Database extensions" do
2535
2391
  end
2536
2392
 
2537
2393
  it "should be able to register an extension with a block and have Database#extension call the block" do
2538
- @db.quote_identifiers = false
2539
- Sequel::Database.register_extension(:foo){|db| db.quote_identifiers = true}
2540
- @db.extension(:foo).quote_identifiers?.must_equal true
2394
+ Sequel::Database.register_extension(:foo){|db| db.opts[:foo] = 1}
2395
+ @db.extension(:foo).opts[:foo].must_equal 1
2541
2396
  end
2542
2397
 
2543
2398
  it "should be able to register an extension with a callable and Database#extension call the callable" do
2544
- @db.quote_identifiers = false
2545
- Sequel::Database.register_extension(:foo, proc{|db| db.quote_identifiers = true})
2546
- @db.extension(:foo).quote_identifiers?.must_equal true
2399
+ Sequel::Database.register_extension(:foo, proc{|db| db.opts[:foo] = 1})
2400
+ @db.extension(:foo).opts[:foo].must_equal 1
2547
2401
  end
2548
2402
 
2549
2403
  it "should be able to load multiple extensions in the same call" do
2550
- @db.quote_identifiers = false
2551
- @db.identifier_input_method = :downcase
2552
- Sequel::Database.register_extension(:foo, proc{|db| db.quote_identifiers = true})
2553
- Sequel::Database.register_extension(:bar, proc{|db| db.identifier_input_method = nil})
2554
- @db.extension(:foo, :bar)
2555
- @db.quote_identifiers?.must_equal true
2556
- @db.identifier_input_method.must_equal nil
2404
+ a = []
2405
+ Sequel::Database.register_extension(:foo, proc{|db| a << db.opts[:foo] = 1})
2406
+ Sequel::Database.register_extension(:bar, proc{|db| a << db.opts[:bar] = 2})
2407
+ @db.extension(:foo, :bar).opts.values_at(:foo, :bar).must_equal [1, 2]
2408
+ a.must_equal [1, 2]
2557
2409
  end
2558
2410
 
2559
2411
  it "should return the receiver" do
@@ -2575,8 +2427,8 @@ describe "Database extensions" do
2575
2427
  Sequel::Database.extension(:foo, :bar)
2576
2428
  @db.wont_respond_to(:a)
2577
2429
  @db.wont_respond_to(:b)
2578
- Sequel.mock.a.must_equal 1
2579
- Sequel.mock.b.must_equal 2
2430
+ Sequel.mock(:identifier_mangling=>false).a.must_equal 1
2431
+ Sequel.mock(:identifier_mangling=>false).b.must_equal 2
2580
2432
  end
2581
2433
  end
2582
2434
 
@@ -2664,3 +2516,9 @@ describe "Database#execute_{dui,ddl,insert}" do
2664
2516
  @db.sqls.must_equal ["DELETE FROM table", "SET foo", "INSERT INTO table DEFAULT VALUES"]
2665
2517
  end
2666
2518
  end
2519
+
2520
+ describe "Dataset identifier folding" do
2521
+ it "should fold to uppercase by default, as per SQL" do
2522
+ Sequel::Database.new(:identifier_mangling=>false).send(:folds_unquoted_identifiers_to_uppercase?).must_equal true
2523
+ end
2524
+ end