viking-sequel 3.10.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 (237) hide show
  1. data/CHANGELOG +3134 -0
  2. data/COPYING +19 -0
  3. data/README.rdoc +723 -0
  4. data/Rakefile +193 -0
  5. data/bin/sequel +196 -0
  6. data/doc/advanced_associations.rdoc +644 -0
  7. data/doc/cheat_sheet.rdoc +218 -0
  8. data/doc/dataset_basics.rdoc +106 -0
  9. data/doc/dataset_filtering.rdoc +158 -0
  10. data/doc/opening_databases.rdoc +296 -0
  11. data/doc/prepared_statements.rdoc +104 -0
  12. data/doc/reflection.rdoc +84 -0
  13. data/doc/release_notes/1.0.txt +38 -0
  14. data/doc/release_notes/1.1.txt +143 -0
  15. data/doc/release_notes/1.3.txt +101 -0
  16. data/doc/release_notes/1.4.0.txt +53 -0
  17. data/doc/release_notes/1.5.0.txt +155 -0
  18. data/doc/release_notes/2.0.0.txt +298 -0
  19. data/doc/release_notes/2.1.0.txt +271 -0
  20. data/doc/release_notes/2.10.0.txt +328 -0
  21. data/doc/release_notes/2.11.0.txt +215 -0
  22. data/doc/release_notes/2.12.0.txt +534 -0
  23. data/doc/release_notes/2.2.0.txt +253 -0
  24. data/doc/release_notes/2.3.0.txt +88 -0
  25. data/doc/release_notes/2.4.0.txt +106 -0
  26. data/doc/release_notes/2.5.0.txt +137 -0
  27. data/doc/release_notes/2.6.0.txt +157 -0
  28. data/doc/release_notes/2.7.0.txt +166 -0
  29. data/doc/release_notes/2.8.0.txt +171 -0
  30. data/doc/release_notes/2.9.0.txt +97 -0
  31. data/doc/release_notes/3.0.0.txt +221 -0
  32. data/doc/release_notes/3.1.0.txt +406 -0
  33. data/doc/release_notes/3.10.0.txt +286 -0
  34. data/doc/release_notes/3.2.0.txt +268 -0
  35. data/doc/release_notes/3.3.0.txt +192 -0
  36. data/doc/release_notes/3.4.0.txt +325 -0
  37. data/doc/release_notes/3.5.0.txt +510 -0
  38. data/doc/release_notes/3.6.0.txt +366 -0
  39. data/doc/release_notes/3.7.0.txt +179 -0
  40. data/doc/release_notes/3.8.0.txt +151 -0
  41. data/doc/release_notes/3.9.0.txt +233 -0
  42. data/doc/schema.rdoc +36 -0
  43. data/doc/sharding.rdoc +113 -0
  44. data/doc/virtual_rows.rdoc +205 -0
  45. data/lib/sequel.rb +1 -0
  46. data/lib/sequel/adapters/ado.rb +90 -0
  47. data/lib/sequel/adapters/ado/mssql.rb +30 -0
  48. data/lib/sequel/adapters/amalgalite.rb +176 -0
  49. data/lib/sequel/adapters/db2.rb +139 -0
  50. data/lib/sequel/adapters/dbi.rb +113 -0
  51. data/lib/sequel/adapters/do.rb +188 -0
  52. data/lib/sequel/adapters/do/mysql.rb +49 -0
  53. data/lib/sequel/adapters/do/postgres.rb +91 -0
  54. data/lib/sequel/adapters/do/sqlite.rb +40 -0
  55. data/lib/sequel/adapters/firebird.rb +283 -0
  56. data/lib/sequel/adapters/informix.rb +77 -0
  57. data/lib/sequel/adapters/jdbc.rb +587 -0
  58. data/lib/sequel/adapters/jdbc/as400.rb +58 -0
  59. data/lib/sequel/adapters/jdbc/h2.rb +133 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +57 -0
  61. data/lib/sequel/adapters/jdbc/mysql.rb +78 -0
  62. data/lib/sequel/adapters/jdbc/oracle.rb +50 -0
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +108 -0
  64. data/lib/sequel/adapters/jdbc/sqlite.rb +55 -0
  65. data/lib/sequel/adapters/mysql.rb +421 -0
  66. data/lib/sequel/adapters/odbc.rb +143 -0
  67. data/lib/sequel/adapters/odbc/mssql.rb +42 -0
  68. data/lib/sequel/adapters/openbase.rb +64 -0
  69. data/lib/sequel/adapters/oracle.rb +131 -0
  70. data/lib/sequel/adapters/postgres.rb +504 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +490 -0
  72. data/lib/sequel/adapters/shared/mysql.rb +498 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +195 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +830 -0
  75. data/lib/sequel/adapters/shared/progress.rb +44 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +389 -0
  77. data/lib/sequel/adapters/sqlite.rb +224 -0
  78. data/lib/sequel/adapters/utils/stored_procedures.rb +84 -0
  79. data/lib/sequel/connection_pool.rb +99 -0
  80. data/lib/sequel/connection_pool/sharded_single.rb +84 -0
  81. data/lib/sequel/connection_pool/sharded_threaded.rb +211 -0
  82. data/lib/sequel/connection_pool/single.rb +29 -0
  83. data/lib/sequel/connection_pool/threaded.rb +150 -0
  84. data/lib/sequel/core.rb +293 -0
  85. data/lib/sequel/core_sql.rb +241 -0
  86. data/lib/sequel/database.rb +1079 -0
  87. data/lib/sequel/database/schema_generator.rb +327 -0
  88. data/lib/sequel/database/schema_methods.rb +203 -0
  89. data/lib/sequel/database/schema_sql.rb +320 -0
  90. data/lib/sequel/dataset.rb +32 -0
  91. data/lib/sequel/dataset/actions.rb +441 -0
  92. data/lib/sequel/dataset/features.rb +86 -0
  93. data/lib/sequel/dataset/graph.rb +254 -0
  94. data/lib/sequel/dataset/misc.rb +119 -0
  95. data/lib/sequel/dataset/mutation.rb +64 -0
  96. data/lib/sequel/dataset/prepared_statements.rb +227 -0
  97. data/lib/sequel/dataset/query.rb +709 -0
  98. data/lib/sequel/dataset/sql.rb +996 -0
  99. data/lib/sequel/exceptions.rb +51 -0
  100. data/lib/sequel/extensions/blank.rb +43 -0
  101. data/lib/sequel/extensions/inflector.rb +242 -0
  102. data/lib/sequel/extensions/looser_typecasting.rb +21 -0
  103. data/lib/sequel/extensions/migration.rb +239 -0
  104. data/lib/sequel/extensions/named_timezones.rb +61 -0
  105. data/lib/sequel/extensions/pagination.rb +100 -0
  106. data/lib/sequel/extensions/pretty_table.rb +82 -0
  107. data/lib/sequel/extensions/query.rb +52 -0
  108. data/lib/sequel/extensions/schema_dumper.rb +271 -0
  109. data/lib/sequel/extensions/sql_expr.rb +122 -0
  110. data/lib/sequel/extensions/string_date_time.rb +46 -0
  111. data/lib/sequel/extensions/thread_local_timezones.rb +48 -0
  112. data/lib/sequel/metaprogramming.rb +9 -0
  113. data/lib/sequel/model.rb +120 -0
  114. data/lib/sequel/model/associations.rb +1514 -0
  115. data/lib/sequel/model/base.rb +1069 -0
  116. data/lib/sequel/model/default_inflections.rb +45 -0
  117. data/lib/sequel/model/errors.rb +39 -0
  118. data/lib/sequel/model/exceptions.rb +21 -0
  119. data/lib/sequel/model/inflections.rb +162 -0
  120. data/lib/sequel/model/plugins.rb +70 -0
  121. data/lib/sequel/plugins/active_model.rb +59 -0
  122. data/lib/sequel/plugins/association_dependencies.rb +103 -0
  123. data/lib/sequel/plugins/association_proxies.rb +41 -0
  124. data/lib/sequel/plugins/boolean_readers.rb +53 -0
  125. data/lib/sequel/plugins/caching.rb +141 -0
  126. data/lib/sequel/plugins/class_table_inheritance.rb +214 -0
  127. data/lib/sequel/plugins/composition.rb +138 -0
  128. data/lib/sequel/plugins/force_encoding.rb +72 -0
  129. data/lib/sequel/plugins/hook_class_methods.rb +126 -0
  130. data/lib/sequel/plugins/identity_map.rb +116 -0
  131. data/lib/sequel/plugins/instance_filters.rb +98 -0
  132. data/lib/sequel/plugins/instance_hooks.rb +57 -0
  133. data/lib/sequel/plugins/lazy_attributes.rb +77 -0
  134. data/lib/sequel/plugins/many_through_many.rb +208 -0
  135. data/lib/sequel/plugins/nested_attributes.rb +206 -0
  136. data/lib/sequel/plugins/optimistic_locking.rb +81 -0
  137. data/lib/sequel/plugins/rcte_tree.rb +281 -0
  138. data/lib/sequel/plugins/schema.rb +66 -0
  139. data/lib/sequel/plugins/serialization.rb +166 -0
  140. data/lib/sequel/plugins/single_table_inheritance.rb +74 -0
  141. data/lib/sequel/plugins/subclasses.rb +45 -0
  142. data/lib/sequel/plugins/tactical_eager_loading.rb +61 -0
  143. data/lib/sequel/plugins/timestamps.rb +87 -0
  144. data/lib/sequel/plugins/touch.rb +118 -0
  145. data/lib/sequel/plugins/typecast_on_load.rb +72 -0
  146. data/lib/sequel/plugins/validation_class_methods.rb +405 -0
  147. data/lib/sequel/plugins/validation_helpers.rb +223 -0
  148. data/lib/sequel/sql.rb +1020 -0
  149. data/lib/sequel/timezones.rb +161 -0
  150. data/lib/sequel/version.rb +12 -0
  151. data/lib/sequel_core.rb +1 -0
  152. data/lib/sequel_model.rb +1 -0
  153. data/spec/adapters/firebird_spec.rb +407 -0
  154. data/spec/adapters/informix_spec.rb +97 -0
  155. data/spec/adapters/mssql_spec.rb +403 -0
  156. data/spec/adapters/mysql_spec.rb +1019 -0
  157. data/spec/adapters/oracle_spec.rb +286 -0
  158. data/spec/adapters/postgres_spec.rb +969 -0
  159. data/spec/adapters/spec_helper.rb +51 -0
  160. data/spec/adapters/sqlite_spec.rb +432 -0
  161. data/spec/core/connection_pool_spec.rb +808 -0
  162. data/spec/core/core_sql_spec.rb +417 -0
  163. data/spec/core/database_spec.rb +1662 -0
  164. data/spec/core/dataset_spec.rb +3827 -0
  165. data/spec/core/expression_filters_spec.rb +595 -0
  166. data/spec/core/object_graph_spec.rb +296 -0
  167. data/spec/core/schema_generator_spec.rb +159 -0
  168. data/spec/core/schema_spec.rb +830 -0
  169. data/spec/core/spec_helper.rb +56 -0
  170. data/spec/core/version_spec.rb +7 -0
  171. data/spec/extensions/active_model_spec.rb +76 -0
  172. data/spec/extensions/association_dependencies_spec.rb +127 -0
  173. data/spec/extensions/association_proxies_spec.rb +50 -0
  174. data/spec/extensions/blank_spec.rb +67 -0
  175. data/spec/extensions/boolean_readers_spec.rb +92 -0
  176. data/spec/extensions/caching_spec.rb +250 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +252 -0
  178. data/spec/extensions/composition_spec.rb +194 -0
  179. data/spec/extensions/force_encoding_spec.rb +117 -0
  180. data/spec/extensions/hook_class_methods_spec.rb +470 -0
  181. data/spec/extensions/identity_map_spec.rb +202 -0
  182. data/spec/extensions/inflector_spec.rb +181 -0
  183. data/spec/extensions/instance_filters_spec.rb +55 -0
  184. data/spec/extensions/instance_hooks_spec.rb +133 -0
  185. data/spec/extensions/lazy_attributes_spec.rb +153 -0
  186. data/spec/extensions/looser_typecasting_spec.rb +39 -0
  187. data/spec/extensions/many_through_many_spec.rb +884 -0
  188. data/spec/extensions/migration_spec.rb +332 -0
  189. data/spec/extensions/named_timezones_spec.rb +72 -0
  190. data/spec/extensions/nested_attributes_spec.rb +396 -0
  191. data/spec/extensions/optimistic_locking_spec.rb +100 -0
  192. data/spec/extensions/pagination_spec.rb +99 -0
  193. data/spec/extensions/pretty_table_spec.rb +91 -0
  194. data/spec/extensions/query_spec.rb +85 -0
  195. data/spec/extensions/rcte_tree_spec.rb +205 -0
  196. data/spec/extensions/schema_dumper_spec.rb +357 -0
  197. data/spec/extensions/schema_spec.rb +127 -0
  198. data/spec/extensions/serialization_spec.rb +209 -0
  199. data/spec/extensions/single_table_inheritance_spec.rb +96 -0
  200. data/spec/extensions/spec_helper.rb +91 -0
  201. data/spec/extensions/sql_expr_spec.rb +89 -0
  202. data/spec/extensions/string_date_time_spec.rb +93 -0
  203. data/spec/extensions/subclasses_spec.rb +52 -0
  204. data/spec/extensions/tactical_eager_loading_spec.rb +65 -0
  205. data/spec/extensions/thread_local_timezones_spec.rb +45 -0
  206. data/spec/extensions/timestamps_spec.rb +150 -0
  207. data/spec/extensions/touch_spec.rb +155 -0
  208. data/spec/extensions/typecast_on_load_spec.rb +69 -0
  209. data/spec/extensions/validation_class_methods_spec.rb +984 -0
  210. data/spec/extensions/validation_helpers_spec.rb +438 -0
  211. data/spec/integration/associations_test.rb +281 -0
  212. data/spec/integration/database_test.rb +26 -0
  213. data/spec/integration/dataset_test.rb +963 -0
  214. data/spec/integration/eager_loader_test.rb +734 -0
  215. data/spec/integration/model_test.rb +130 -0
  216. data/spec/integration/plugin_test.rb +814 -0
  217. data/spec/integration/prepared_statement_test.rb +213 -0
  218. data/spec/integration/schema_test.rb +361 -0
  219. data/spec/integration/spec_helper.rb +73 -0
  220. data/spec/integration/timezone_test.rb +55 -0
  221. data/spec/integration/transaction_test.rb +122 -0
  222. data/spec/integration/type_test.rb +96 -0
  223. data/spec/model/association_reflection_spec.rb +175 -0
  224. data/spec/model/associations_spec.rb +2633 -0
  225. data/spec/model/base_spec.rb +418 -0
  226. data/spec/model/dataset_methods_spec.rb +78 -0
  227. data/spec/model/eager_loading_spec.rb +1391 -0
  228. data/spec/model/hooks_spec.rb +240 -0
  229. data/spec/model/inflector_spec.rb +26 -0
  230. data/spec/model/model_spec.rb +593 -0
  231. data/spec/model/plugins_spec.rb +236 -0
  232. data/spec/model/record_spec.rb +1500 -0
  233. data/spec/model/spec_helper.rb +97 -0
  234. data/spec/model/validations_spec.rb +153 -0
  235. data/spec/rcov.opts +6 -0
  236. data/spec/spec_config.rb.example +10 -0
  237. metadata +346 -0
