viking-sequel 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
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