sequel 3.28.0 → 3.29.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 (148) hide show
  1. data/CHANGELOG +119 -3
  2. data/Rakefile +5 -3
  3. data/bin/sequel +1 -5
  4. data/doc/model_hooks.rdoc +9 -1
  5. data/doc/opening_databases.rdoc +49 -40
  6. data/doc/prepared_statements.rdoc +27 -6
  7. data/doc/release_notes/3.28.0.txt +2 -2
  8. data/doc/release_notes/3.29.0.txt +459 -0
  9. data/doc/sharding.rdoc +7 -1
  10. data/doc/testing.rdoc +18 -9
  11. data/doc/transactions.rdoc +41 -1
  12. data/lib/sequel/adapters/ado.rb +28 -17
  13. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  14. data/lib/sequel/adapters/amalgalite.rb +11 -7
  15. data/lib/sequel/adapters/db2.rb +122 -70
  16. data/lib/sequel/adapters/dbi.rb +15 -15
  17. data/lib/sequel/adapters/do.rb +5 -36
  18. data/lib/sequel/adapters/do/mysql.rb +0 -5
  19. data/lib/sequel/adapters/do/postgres.rb +0 -5
  20. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  21. data/lib/sequel/adapters/firebird.rb +3 -6
  22. data/lib/sequel/adapters/ibmdb.rb +24 -16
  23. data/lib/sequel/adapters/informix.rb +2 -4
  24. data/lib/sequel/adapters/jdbc.rb +47 -11
  25. data/lib/sequel/adapters/jdbc/as400.rb +5 -24
  26. data/lib/sequel/adapters/jdbc/db2.rb +0 -5
  27. data/lib/sequel/adapters/jdbc/derby.rb +217 -0
  28. data/lib/sequel/adapters/jdbc/firebird.rb +0 -5
  29. data/lib/sequel/adapters/jdbc/h2.rb +10 -12
  30. data/lib/sequel/adapters/jdbc/hsqldb.rb +166 -0
  31. data/lib/sequel/adapters/jdbc/informix.rb +0 -5
  32. data/lib/sequel/adapters/jdbc/jtds.rb +0 -5
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -10
  34. data/lib/sequel/adapters/jdbc/oracle.rb +70 -3
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -11
  36. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
  37. data/lib/sequel/adapters/jdbc/sqlserver.rb +0 -5
  38. data/lib/sequel/adapters/jdbc/transactions.rb +56 -7
  39. data/lib/sequel/adapters/mock.rb +315 -0
  40. data/lib/sequel/adapters/mysql.rb +64 -51
  41. data/lib/sequel/adapters/mysql2.rb +15 -9
  42. data/lib/sequel/adapters/odbc.rb +13 -6
  43. data/lib/sequel/adapters/odbc/db2.rb +0 -4
  44. data/lib/sequel/adapters/odbc/mssql.rb +0 -5
  45. data/lib/sequel/adapters/openbase.rb +2 -4
  46. data/lib/sequel/adapters/oracle.rb +333 -51
  47. data/lib/sequel/adapters/postgres.rb +80 -27
  48. data/lib/sequel/adapters/shared/access.rb +0 -6
  49. data/lib/sequel/adapters/shared/db2.rb +13 -15
  50. data/lib/sequel/adapters/shared/firebird.rb +6 -6
  51. data/lib/sequel/adapters/shared/mssql.rb +23 -18
  52. data/lib/sequel/adapters/shared/mysql.rb +6 -6
  53. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +6 -0
  54. data/lib/sequel/adapters/shared/oracle.rb +185 -30
  55. data/lib/sequel/adapters/shared/postgres.rb +35 -18
  56. data/lib/sequel/adapters/shared/progress.rb +0 -6
  57. data/lib/sequel/adapters/shared/sqlite.rb +116 -37
  58. data/lib/sequel/adapters/sqlite.rb +16 -8
  59. data/lib/sequel/adapters/swift.rb +5 -5
  60. data/lib/sequel/adapters/swift/mysql.rb +0 -5
  61. data/lib/sequel/adapters/swift/postgres.rb +0 -5
  62. data/lib/sequel/adapters/swift/sqlite.rb +6 -4
  63. data/lib/sequel/adapters/tinytds.rb +13 -10
  64. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -0
  65. data/lib/sequel/core.rb +40 -0
  66. data/lib/sequel/database/connecting.rb +1 -2
  67. data/lib/sequel/database/dataset.rb +3 -3
  68. data/lib/sequel/database/dataset_defaults.rb +58 -0
  69. data/lib/sequel/database/misc.rb +62 -2
  70. data/lib/sequel/database/query.rb +113 -49
  71. data/lib/sequel/database/schema_methods.rb +7 -2
  72. data/lib/sequel/dataset/actions.rb +37 -19
  73. data/lib/sequel/dataset/features.rb +24 -0
  74. data/lib/sequel/dataset/graph.rb +7 -6
  75. data/lib/sequel/dataset/misc.rb +11 -3
  76. data/lib/sequel/dataset/mutation.rb +2 -3
  77. data/lib/sequel/dataset/prepared_statements.rb +6 -4
  78. data/lib/sequel/dataset/query.rb +46 -15
  79. data/lib/sequel/dataset/sql.rb +28 -4
  80. data/lib/sequel/extensions/named_timezones.rb +5 -0
  81. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  82. data/lib/sequel/model.rb +2 -1
  83. data/lib/sequel/model/associations.rb +115 -33
  84. data/lib/sequel/model/base.rb +91 -31
  85. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  86. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  87. data/lib/sequel/plugins/force_encoding.rb +6 -6
  88. data/lib/sequel/plugins/identity_map.rb +1 -1
  89. data/lib/sequel/plugins/many_through_many.rb +6 -10
  90. data/lib/sequel/plugins/prepared_statements.rb +12 -1
  91. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -1
  92. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  93. data/lib/sequel/plugins/serialization.rb +6 -1
  94. data/lib/sequel/plugins/sharding.rb +0 -5
  95. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  96. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  97. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  98. data/lib/sequel/timezones.rb +42 -42
  99. data/lib/sequel/version.rb +1 -1
  100. data/spec/adapters/mssql_spec.rb +29 -29
  101. data/spec/adapters/mysql_spec.rb +86 -104
  102. data/spec/adapters/oracle_spec.rb +48 -76
  103. data/spec/adapters/postgres_spec.rb +98 -33
  104. data/spec/adapters/spec_helper.rb +0 -5
  105. data/spec/adapters/sqlite_spec.rb +24 -21
  106. data/spec/core/connection_pool_spec.rb +9 -15
  107. data/spec/core/core_sql_spec.rb +20 -31
  108. data/spec/core/database_spec.rb +491 -227
  109. data/spec/core/dataset_spec.rb +638 -1051
  110. data/spec/core/expression_filters_spec.rb +0 -1
  111. data/spec/core/mock_adapter_spec.rb +378 -0
  112. data/spec/core/object_graph_spec.rb +48 -114
  113. data/spec/core/schema_generator_spec.rb +3 -3
  114. data/spec/core/schema_spec.rb +51 -114
  115. data/spec/core/spec_helper.rb +3 -90
  116. data/spec/extensions/class_table_inheritance_spec.rb +1 -1
  117. data/spec/extensions/dataset_associations_spec.rb +199 -0
  118. data/spec/extensions/instance_hooks_spec.rb +71 -0
  119. data/spec/extensions/named_timezones_spec.rb +22 -2
  120. data/spec/extensions/nested_attributes_spec.rb +3 -0
  121. data/spec/extensions/schema_spec.rb +1 -1
  122. data/spec/extensions/serialization_modification_detection_spec.rb +1 -0
  123. data/spec/extensions/serialization_spec.rb +5 -8
  124. data/spec/extensions/spec_helper.rb +4 -0
  125. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  126. data/spec/extensions/typecast_on_load_spec.rb +1 -6
  127. data/spec/integration/associations_test.rb +123 -12
  128. data/spec/integration/dataset_test.rb +140 -47
  129. data/spec/integration/eager_loader_test.rb +19 -21
  130. data/spec/integration/model_test.rb +80 -1
  131. data/spec/integration/plugin_test.rb +179 -128
  132. data/spec/integration/prepared_statement_test.rb +92 -91
  133. data/spec/integration/schema_test.rb +42 -23
  134. data/spec/integration/spec_helper.rb +25 -31
  135. data/spec/integration/timezone_test.rb +38 -12
  136. data/spec/integration/transaction_test.rb +161 -34
  137. data/spec/integration/type_test.rb +3 -3
  138. data/spec/model/association_reflection_spec.rb +83 -7
  139. data/spec/model/associations_spec.rb +393 -676
  140. data/spec/model/base_spec.rb +186 -116
  141. data/spec/model/dataset_methods_spec.rb +7 -27
  142. data/spec/model/eager_loading_spec.rb +343 -867
  143. data/spec/model/hooks_spec.rb +160 -79
  144. data/spec/model/model_spec.rb +118 -165
  145. data/spec/model/plugins_spec.rb +7 -13
  146. data/spec/model/record_spec.rb +138 -207
  147. data/spec/model/spec_helper.rb +10 -73
  148. metadata +14 -8