@@ -0,0 +1,830 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ context "DB#create_table" do
4
+ before do
5
+ @db = SchemaDummyDatabase.new
6
+ end
7
+
8
+ specify "should accept the table name" do
9
+ @db.create_table(:cats) {}
10
+ @db.sqls.should == ['CREATE TABLE cats ()']
11
+ end
12
+
13
+ specify "should accept the table name in multiple formats" do
14
+ @db.create_table(:cats__cats) {}
15
+ @db.create_table("cats__cats1") {}
16
+ @db.create_table(:cats__cats2.identifier) {}
17
+ @db.create_table(:cats.qualify(:cats3)) {}
18
+ @db.sqls.should == ['CREATE TABLE cats.cats ()', 'CREATE TABLE cats__cats1 ()', 'CREATE TABLE cats__cats2 ()', 'CREATE TABLE cats3.cats ()']
19
+ end
20
+
21
+ specify "should raise an error if the table name argument is not valid" do
22
+ proc{@db.create_table(1) {}}.should raise_error(Sequel::Error)
23
+ proc{@db.create_table(:cats.as(:c)) {}}.should raise_error(Sequel::Error)
24
+ end
25
+
26
+ specify "should accept multiple columns" do
27
+ @db.create_table(:cats) do
28
+ column :id, :integer
29
+ column :name, :text
30
+ end
31
+ @db.sqls.should == ['CREATE TABLE cats (id integer, name text)']
32
+ end
33
+
34
+ specify "should accept method calls as data types" do
35
+ @db.create_table(:cats) do
36
+ integer :id
37
+ text :name
38
+ end
39
+ @db.sqls.should == ['CREATE TABLE cats (id integer, name text)']
40
+ end
41
+
42
+ specify "should transform types given as ruby classes to database-specific types" do
43
+ @db.create_table(:cats) do
44
+ String :a
45
+ Integer :b
46
+ Fixnum :c
47
+ Bignum :d
48
+ Float :e
49
+ BigDecimal :f
50
+ Date :g
51
+ DateTime :h
52
+ Time :i
53
+ Numeric :j
54
+ File :k
55
+ TrueClass :l
56
+ FalseClass :m
57
+ column :n, Fixnum
58
+ primary_key :o, :type=>String
59
+ foreign_key :p, :f, :type=>Date
60
+ end
61
+ @db.sqls.should == ['CREATE TABLE cats (o varchar(255) PRIMARY KEY AUTOINCREMENT, a varchar(255), b integer, c integer, d bigint, e double precision, f numeric, g date, h timestamp, i timestamp, j numeric, k blob, l boolean, m boolean, n integer, p date REFERENCES f)']
62
+ end
63
+
64
+ specify "should allow the use of modifiers with ruby class types" do
65
+ @db.create_table(:cats) do
66
+ String :a, :size=>50
67
+ String :b, :text=>true
68
+ String :c, :fixed=>true, :size=>40
69
+ Time :d, :only_time=>true
70
+ BigDecimal :e, :size=>[11,2]
71
+ end
72
+ @db.sqls.should == ['CREATE TABLE cats (a varchar(50), b text, c char(40), d time, e numeric(11, 2))']
73
+ end
74
+
75
+ specify "should raise an error if you use a ruby class that isn't handled" do
76
+ proc{@db.create_table(:cats){column :a, Class}}.should raise_error(Sequel::Error)
77
+ end
78
+
79
+ specify "should accept primary key definition" do
80
+ @db.create_table(:cats) do
81
+ primary_key :id
82
+ end
83
+ @db.sqls.should == ['CREATE TABLE cats (id integer PRIMARY KEY AUTOINCREMENT)']
84
+
85
+ @db.sqls.clear
86
+ @db.create_table(:cats) do
87
+ primary_key :id, :serial, :auto_increment => false
88
+ end
89
+ @db.sqls.should == ['CREATE TABLE cats (id serial PRIMARY KEY)']
90
+
91
+ @db.sqls.clear
92
+ @db.create_table(:cats) do
93
+ primary_key :id, :type => :serial, :auto_increment => false
94
+ end
95
+ @db.sqls.should == ['CREATE TABLE cats (id serial PRIMARY KEY)']
96
+ end
97
+
98
+ specify "should accept and literalize default values" do
99
+ @db.create_table(:cats) do
100
+ integer :id, :default => 123
101
+ text :name, :default => "abc'def"
102
+ end
103
+ @db.sqls.should == ["CREATE TABLE cats (id integer DEFAULT 123, name text DEFAULT 'abc''def')"]
104
+ end
105
+
106
+ specify "should accept not null definition" do
107
+ @db.create_table(:cats) do
108
+ integer :id
109
+ text :name, :null => false
110
+ text :name2, :allow_null => false
111
+ end
112
+ @db.sqls.should == ["CREATE TABLE cats (id integer, name text NOT NULL, name2 text NOT NULL)"]
113
+ end
114
+
115
+ specify "should accept null definition" do
116
+ @db.create_table(:cats) do
117
+ integer :id
118
+ text :name, :null => true
119
+ text :name2, :allow_null => true
120
+ end
121
+ @db.sqls.should == ["CREATE TABLE cats (id integer, name text NULL, name2 text NULL)"]
122
+ end
123
+
124
+ specify "should accept unique definition" do
125
+ @db.create_table(:cats) do
126
+ integer :id
127
+ text :name, :unique => true
128
+ end
129
+ @db.sqls.should == ["CREATE TABLE cats (id integer, name text UNIQUE)"]
130
+ end
131
+
132
+ specify "should accept unsigned definition" do
133
+ @db.create_table(:cats) do
134
+ integer :value, :unsigned => true
135
+ end
136
+ @db.sqls.should == ["CREATE TABLE cats (value integer UNSIGNED)"]
137
+ end
138
+
139
+ specify "should accept [SET|ENUM](...) types" do
140
+ @db.create_table(:cats) do
141
+ set :color, :elements => ['black', 'tricolor', 'grey']
142
+ end
143
+ @db.sqls.should == ["CREATE TABLE cats (color set('black', 'tricolor', 'grey'))"]
144
+ end
145
+
146
+ specify "should accept varchar size" do
147
+ @db.create_table(:cats) do
148
+ varchar :name
149
+ end
150
+ @db.sqls.should == ["CREATE TABLE cats (name varchar(255))"]
151
+ @db.sqls.clear
152
+ @db.create_table(:cats) do
153
+ varchar :name, :size => 51
154
+ end
155
+ @db.sqls.should == ["CREATE TABLE cats (name varchar(51))"]
156
+ end
157
+
158
+ specify "should use double precision for double type" do
159
+ @db.create_table(:cats) do
160
+ double :name
161
+ end
162
+ @db.sqls.should == ["CREATE TABLE cats (name double precision)"]
163
+ end
164
+
165
+ specify "should accept foreign keys without options" do
166
+ @db.create_table(:cats) do
167
+ foreign_key :project_id
168
+ end
169
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer)"]
170
+ end
171
+
172
+ specify "should accept foreign keys with options" do
173
+ @db.create_table(:cats) do
174
+ foreign_key :project_id, :table => :projects
175
+ end
176
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects)"]
177
+ end
178
+
179
+ specify "should accept foreign keys with separate table argument" do
180
+ @db.create_table(:cats) do
181
+ foreign_key :project_id, :projects, :default=>3
182
+ end
183
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer DEFAULT 3 REFERENCES projects)"]
184
+ end
185
+
186
+ specify "should raise an error if the table argument to foreign_key isn't a hash, symbol, or nil" do
187
+ proc{@db.create_table(:cats){foreign_key :project_id, Object.new, :default=>3}}.should raise_error(Sequel::Error)
188
+ end
189
+
190
+ specify "should accept foreign keys with arbitrary keys" do
191
+ @db.create_table(:cats) do
192
+ foreign_key :project_id, :table => :projects, :key => :id
193
+ end
194
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects(id))"]
195
+
196
+ @db.sqls.clear
197
+ @db.create_table(:cats) do
198
+ foreign_key :project_id, :table => :projects, :key => :zzz
199
+ end
200
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects(zzz))"]
201
+ end
202
+
203
+ specify "should accept foreign keys with ON DELETE clause" do
204
+ @db.create_table(:cats) do
205
+ foreign_key :project_id, :table => :projects, :on_delete => :restrict
206
+ end
207
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE RESTRICT)"]
208
+
209
+ @db.sqls.clear
210
+ @db.create_table(:cats) do
211
+ foreign_key :project_id, :table => :projects, :on_delete => :cascade
212
+ end
213
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)"]
214
+
215
+ @db.sqls.clear
216
+ @db.create_table(:cats) do
217
+ foreign_key :project_id, :table => :projects, :on_delete => :no_action
218
+ end
219
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE NO ACTION)"]
220
+ @db.sqls.clear
221
+
222
+ @db.sqls.clear
223
+ @db.create_table(:cats) do
224
+ foreign_key :project_id, :table => :projects, :on_delete => :set_null
225
+ end
226
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET NULL)"]
227
+ @db.sqls.clear
228
+
229
+ @db.sqls.clear
230
+ @db.create_table(:cats) do
231
+ foreign_key :project_id, :table => :projects, :on_delete => :set_default
232
+ end
233
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE SET DEFAULT)"]
234
+ @db.sqls.clear
235
+ end
236
+
237
+ specify "should accept foreign keys with ON UPDATE clause" do
238
+ @db.create_table(:cats) do
239
+ foreign_key :project_id, :table => :projects, :on_update => :restrict
240
+ end
241
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE RESTRICT)"]
242
+
243
+ @db.sqls.clear
244
+ @db.create_table(:cats) do
245
+ foreign_key :project_id, :table => :projects, :on_update => :cascade
246
+ end
247
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE CASCADE)"]
248
+
249
+ @db.sqls.clear
250
+ @db.create_table(:cats) do
251
+ foreign_key :project_id, :table => :projects, :on_update => :no_action
252
+ end
253
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE NO ACTION)"]
254
+ @db.sqls.clear
255
+
256
+ @db.sqls.clear
257
+ @db.create_table(:cats) do
258
+ foreign_key :project_id, :table => :projects, :on_update => :set_null
259
+ end
260
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET NULL)"]
261
+ @db.sqls.clear
262
+
263
+ @db.sqls.clear
264
+ @db.create_table(:cats) do
265
+ foreign_key :project_id, :table => :projects, :on_update => :set_default
266
+ end
267
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON UPDATE SET DEFAULT)"]
268
+ @db.sqls.clear
269
+ end
270
+
271
+ specify "should accept inline index definition" do
272
+ @db.create_table(:cats) do
273
+ integer :id, :index => true
274
+ end
275
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
276
+ end
277
+
278
+ specify "should accept inline index definition for foreign keys" do
279
+ @db.create_table(:cats) do
280
+ foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => true
281
+ end
282
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
283
+ "CREATE INDEX cats_project_id_index ON cats (project_id)"]
284
+ end
285
+
286
+ specify "should accept index definitions" do
287
+ @db.create_table(:cats) do
288
+ integer :id
289
+ index :id
290
+ end
291
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
292
+ end
293
+
294
+ specify "should accept unique index definitions" do
295
+ @db.create_table(:cats) do
296
+ text :name
297
+ unique :name
298
+ end
299
+ @db.sqls.should == ["CREATE TABLE cats (name text, UNIQUE (name))"]
300
+ end
301
+
302
+ specify "should raise on full-text index definitions" do
303
+ proc {
304
+ @db.create_table(:cats) do
305
+ text :name
306
+ full_text_index :name
307
+ end
308
+ }.should raise_error(Sequel::Error)
309
+ end
310
+
311
+ specify "should raise on spatial index definitions" do
312
+ proc {
313
+ @db.create_table(:cats) do
314
+ point :geom
315
+ spatial_index :geom
316
+ end
317
+ }.should raise_error(Sequel::Error)
318
+ end
319
+
320
+ specify "should raise on partial index definitions" do
321
+ proc {
322
+ @db.create_table(:cats) do
323
+ text :name
324
+ index :name, :where => {:something => true}
325
+ end
326
+ }.should raise_error(Sequel::Error)
327
+ end
328
+
329
+ specify "should raise index definitions with type" do
330
+ proc {
331
+ @db.create_table(:cats) do
332
+ text :name
333
+ index :name, :type => :hash
334
+ end
335
+ }.should raise_error(Sequel::Error)
336
+ end
337
+
338
+ specify "should ignore errors if the database raises an error on an index creation statement and the :ignore_index_errors option is used" do
339
+ @db.meta_def(:execute_ddl){|*a| raise Sequel::DatabaseError if /blah/.match(a.first); super(*a)}
340
+ lambda{@db.create_table(:cats){Integer :id; index :blah; index :id}}.should raise_error(Sequel::DatabaseError)
341
+ @db.sqls.should == ['CREATE TABLE cats (id integer)']
342
+ @db.sqls.clear
343
+ lambda{@db.create_table(:cats, :ignore_index_errors=>true){Integer :id; index :blah; index :id}}.should_not raise_error(Sequel::DatabaseError)
344
+ @db.sqls.should == ['CREATE TABLE cats (id integer)', 'CREATE INDEX cats_id_index ON cats (id)']
345
+ end
346
+
347
+ specify "should accept multiple index definitions" do
348
+ @db.create_table(:cats) do
349
+ integer :id
350
+ index :id
351
+ index :name
352
+ end
353
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)", "CREATE INDEX cats_name_index ON cats (name)"]
354
+ end
355
+
356
+ specify "should accept functional indexes" do
357
+ @db.create_table(:cats) do
358
+ integer :id
359
+ index :lower.sql_function(:name)
360
+ end
361
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower_name__index ON cats (lower(name))"]
362
+ end
363
+
364
+ specify "should accept indexes with identifiers" do
365
+ @db.create_table(:cats) do
366
+ integer :id
367
+ index :lower__name.identifier
368
+ end
369
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_lower__name_index ON cats (lower__name)"]
370
+ end
371
+
372
+ specify "should accept custom index names" do
373
+ @db.create_table(:cats) do
374
+ integer :id
375
+ index :id, :name => 'abc'
376
+ end
377
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX abc ON cats (id)"]
378
+ end
379
+
380
+ specify "should accept unique index definitions" do
381
+ @db.create_table(:cats) do
382
+ integer :id
383
+ index :id, :unique => true
384
+ end
385
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
386
+ end
387
+
388
+ specify "should accept composite index definitions" do
389
+ @db.create_table(:cats) do
390
+ integer :id
391
+ index [:id, :name], :unique => true
392
+ end
393
+ @db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_name_index ON cats (id, name)"]
394
+ end
395
+
396
+ specify "should accept unnamed constraint definitions with blocks" do
397
+ @db.create_table(:cats) do
398
+ integer :score
399
+ check {(:x.sql_number > 0) & (:y.sql_number < 1)}
400
+ end
401
+ @db.sqls.should == ["CREATE TABLE cats (score integer, CHECK ((x > 0) AND (y < 1)))"]
402
+ end
403
+
404
+ specify "should accept unnamed constraint definitions" do
405
+ @db.create_table(:cats) do
406
+ check 'price < ?', 100
407
+ end
408
+ @db.sqls.should == ["CREATE TABLE cats (CHECK (price < 100))"]
409
+ end
410
+
411
+ specify "should accept hash constraints" do
412
+ @db.create_table(:cats) do
413
+ check :price=>100
414
+ end
415
+ @db.sqls.should == ["CREATE TABLE cats (CHECK (price = 100))"]
416
+ end
417
+
418
+ specify "should accept named constraint definitions" do
419
+ @db.create_table(:cats) do
420
+ integer :score
421
+ constraint :valid_score, 'score <= 100'
422
+ end
423
+ @db.sqls.should == ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100))"]
424
+ end
425
+
426
+ specify "should accept named constraint definitions with block" do
427
+ @db.create_table(:cats) do
428
+ constraint(:blah_blah) {(:x.sql_number > 0) & (:y.sql_number < 1)}
429
+ end
430
+ @db.sqls.should == ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1)))"]
431
+ end
432
+
433
+ specify "should raise an error if an invalid constraint type is used" do
434
+ proc{@db.create_table(:cats){unique [:a, :b], :type=>:bb}}.should raise_error(Sequel::Error)
435
+ end
436
+
437
+ specify "should accept composite primary keys" do
438
+ @db.create_table(:cats) do
439
+ integer :a
440
+ integer :b
441
+ primary_key [:a, :b]
442
+ end
443
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, PRIMARY KEY (a, b))"]
444
+ end
445
+
446
+ specify "should accept named composite primary keys" do
447
+ @db.create_table(:cats) do
448
+ integer :a
449
+ integer :b
450
+ primary_key [:a, :b], :name => :cpk
451
+ end
452
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cpk PRIMARY KEY (a, b))"]
453
+ end
454
+
455
+ specify "should accept composite foreign keys" do
456
+ @db.create_table(:cats) do
457
+ integer :a
458
+ integer :b
459
+ foreign_key [:a, :b], :abc
460
+ end
461
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc)"]
462
+ end
463
+
464
+ specify "should accept named composite foreign keys" do
465
+ @db.create_table(:cats) do
466
+ integer :a
467
+ integer :b
468
+ foreign_key [:a, :b], :abc, :name => :cfk
469
+ end
470
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, CONSTRAINT cfk FOREIGN KEY (a, b) REFERENCES abc)"]
471
+ end
472
+
473
+ specify "should accept composite foreign keys with arbitrary keys" do
474
+ @db.create_table(:cats) do
475
+ integer :a
476
+ integer :b
477
+ foreign_key [:a, :b], :abc, :key => [:real_a, :real_b]
478
+ end
479
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(real_a, real_b))"]
480
+ @db.sqls.clear
481
+
482
+ @db.create_table(:cats) do
483
+ integer :a
484
+ integer :b
485
+ foreign_key [:a, :b], :abc, :key => [:z, :x]
486
+ end
487
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(z, x))"]
488
+ end
489
+
490
+ specify "should accept composite foreign keys with on delete and on update clauses" do
491
+ @db.create_table(:cats) do
492
+ integer :a
493
+ integer :b
494
+ foreign_key [:a, :b], :abc, :on_delete => :cascade
495
+ end
496
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE CASCADE)"]
497
+
498
+ @db.sqls.clear
499
+ @db.create_table(:cats) do
500
+ integer :a
501
+ integer :b
502
+ foreign_key [:a, :b], :abc, :on_update => :no_action
503
+ end
504
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON UPDATE NO ACTION)"]
505
+
506
+ @db.sqls.clear
507
+ @db.create_table(:cats) do
508
+ integer :a
509
+ integer :b
510
+ foreign_key [:a, :b], :abc, :on_delete => :restrict, :on_update => :set_default
511
+ end
512
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc ON DELETE RESTRICT ON UPDATE SET DEFAULT)"]
513
+
514
+ @db.sqls.clear
515
+ @db.create_table(:cats) do
516
+ integer :a
517
+ integer :b
518
+ foreign_key [:a, :b], :abc, :key => [:x, :y], :on_delete => :set_null, :on_update => :set_null
519
+ end
520
+ @db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(x, y) ON DELETE SET NULL ON UPDATE SET NULL)"]
521
+ end
522
+ end
523
+
524
+ context "DB#create_table!" do
525
+ before do
526
+ @db = SchemaDummyDatabase.new
527
+ end
528
+
529
+ specify "should drop the table and then create it" do
530
+ @db.create_table!(:cats) {}
531
+ @db.sqls.should == ['DROP TABLE cats', 'CREATE TABLE cats ()']
532
+ end
533
+ end
534
+
535
+ context "DB#create_table?" do
536
+ before do
537
+ @db = SchemaDummyDatabase.new
538
+ end
539
+
540
+ specify "should not create the table if the table already exists" do
541
+ @db.meta_def(:table_exists?){|a| true}
542
+ @db.create_table?(:cats){|*a|}
543
+ @db.sqls.should == nil
544
+ end
545
+
546
+ specify "should create the table if the table doesn't already exist" do
547
+ @db.meta_def(:table_exists?){|a| false}
548
+ @db.create_table?(:cats){|*a|}
549
+ @db.sqls.should == ['CREATE TABLE cats ()']
550
+ end
551
+ end
552
+
553
+ context "DB#drop_table" do
554
+ before do
555
+ @db = SchemaDummyDatabase.new
556
+ end
557
+
558
+ specify "should generate a DROP TABLE statement" do
559
+ @db.drop_table :cats
560
+ @db.sqls.should == ['DROP TABLE cats']
561
+ end
562
+ end
563
+
564
+ context "DB#alter_table" do
565
+ before do
566
+ @db = SchemaDummyDatabase.new
567
+ end
568
+
569
+ specify "should allow adding not null constraint" do
570
+ @db.alter_table(:cats) do
571
+ set_column_allow_null :score, false
572
+ end
573
+ @db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score SET NOT NULL"]
574
+ end
575
+
576
+ specify "should allow droping not null constraint" do
577
+ @db.alter_table(:cats) do
578
+ set_column_allow_null :score, true
579
+ end
580
+ @db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score DROP NOT NULL"]
581
+ end
582
+
583
+ specify "should support add_column" do
584
+ @db.alter_table(:cats) do
585
+ add_column :score, :integer
586
+ end
587
+ @db.sqls.should == ["ALTER TABLE cats ADD COLUMN score integer"]
588
+ end
589
+
590
+ specify "should support add_constraint" do
591
+ @db.alter_table(:cats) do
592
+ add_constraint :valid_score, 'score <= 100'
593
+ end
594
+ @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100)"]
595
+ end
596
+
597
+ specify "should support add_constraint with block" do
598
+ @db.alter_table(:cats) do
599
+ add_constraint(:blah_blah) {(:x.sql_number > 0) & (:y.sql_number < 1)}
600
+ end
601
+ @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1))"]
602
+ end
603
+
604
+ specify "should support add_unique_constraint" do
605
+ @db.alter_table(:cats) do
606
+ add_unique_constraint [:a, :b]
607
+ end
608
+ @db.sqls.should == ["ALTER TABLE cats ADD UNIQUE (a, b)"]
609
+
610
+ @db.sqls.clear
611
+ @db.alter_table(:cats) do
612
+ add_unique_constraint [:a, :b], :name => :ab_uniq
613
+ end
614
+ @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT ab_uniq UNIQUE (a, b)"]
615
+ end
616
+
617
+ specify "should support add_foreign_key" do
618
+ @db.alter_table(:cats) do
619
+ add_foreign_key :node_id, :nodes
620
+ end
621
+ @db.sqls.should == ["ALTER TABLE cats ADD COLUMN node_id integer REFERENCES nodes"]
622
+ end
623
+
624
+ specify "should support add_foreign_key with composite foreign keys" do
625
+ @db.alter_table(:cats) do
626
+ add_foreign_key [:node_id, :prop_id], :nodes_props
627
+ end
628
+ @db.sqls.should == ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
629
+
630
+ @db.sqls.clear
631
+ @db.alter_table(:cats) do
632
+ add_foreign_key [:node_id, :prop_id], :nodes_props, :name => :cfk
633
+ end
634
+ @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT cfk FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props"]
635
+
636
+ @db.sqls.clear
637
+ @db.alter_table(:cats) do
638
+ add_foreign_key [:node_id, :prop_id], :nodes_props, :key => [:nid, :pid]
639
+ end
640
+ @db.sqls.should == ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props(nid, pid)"]
641
+
642
+ @db.sqls.clear
643
+ @db.alter_table(:cats) do
644
+ add_foreign_key [:node_id, :prop_id], :nodes_props, :on_delete => :restrict, :on_update => :cascade
645
+ end
646
+ @db.sqls.should == ["ALTER TABLE cats ADD FOREIGN KEY (node_id, prop_id) REFERENCES nodes_props ON DELETE RESTRICT ON UPDATE CASCADE"]
647
+ end
648
+
649
+ specify "should support add_index" do
650
+ @db.alter_table(:cats) do
651
+ add_index :name
652
+ end
653
+ @db.sqls.should == ["CREATE INDEX cats_name_index ON cats (name)"]
654
+ end
655
+
656
+ specify "should ignore errors if the database raises an error on an add_index call and the :ignore_errors option is used" do
657
+ @db.meta_def(:execute_ddl){|*a| raise Sequel::DatabaseError}
658
+ lambda{@db.add_index(:cats, :id)}.should raise_error(Sequel::DatabaseError)
659
+ lambda{@db.add_index(:cats, :id, :ignore_errors=>true)}.should_not raise_error(Sequel::DatabaseError)
660
+ @db.sqls.should == nil
661
+ end
662
+
663
+ specify "should support add_primary_key" do
664
+ @db.alter_table(:cats) do
665
+ add_primary_key :id
666
+ end
667
+ @db.sqls.should == ["ALTER TABLE cats ADD COLUMN id integer PRIMARY KEY AUTOINCREMENT"]
668
+ end
669
+
670
+ specify "should support add_primary_key with composite primary keys" do
671
+ @db.alter_table(:cats) do
672
+ add_primary_key [:id, :type]
673
+ end
674
+ @db.sqls.should == ["ALTER TABLE cats ADD PRIMARY KEY (id, type)"]
675
+
676
+ @db.sqls.clear
677
+ @db.alter_table(:cats) do
678
+ add_primary_key [:id, :type], :name => :cpk
679
+ end
680
+ @db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT cpk PRIMARY KEY (id, type)"]
681
+ end
682
+
683
+ specify "should support drop_column" do
684
+ @db.alter_table(:cats) do
685
+ drop_column :score
686
+ end
687
+ @db.sqls.should == ["ALTER TABLE cats DROP COLUMN score"]
688
+ end
689
+
690
+ specify "should support drop_constraint" do
691
+ @db.alter_table(:cats) do
692
+ drop_constraint :valid_score
693
+ end
694
+ @db.sqls.should == ["ALTER TABLE cats DROP CONSTRAINT valid_score"]
695
+ end
696
+
697
+ specify "should support drop_index" do
698
+ @db.alter_table(:cats) do
699
+ drop_index :name
700
+ end
701
+ @db.sqls.should == ["DROP INDEX cats_name_index"]
702
+ end
703
+
704
+ specify "should support drop_index with a given name" do
705
+ @db.alter_table(:cats) do
706
+ drop_index :name, :name=>:blah_blah
707
+ end
708
+ @db.sqls.should == ["DROP INDEX blah_blah"]
709
+ end
710
+
711
+ specify "should support rename_column" do
712
+ @db.alter_table(:cats) do
713
+ rename_column :name, :old_name
714
+ end
715
+ @db.sqls.should == ["ALTER TABLE cats RENAME COLUMN name TO old_name"]
716
+ end
717
+
718
+ specify "should support set_column_default" do
719
+ @db.alter_table(:cats) do
720
+ set_column_default :score, 3
721
+ end
722
+ @db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score SET DEFAULT 3"]
723
+ end
724
+
725
+ specify "should support set_column_type" do
726
+ @db.alter_table(:cats) do
727
+ set_column_type :score, :real
728
+ end
729
+ @db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score TYPE real"]
730
+ end
731
+
732
+ specify "should support set_column_type with options" do
733
+ @db.alter_table(:cats) do
734
+ set_column_type :score, :integer, :unsigned=>true
735
+ set_column_type :score, :varchar, :size=>30
736
+ set_column_type :score, :enum, :elements=>['a', 'b']
737
+ end
738
+ @db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score TYPE integer UNSIGNED",
739
+ "ALTER TABLE cats ALTER COLUMN score TYPE varchar(30)",
740
+ "ALTER TABLE cats ALTER COLUMN score TYPE enum('a', 'b')"]
741
+ end
742
+ end
743
+
744
+ context "Schema Parser" do
745
+ before do
746
+ @sqls = []
747
+ @db = Sequel::Database.new
748
+ end
749
+
750
+ specify "should raise an error if there are no columns" do
751
+ @db.meta_def(:schema_parse_table) do |t, opts|
752
+ []
753
+ end
754
+ proc{@db.schema(:x)}.should raise_error(Sequel::Error)
755
+ end
756
+
757
+ specify "should parse the schema correctly for a single table" do
758
+ sqls = @sqls
759
+ proc{@db.schema(:x)}.should raise_error(Sequel::Error)
760
+ @db.meta_def(:schema_parse_table) do |t, opts|
761
+ sqls << t
762
+ [[:a, {:db_type=>t.to_s}]]
763
+ end
764
+ @db.schema(:x).should == [[:a, {:db_type=>"x", :ruby_default=>nil}]]
765
+ @sqls.should == ['x']
766
+ @db.schema(:x).should == [[:a, {:db_type=>"x", :ruby_default=>nil}]]
767
+ @sqls.should == ['x']
768
+ @db.schema(:x, :reload=>true).should == [[:a, {:db_type=>"x", :ruby_default=>nil}]]
769
+ @sqls.should == ['x', 'x']
770
+ end
771
+
772
+ specify "should convert various types of table name arguments" do
773
+ @db.meta_def(:schema_parse_table) do |t, opts|
774
+ [[t, {:db_type=>t}]]
775
+ end
776
+ s1 = @db.schema(:x)
777
+ s1.should == [['x', {:db_type=>'x', :ruby_default=>nil}]]
778
+ @db.schema(:x).object_id.should == s1.object_id
779
+ @db.schema(:x.identifier).object_id.should == s1.object_id
780
+ s2 = @db.schema(:x__y)
781
+ s2.should == [['y', {:db_type=>'y', :ruby_default=>nil}]]
782
+ @db.schema(:x__y).object_id.should == s2.object_id
783
+ @db.schema(:y.qualify(:x)).object_id.should == s2.object_id
784
+ end
785
+
786
+ specify "should correctly parse all supported data types" do
787
+ @db.meta_def(:schema_parse_table) do |t, opts|
788
+ [[:x, {:type=>schema_column_type(t.to_s)}]]
789
+ end
790
+ @db.schema(:tinyint).first.last[:type].should == :integer
791
+ @db.schema(:interval).first.last[:type].should == :interval
792
+ @db.schema(:int).first.last[:type].should == :integer
793
+ @db.schema(:integer).first.last[:type].should == :integer
794
+ @db.schema(:bigint).first.last[:type].should == :integer
795
+ @db.schema(:smallint).first.last[:type].should == :integer
796
+ @db.schema(:character).first.last[:type].should == :string
797
+ @db.schema(:"character varying").first.last[:type].should == :string
798
+ @db.schema(:varchar).first.last[:type].should == :string
799
+ @db.schema(:"varchar(255)").first.last[:type].should == :string
800
+ @db.schema(:text).first.last[:type].should == :string
801
+ @db.schema(:date).first.last[:type].should == :date
802
+ @db.schema(:datetime).first.last[:type].should == :datetime
803
+ @db.schema(:timestamp).first.last[:type].should == :datetime
804
+ @db.schema(:"timestamp with time zone").first.last[:type].should == :datetime
805
+ @db.schema(:"timestamp without time zone").first.last[:type].should == :datetime
806
+ @db.schema(:time).first.last[:type].should == :time
807
+ @db.schema(:"time with time zone").first.last[:type].should == :time
808
+ @db.schema(:"time without time zone").first.last[:type].should == :time
809
+ @db.schema(:boolean).first.last[:type].should == :boolean
810
+ @db.schema(:bit).first.last[:type].should == :boolean
811
+ @db.schema(:real).first.last[:type].should == :float
812
+ @db.schema(:float).first.last[:type].should == :float
813
+ @db.schema(:double).first.last[:type].should == :float
814
+ @db.schema(:"double precision").first.last[:type].should == :float
815
+ @db.schema(:numeric).first.last[:type].should == :decimal
816
+ @db.schema(:decimal).first.last[:type].should == :decimal
817
+ @db.schema(:money).first.last[:type].should == :decimal
818
+ @db.schema(:bytea).first.last[:type].should == :blob
819
+ @db.schema(:blob).first.last[:type].should == :blob
820
+ @db.schema(:image).first.last[:type].should == :blob
821
+ @db.schema(:nchar).first.last[:type].should == :string
822
+ @db.schema(:nvarchar).first.last[:type].should == :string
823
+ @db.schema(:ntext).first.last[:type].should == :string
824
+ @db.schema(:smalldatetime).first.last[:type].should == :datetime
825
+ @db.schema(:smallmoney).first.last[:type].should == :decimal
826
+ @db.schema(:binary).first.last[:type].should == :blob
827
+ @db.schema(:varbinary).first.last[:type].should == :blob
828
+ @db.schema(:enum).first.last[:type].should == :enum
829
+ end
830
+ end