@@ -9,7 +9,6 @@ describe "Simple Dataset operations" do
9
9
  end
10
10
  @ds = @db[:items]
11
11
  @ds.insert(:number=>10)
12
- clear_sqls
13
12
  end
14
13
  after do
15
14
  @db.drop_table(:items)
@@ -35,7 +34,29 @@ describe "Simple Dataset operations" do
35
34
  @ds.filter(:id=>2).first[:number].should == 20
36
35
  end
37
36
 
38
- cspecify "should have insert work correctly when inserting a row with all NULL values", :db2 do
37
+ specify "should have insert work correctly with static SQL" do
38
+ @db["INSERT INTO #{@ds.literal(:items)} (#{@ds.literal(:number)}) VALUES (20)"].insert
39
+ @ds.filter(:id=>2).first[:number].should == 20
40
+ end
41
+
42
+ specify "should join correctly" do
43
+ @ds.join(:items___b, :id=>:id).select_all(:items).all.should == [{:id=>1, :number=>10}]
44
+ end
45
+
46
+ specify "should correctly deal with qualified columns and subselects" do
47
+ @ds.from_self(:alias=>:a).select(:a__id, :number.qualify(:a)).all.should == [{:id=>1, :number=>10}]
48
+ @ds.join(@ds.as(:a), :id=>:id).select(:a__id, :number.qualify(:a)).all.should == [{:id=>1, :number=>10}]
49
+ end
50
+
51
+ specify "should graph correctly" do
52
+ @ds.graph(:items, {:id=>:id}, :table_alias=>:b).all.should == [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
53
+ end
54
+
55
+ specify "should graph correctly with a subselect" do
56
+ @ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).all.should == [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
57
+ end
58
+
59
+ cspecify "should have insert work correctly when inserting a row with all NULL values", :hsqldb do
39
60
  @db.create_table!(:items) do
40
61
  String :name
41
62
  Integer :number
@@ -89,6 +110,13 @@ describe "Simple Dataset operations" do
89
110
  @ds.order(:id).limit(2, 1).all.should == [{:id=>2, :number=>20}]
90
111
  end
91
112
 
113
+ specify "should provide correct columns when using a limit and offset" do
114
+ ds = @ds.order(:id).limit(1, 1)
115
+ ds.all
116
+ ds.columns.should == [:id, :number]
117
+ @ds.order(:id).limit(1, 1).columns.should == [:id, :number]
118
+ end
119
+
92
120
  specify "should fetch correctly with a limit and offset for different combinations of from and join tables" do
93
121
  @db.create_table!(:items2){primary_key :id2; Integer :number2}
94
122
  @db[:items2].insert(:number2=>10)
@@ -106,7 +134,7 @@ describe "Simple Dataset operations" do
106
134
  @db.drop_table(:items2)
107
135
  end
108
136
 
109
- cspecify "should fetch correctly with a limit and offset without an order", :db2, :mssql do
137
+ cspecify "should fetch correctly with a limit and offset without an order", :db2, :mssql, :oracle do
110
138
  @ds.limit(2, 1).all.should == []
111
139
  end
112
140
 
@@ -145,7 +173,6 @@ describe Sequel::Dataset do
145
173
  Integer :value
146
174
  end
147
175
  @d = INTEGRATION_DB[:test]
148
- clear_sqls
149
176
  end
150
177
  after do
151
178
  INTEGRATION_DB.drop_table(:test)
@@ -237,7 +264,11 @@ describe Sequel::Database do
237
264
  INTEGRATION_DB.drop_table(t) rescue nil
238
265
  INTEGRATION_DB.table_exists?(t).should == false
239
266
  INTEGRATION_DB.create_table(t){Integer :a}
240
- INTEGRATION_DB.table_exists?(t).should == true
267
+ begin
268
+ INTEGRATION_DB.table_exists?(t).should == true
269
+ ensure
270
+ INTEGRATION_DB.drop_table(t)
271
+ end
241
272
  end
242
273
  end
243
274
 
@@ -301,15 +332,14 @@ end
301
332
 
302
333
  describe "Simple Dataset operations in transactions" do
303
334
  before do
304
- INTEGRATION_DB.create_table!(:items_insert_in_transaction) do
335
+ INTEGRATION_DB.create_table!(:items) do
305
336
  primary_key :id
306
337
  integer :number
307
338
  end
308
- @ds = INTEGRATION_DB[:items_insert_in_transaction]
309
- clear_sqls
339
+ @ds = INTEGRATION_DB[:items]
310
340
  end
311
341
  after do
312
- INTEGRATION_DB.drop_table(:items_insert_in_transaction)
342
+ INTEGRATION_DB.drop_table(:items)
313
343
  end
314
344
 
315
345
  cspecify "should insert correctly with a primary key specified inside a transaction", :db2, :mssql do
@@ -343,7 +373,6 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
343
373
  @ds2 = INTEGRATION_DB[:i2]
344
374
  @ds2.insert(:number=>10)
345
375
  @ds2.insert(:number=>30)
346
- clear_sqls
347
376
  end
348
377
 
349
378
  specify "should give the correct results for simple UNION, EXCEPT, and INTERSECT" do
@@ -409,7 +438,7 @@ end
409
438
 
410
439
  if INTEGRATION_DB.dataset.supports_cte?
411
440
  describe "Common Table Expressions" do
412
- before do
441
+ before(:all) do
413
442
  @db = INTEGRATION_DB
414
443
  @db.create_table!(:i1){Integer :id; Integer :parent_id}
415
444
  @ds = @db[:i1]
@@ -420,7 +449,7 @@ if INTEGRATION_DB.dataset.supports_cte?
420
449
  @ds.insert(:id=>5, :parent_id=>3)
421
450
  @ds.insert(:id=>6, :parent_id=>5)
422
451
  end
423
- after do
452
+ after(:all) do
424
453
  @db.drop_table(:i1)
425
454
  end
426
455
 
@@ -441,6 +470,24 @@ if INTEGRATION_DB.dataset.supports_cte?
441
470
  @ds.inner_join(@db[:t].with(:t, @ds.filter(:parent_id=>nil)), :id => :id).select(:i1__id).order(:i1__id).map(:id).should == [1,2]
442
471
  @db[:t].with(:t, @ds).inner_join(@db[:s].with(:s, @ds.filter(:parent_id=>nil)), :id => :id).select(:t__id).order(:t__id).map(:id).should == [1,2]
443
472
  end
473
+
474
+ specify "should support a subselect in the FROM clause with a CTE" do
475
+ @ds.from(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
476
+ @db[:t].with(:t, @ds).from_self.select_order_map(:id).should == [1,2,3,4,5,6]
477
+ end
478
+
479
+ specify "should support using a CTE inside a CTE" do
480
+ @db[:s].with(:s, @db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
481
+ @db[:s].with_recursive(:s, @db[:t].with(:t, @ds), @db[:t2].with(:t2, @ds)).select_order_map(:id).should == [1,1,2,2,3,3,4,4,5,5,6,6]
482
+ end
483
+
484
+ specify "should support using a CTE inside UNION/EXCEPT/INTERSECT" do
485
+ @ds.union(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
486
+ if @ds.supports_intersect_except?
487
+ @ds.intersect(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
488
+ @ds.except(@db[:t].with(:t, @ds)).select_order_map(:id).should == []
489
+ end
490
+ end
444
491
  end
445
492
  end
446
493
 
@@ -532,7 +579,7 @@ end
532
579
 
533
580
  if INTEGRATION_DB.dataset.supports_window_functions?
534
581
  describe "Window Functions" do
535
- before do
582
+ before(:all) do
536
583
  @db = INTEGRATION_DB
537
584
  @db.create_table!(:i1){Integer :id; Integer :group_id; Integer :amount}
538
585
  @ds = @db[:i1].order(:id)
@@ -543,7 +590,7 @@ if INTEGRATION_DB.dataset.supports_window_functions?
543
590
  @ds.insert(:id=>5, :group_id=>2, :amount=>10000)
544
591
  @ds.insert(:id=>6, :group_id=>2, :amount=>100000)
545
592
  end
546
- after do
593
+ after(:all) do
547
594
  @db.drop_table(:i1)
548
595
  end
549
596
 
@@ -602,7 +649,7 @@ describe Sequel::SQL::Constants do
602
649
  @db.drop_table(:constants) if @db.table_exists?(:constants)
603
650
  end
604
651
 
605
- cspecify "should have working CURRENT_DATE", [:odbc, :mssql], [:jdbc, :sqlite] do
652
+ cspecify "should have working CURRENT_DATE", [:odbc, :mssql], [:jdbc, :sqlite], :oracle do
606
653
  @db.create_table!(:constants){Date :d}
607
654
  @ds.insert(:d=>Sequel::CURRENT_DATE)
608
655
  d = @c2[@ds.get(:d)]
@@ -613,26 +660,27 @@ describe Sequel::SQL::Constants do
613
660
  cspecify "should have working CURRENT_TIME", [:do, :mysql], [:jdbc, :sqlite], [:mysql2] do
614
661
  @db.create_table!(:constants){Time :t, :only_time=>true}
615
662
  @ds.insert(:t=>Sequel::CURRENT_TIME)
616
- (Time.now - @c[@ds.get(:t)]).should be_within(1).of(0)
663
+ (Time.now - @c[@ds.get(:t)]).should be_within(2).of(0)
617
664
  end
618
665
 
619
666
  cspecify "should have working CURRENT_TIMESTAMP", [:jdbc, :sqlite] do
620
667
  @db.create_table!(:constants){DateTime :ts}
621
668
  @ds.insert(:ts=>Sequel::CURRENT_TIMESTAMP)
622
- (Time.now - @c[@ds.get(:ts)]).should be_within(1).of(0)
669
+ (Time.now - @c[@ds.get(:ts)]).should be_within(2).of(0)
623
670
  end
624
671
  end
625
672
 
626
673
  describe "Sequel::Dataset#import and #multi_insert" do
627
- before do
674
+ before(:all) do
628
675
  @db = INTEGRATION_DB
629
676
  @db.create_table!(:imp){Integer :i}
630
- @db.create_table!(:exp2){Integer :i}
631
677
  @ids = @db[:imp].order(:i)
632
- @eds = @db[:exp2]
633
678
  end
634
- after do
635
- @db.drop_table(:imp, :exp2)
679
+ before do
680
+ @ids.delete
681
+ end
682
+ after(:all) do
683
+ @db.drop_table(:imp)
636
684
  end
637
685
 
638
686
  it "should import with multi_insert and an array of hashes" do
@@ -646,9 +694,11 @@ describe "Sequel::Dataset#import and #multi_insert" do
646
694
  end
647
695
 
648
696
  it "should import with a dataset" do
649
- @eds.import([:i], [[10], [20]])
650
- @ids.import([:i], @eds)
697
+ @db.create_table!(:exp2){Integer :i}
698
+ @db[:exp2].import([:i], [[10], [20]])
699
+ @ids.import([:i], @db[:exp2])
651
700
  @ids.all.should == [{:i=>10}, {:i=>20}]
701
+ @db.drop_table(:exp2)
652
702
  end
653
703
 
654
704
  it "should have import work with the :slice_size option" do
@@ -664,12 +714,15 @@ describe "Sequel::Dataset#import and #multi_insert" do
664
714
  end
665
715
 
666
716
  describe "Sequel::Dataset convenience methods" do
667
- before do
717
+ before(:all) do
668
718
  @db = INTEGRATION_DB
669
719
  @db.create_table!(:a){Integer :a; Integer :b}
670
720
  @ds = @db[:a].order(:a)
671
721
  end
672
- after do
722
+ before do
723
+ @ds.delete
724
+ end
725
+ after(:all) do
673
726
  @db.drop_table(:a)
674
727
  end
675
728
 
@@ -723,12 +776,15 @@ describe "Sequel::Dataset convenience methods" do
723
776
  end
724
777
 
725
778
  describe "Sequel::Dataset main SQL methods" do
726
- before do
779
+ before(:all) do
727
780
  @db = INTEGRATION_DB
728
781
  @db.create_table!(:a){Integer :a; Integer :b}
729
782
  @ds = @db[:a].order(:a)
730
783
  end
731
- after do
784
+ before do
785
+ @ds.delete
786
+ end
787
+ after(:all) do
732
788
  @db.drop_table(:a)
733
789
  end
734
790
 
@@ -791,14 +847,17 @@ describe "Sequel::Dataset main SQL methods" do
791
847
  end
792
848
 
793
849
  describe "Sequel::Dataset convenience methods" do
794
- before do
850
+ before(:all) do
795
851
  @db = INTEGRATION_DB
796
852
  @db.create_table!(:a){Integer :a; Integer :b; Integer :c; Integer :d}
797
853
  @ds = @db[:a].order(:a)
854
+ end
855
+ before do
856
+ @ds.delete
798
857
  @ds.insert(1, 2, 3, 4)
799
858
  @ds.insert(5, 6, 7, 8)
800
859
  end
801
- after do
860
+ after(:all) do
802
861
  @db.drop_table(:a)
803
862
  end
804
863
 
@@ -822,6 +881,7 @@ describe "Sequel::Dataset convenience methods" do
822
881
  specify "should have working #select_map" do
823
882
  @ds.select_map(:a).should == [1, 5]
824
883
  @ds.select_map(:b).should == [2, 6]
884
+ @ds.select_map([:a]).should == [[1], [5]]
825
885
  @ds.select_map([:a, :b]).should == [[1, 2], [5, 6]]
826
886
 
827
887
  @ds.select_map(:a___e).should == [1, 5]
@@ -838,6 +898,7 @@ describe "Sequel::Dataset convenience methods" do
838
898
  @ds.select_order_map(:a__b.desc).should == [6, 2]
839
899
  @ds.select_order_map(:a__b___e.desc).should == [6, 2]
840
900
  @ds.select_order_map(:b.qualify(:a).as(:e)).should == [2, 6]
901
+ @ds.select_order_map([:a]).should == [[1], [5]]
841
902
  @ds.select_order_map([:a.desc, :b]).should == [[5, 6], [1, 2]]
842
903
 
843
904
  @ds.select_order_map(:a___e).should == [1, 5]
@@ -862,12 +923,15 @@ describe "Sequel::Dataset convenience methods" do
862
923
  end
863
924
 
864
925
  describe "Sequel::Dataset DSL support" do
865
- before do
926
+ before(:all) do
866
927
  @db = INTEGRATION_DB
867
928
  @db.create_table!(:a){Integer :a; Integer :b}
868
929
  @ds = @db[:a].order(:a)
869
930
  end
870
- after do
931
+ before do
932
+ @ds.delete
933
+ end
934
+ after(:all) do
871
935
  @db.drop_table(:a)
872
936
  end
873
937
 
@@ -879,31 +943,36 @@ describe "Sequel::Dataset DSL support" do
879
943
  @ds.get{a / b}.to_i.should == 2
880
944
  end
881
945
 
882
- specify "should work with bitwise shift operators" do
946
+ cspecify "should work with bitwise shift operators", :derby do
883
947
  @ds.insert(3, 2)
884
948
  @ds.get{a.sql_number << b}.to_i.should == 12
885
949
  @ds.get{a.sql_number >> b}.to_i.should == 0
950
+ @ds.get{a.sql_number << b << 1}.to_i.should == 24
886
951
  @ds.delete
887
952
  @ds.insert(3, 1)
888
953
  @ds.get{a.sql_number << b}.to_i.should == 6
889
954
  @ds.get{a.sql_number >> b}.to_i.should == 1
955
+ @ds.get{a.sql_number >> b >> 1}.to_i.should == 0
890
956
  end
891
957
 
892
- specify "should work with bitwise AND and OR operators" do
958
+ cspecify "should work with bitwise AND and OR operators", :derby do
893
959
  @ds.insert(3, 5)
894
960
  @ds.get{a.sql_number | b}.to_i.should == 7
895
961
  @ds.get{a.sql_number & b}.to_i.should == 1
962
+ @ds.get{a.sql_number | b | 8}.to_i.should == 15
963
+ @ds.get{a.sql_number & b & 8}.to_i.should == 0
896
964
  end
897
965
 
898
- cspecify "should work with the bitwise compliment operator", :h2 do
966
+ specify "should work with the bitwise compliment operator" do
899
967
  @ds.insert(-3, 3)
900
968
  @ds.get{~a.sql_number}.to_i.should == 2
901
969
  @ds.get{~b.sql_number}.to_i.should == -4
902
970
  end
903
971
 
904
- specify "should work with the bitwise xor operator" do
972
+ cspecify "should work with the bitwise xor operator", :derby do
905
973
  @ds.insert(3, 5)
906
974
  @ds.get{a.sql_number ^ b}.to_i.should == 6
975
+ @ds.get{a.sql_number ^ b ^ 1}.to_i.should == 7
907
976
  end
908
977
 
909
978
  specify "should work with inequality operators" do
@@ -1077,12 +1146,15 @@ describe "SQL Extract Function" do
1077
1146
  end
1078
1147
 
1079
1148
  describe "Dataset string methods" do
1080
- before do
1149
+ before(:all) do
1081
1150
  @db = INTEGRATION_DB
1082
1151
  @db.create_table!(:a){String :a; String :b}
1083
1152
  @ds = @db[:a].order(:a)
1084
1153
  end
1085
- after do
1154
+ before do
1155
+ @ds.delete
1156
+ end
1157
+ after(:all) do
1086
1158
  @db.drop_table(:a)
1087
1159
  end
1088
1160
 
@@ -1097,15 +1169,15 @@ describe "Dataset string methods" do
1097
1169
  end
1098
1170
 
1099
1171
  it "#grep should work with :all_patterns and :all_columns options" do
1100
- @ds.insert('foo bar', '')
1172
+ @ds.insert('foo bar', ' ')
1101
1173
  @ds.insert('foo d', 'bar')
1102
- @ds.insert('foo e', '')
1103
- @ds.insert('', 'bar')
1174
+ @ds.insert('foo e', ' ')
1175
+ @ds.insert(' ', 'bar')
1104
1176
  @ds.insert('foo f', 'baz')
1105
1177
  @ds.insert('foo baz', 'bar baz')
1106
1178
  @ds.insert('foo boo', 'boo foo')
1107
1179
 
1108
- @ds.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true).all.should == [{:a=>'foo bar', :b=>''}, {:a=>'foo baz', :b=>'bar baz'}, {:a=>'foo d', :b=>'bar'}]
1180
+ @ds.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true).all.should == [{:a=>'foo bar', :b=>' '}, {:a=>'foo baz', :b=>'bar baz'}, {:a=>'foo d', :b=>'bar'}]
1109
1181
  @ds.grep([:a, :b], %w'%foo% %bar% %blob%', :all_patterns=>true).all.should == []
1110
1182
 
1111
1183
  @ds.grep([:a, :b], %w'%bar% %foo%', :all_columns=>true).all.should == [{:a=>"foo baz", :b=>"bar baz"}, {:a=>"foo boo", :b=>"boo foo"}, {:a=>"foo d", :b=>"bar"}]
@@ -1120,6 +1192,19 @@ describe "Dataset string methods" do
1120
1192
  @ds.filter(:a.like('foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1121
1193
  @ds.filter(:a.like('bar')).all.should == []
1122
1194
  @ds.filter(:a.like('foo', 'bar')).all.should == [{:a=>'foo', :b=>'bar'}]
1195
+ @ds.exclude(:a.like('foo')).all.should == []
1196
+ @ds.exclude(:a.like('bar')).all.should == [{:a=>'foo', :b=>'bar'}]
1197
+ @ds.exclude(:a.like('foo', 'bar')).all.should == []
1198
+ end
1199
+
1200
+ it "#like should be case sensitive" do
1201
+ @ds.insert('foo', 'bar')
1202
+ @ds.filter(:a.like('Foo')).all.should == []
1203
+ @ds.filter(:a.like('baR')).all.should == []
1204
+ @ds.filter(:a.like('FOO', 'BAR')).all.should == []
1205
+ @ds.exclude(:a.like('Foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1206
+ @ds.exclude(:a.like('baR')).all.should == [{:a=>'foo', :b=>'bar'}]
1207
+ @ds.exclude(:a.like('FOO', 'BAR')).all.should == [{:a=>'foo', :b=>'bar'}]
1123
1208
  end
1124
1209
 
1125
1210
  it "#ilike should return matching rows, in a case insensitive manner" do
@@ -1127,6 +1212,9 @@ describe "Dataset string methods" do
1127
1212
  @ds.filter(:a.ilike('Foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1128
1213
  @ds.filter(:a.ilike('baR')).all.should == []
1129
1214
  @ds.filter(:a.ilike('FOO', 'BAR')).all.should == [{:a=>'foo', :b=>'bar'}]
1215
+ @ds.exclude(:a.ilike('Foo')).all.should == []
1216
+ @ds.exclude(:a.ilike('baR')).all.should == [{:a=>'foo', :b=>'bar'}]
1217
+ @ds.exclude(:a.ilike('FOO', 'BAR')).all.should == []
1130
1218
  end
1131
1219
 
1132
1220
  it "should work with strings created with sql_string_join" do
@@ -1137,7 +1225,7 @@ describe "Dataset string methods" do
1137
1225
  end
1138
1226
 
1139
1227
  describe "Dataset identifier methods" do
1140
- before do
1228
+ before(:all) do
1141
1229
  class ::String
1142
1230
  def uprev
1143
1231
  upcase.reverse
@@ -1145,10 +1233,12 @@ describe "Dataset identifier methods" do
1145
1233
  end
1146
1234
  @db = INTEGRATION_DB
1147
1235
  @db.create_table!(:a){Integer :ab}
1236
+ @db[:a].insert(1)
1237
+ end
1238
+ before do
1148
1239
  @ds = @db[:a].order(:ab)
1149
- @ds.insert(1)
1150
1240
  end
1151
- after do
1241
+ after(:all) do
1152
1242
  @db.drop_table(:a)
1153
1243
  end
1154
1244
 
@@ -1166,12 +1256,15 @@ describe "Dataset identifier methods" do
1166
1256
  end
1167
1257
 
1168
1258
  describe "Dataset defaults and overrides" do
1169
- before do
1259
+ before(:all) do
1170
1260
  @db = INTEGRATION_DB
1171
1261
  @db.create_table!(:a){Integer :a}
1172
1262
  @ds = @db[:a].order(:a)
1173
1263
  end
1174
- after do
1264
+ before do
1265
+ @ds.delete
1266
+ end
1267
+ after(:all) do
1175
1268
  @db.drop_table(:a)
1176
1269
  end
1177
1270