sequel 3.21.0 → 3.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. data/CHANGELOG +1061 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +103 -63
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +67 -51
  7. data/doc/advanced_associations.rdoc +189 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/cheat_sheet.rdoc +21 -21
  10. data/doc/core_extensions.rdoc +374 -0
  11. data/doc/dataset_basics.rdoc +10 -10
  12. data/doc/dataset_filtering.rdoc +54 -42
  13. data/doc/mass_assignment.rdoc +56 -0
  14. data/doc/migration.rdoc +89 -557
  15. data/doc/model_hooks.rdoc +80 -29
  16. data/doc/object_model.rdoc +547 -0
  17. data/doc/opening_databases.rdoc +114 -53
  18. data/doc/prepared_statements.rdoc +41 -15
  19. data/doc/querying.rdoc +137 -56
  20. data/doc/reflection.rdoc +36 -10
  21. data/doc/release_notes/3.22.0.txt +39 -0
  22. data/doc/release_notes/3.23.0.txt +172 -0
  23. data/doc/release_notes/3.24.0.txt +420 -0
  24. data/doc/release_notes/3.25.0.txt +88 -0
  25. data/doc/release_notes/3.26.0.txt +88 -0
  26. data/doc/release_notes/3.27.0.txt +82 -0
  27. data/doc/release_notes/3.28.0.txt +304 -0
  28. data/doc/release_notes/3.29.0.txt +459 -0
  29. data/doc/release_notes/3.30.0.txt +135 -0
  30. data/doc/release_notes/3.31.0.txt +146 -0
  31. data/doc/release_notes/3.32.0.txt +202 -0
  32. data/doc/release_notes/3.33.0.txt +157 -0
  33. data/doc/release_notes/3.34.0.txt +671 -0
  34. data/doc/release_notes/3.35.0.txt +144 -0
  35. data/doc/release_notes/3.36.0.txt +245 -0
  36. data/doc/release_notes/3.37.0.txt +338 -0
  37. data/doc/release_notes/3.38.0.txt +234 -0
  38. data/doc/release_notes/3.39.0.txt +237 -0
  39. data/doc/schema_modification.rdoc +585 -0
  40. data/doc/sharding.rdoc +99 -8
  41. data/doc/sql.rdoc +154 -112
  42. data/doc/testing.rdoc +169 -0
  43. data/doc/thread_safety.rdoc +17 -0
  44. data/doc/transactions.rdoc +137 -0
  45. data/doc/validations.rdoc +1 -1
  46. data/doc/virtual_rows.rdoc +78 -43
  47. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  48. data/lib/sequel/adapters/ado.rb +40 -18
  49. data/lib/sequel/adapters/amalgalite.rb +17 -9
  50. data/lib/sequel/adapters/db2.rb +175 -86
  51. data/lib/sequel/adapters/dbi.rb +15 -15
  52. data/lib/sequel/adapters/do/mysql.rb +17 -11
  53. data/lib/sequel/adapters/do/postgres.rb +2 -61
  54. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  55. data/lib/sequel/adapters/do.rb +18 -36
  56. data/lib/sequel/adapters/firebird.rb +27 -208
  57. data/lib/sequel/adapters/ibmdb.rb +453 -0
  58. data/lib/sequel/adapters/informix.rb +6 -23
  59. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  60. data/lib/sequel/adapters/jdbc/db2.rb +56 -0
  61. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  62. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  63. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  64. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  65. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  66. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  67. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  68. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  69. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  70. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  71. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  73. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  74. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  75. data/lib/sequel/adapters/jdbc.rb +279 -97
  76. data/lib/sequel/adapters/mock.rb +372 -0
  77. data/lib/sequel/adapters/mysql.rb +125 -222
  78. data/lib/sequel/adapters/mysql2.rb +65 -56
  79. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  80. data/lib/sequel/adapters/odbc.rb +28 -9
  81. data/lib/sequel/adapters/openbase.rb +3 -5
  82. data/lib/sequel/adapters/oracle.rb +349 -53
  83. data/lib/sequel/adapters/postgres.rb +368 -138
  84. data/lib/sequel/adapters/shared/access.rb +32 -9
  85. data/lib/sequel/adapters/shared/db2.rb +343 -0
  86. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  87. data/lib/sequel/adapters/shared/informix.rb +53 -0
  88. data/lib/sequel/adapters/shared/mssql.rb +401 -116
  89. data/lib/sequel/adapters/shared/mysql.rb +424 -89
  90. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  91. data/lib/sequel/adapters/shared/oracle.rb +257 -45
  92. data/lib/sequel/adapters/shared/postgres.rb +675 -279
  93. data/lib/sequel/adapters/shared/progress.rb +5 -8
  94. data/lib/sequel/adapters/shared/sqlite.rb +285 -96
  95. data/lib/sequel/adapters/sqlite.rb +101 -39
  96. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  97. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  98. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  99. data/lib/sequel/adapters/swift.rb +28 -19
  100. data/lib/sequel/adapters/tinytds.rb +174 -22
  101. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  102. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  103. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  104. data/lib/sequel/ast_transformer.rb +194 -0
  105. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  106. data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
  107. data/lib/sequel/connection_pool/single.rb +5 -0
  108. data/lib/sequel/connection_pool/threaded.rb +43 -14
  109. data/lib/sequel/connection_pool.rb +10 -2
  110. data/lib/sequel/core.rb +143 -11
  111. data/lib/sequel/database/connecting.rb +38 -28
  112. data/lib/sequel/database/dataset.rb +4 -4
  113. data/lib/sequel/database/dataset_defaults.rb +63 -2
  114. data/lib/sequel/database/logging.rb +7 -2
  115. data/lib/sequel/database/misc.rb +190 -46
  116. data/lib/sequel/database/query.rb +272 -110
  117. data/lib/sequel/database/schema_generator.rb +103 -36
  118. data/lib/sequel/database/schema_methods.rb +300 -67
  119. data/lib/sequel/dataset/actions.rb +344 -90
  120. data/lib/sequel/dataset/features.rb +101 -8
  121. data/lib/sequel/dataset/graph.rb +42 -15
  122. data/lib/sequel/dataset/misc.rb +52 -25
  123. data/lib/sequel/dataset/mutation.rb +12 -7
  124. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  125. data/lib/sequel/dataset/query.rb +305 -54
  126. data/lib/sequel/dataset/sql.rb +720 -292
  127. data/lib/sequel/dataset.rb +8 -0
  128. data/lib/sequel/exceptions.rb +4 -0
  129. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  130. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  131. data/lib/sequel/extensions/blank.rb +4 -0
  132. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  133. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  134. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  135. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  136. data/lib/sequel/extensions/inflector.rb +4 -0
  137. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  138. data/lib/sequel/extensions/migration.rb +100 -11
  139. data/lib/sequel/extensions/named_timezones.rb +9 -0
  140. data/lib/sequel/extensions/null_dataset.rb +94 -0
  141. data/lib/sequel/extensions/pagination.rb +4 -0
  142. data/lib/sequel/extensions/pg_array.rb +537 -0
  143. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  144. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  145. data/lib/sequel/extensions/pg_hstore.rb +313 -0
  146. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  147. data/lib/sequel/extensions/pg_inet.rb +113 -0
  148. data/lib/sequel/extensions/pg_interval.rb +191 -0
  149. data/lib/sequel/extensions/pg_json.rb +208 -0
  150. data/lib/sequel/extensions/pg_range.rb +512 -0
  151. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  152. data/lib/sequel/extensions/pg_row.rb +572 -0
  153. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  154. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  155. data/lib/sequel/extensions/pretty_table.rb +17 -72
  156. data/lib/sequel/extensions/query.rb +8 -4
  157. data/lib/sequel/extensions/query_literals.rb +79 -0
  158. data/lib/sequel/extensions/schema_caching.rb +76 -0
  159. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  160. data/lib/sequel/extensions/select_remove.rb +39 -0
  161. data/lib/sequel/extensions/server_block.rb +140 -0
  162. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  163. data/lib/sequel/extensions/sql_expr.rb +8 -110
  164. data/lib/sequel/extensions/string_date_time.rb +4 -0
  165. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  166. data/lib/sequel/extensions/to_dot.rb +99 -83
  167. data/lib/sequel/model/associations.rb +1263 -409
  168. data/lib/sequel/model/base.rb +624 -171
  169. data/lib/sequel/model/errors.rb +1 -1
  170. data/lib/sequel/model/exceptions.rb +24 -2
  171. data/lib/sequel/model/inflections.rb +1 -1
  172. data/lib/sequel/model.rb +30 -11
  173. data/lib/sequel/no_core_ext.rb +2 -0
  174. data/lib/sequel/plugins/active_model.rb +13 -1
  175. data/lib/sequel/plugins/association_pks.rb +22 -4
  176. data/lib/sequel/plugins/caching.rb +25 -18
  177. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  178. data/lib/sequel/plugins/composition.rb +44 -12
  179. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  180. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  181. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  182. data/lib/sequel/plugins/dirty.rb +214 -0
  183. data/lib/sequel/plugins/eager_each.rb +59 -0
  184. data/lib/sequel/plugins/force_encoding.rb +6 -6
  185. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  186. data/lib/sequel/plugins/identity_map.rb +134 -15
  187. data/lib/sequel/plugins/instance_filters.rb +10 -0
  188. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  189. data/lib/sequel/plugins/json_serializer.rb +58 -6
  190. data/lib/sequel/plugins/list.rb +13 -2
  191. data/lib/sequel/plugins/many_through_many.rb +103 -51
  192. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  193. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  194. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  195. data/lib/sequel/plugins/pg_row.rb +121 -0
  196. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  197. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  198. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  199. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  200. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  201. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  202. data/lib/sequel/plugins/schema.rb +8 -3
  203. data/lib/sequel/plugins/serialization.rb +98 -49
  204. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  205. data/lib/sequel/plugins/sharding.rb +21 -54
  206. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  207. data/lib/sequel/plugins/static_cache.rb +99 -0
  208. data/lib/sequel/plugins/subclasses.rb +29 -3
  209. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  210. data/lib/sequel/plugins/timestamps.rb +1 -1
  211. data/lib/sequel/plugins/tree.rb +3 -3
  212. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  213. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  214. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  215. data/lib/sequel/plugins/validation_helpers.rb +55 -4
  216. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  217. data/lib/sequel/sql.rb +649 -122
  218. data/lib/sequel/timezones.rb +67 -40
  219. data/lib/sequel/version.rb +1 -1
  220. data/spec/adapters/db2_spec.rb +146 -0
  221. data/spec/adapters/firebird_spec.rb +1 -1
  222. data/spec/adapters/mssql_spec.rb +194 -66
  223. data/spec/adapters/mysql_spec.rb +475 -306
  224. data/spec/adapters/oracle_spec.rb +92 -117
  225. data/spec/adapters/postgres_spec.rb +1982 -325
  226. data/spec/adapters/spec_helper.rb +9 -6
  227. data/spec/adapters/sqlite_spec.rb +203 -75
  228. data/spec/core/connection_pool_spec.rb +218 -93
  229. data/spec/core/database_spec.rb +956 -522
  230. data/spec/core/dataset_spec.rb +1631 -1242
  231. data/spec/core/expression_filters_spec.rb +690 -334
  232. data/spec/core/mock_adapter_spec.rb +453 -0
  233. data/spec/core/object_graph_spec.rb +88 -129
  234. data/spec/core/schema_generator_spec.rb +4 -4
  235. data/spec/core/schema_spec.rb +556 -53
  236. data/spec/core/spec_helper.rb +7 -48
  237. data/spec/core_extensions_spec.rb +626 -0
  238. data/spec/extensions/active_model_spec.rb +13 -0
  239. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  240. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  241. data/spec/extensions/association_dependencies_spec.rb +15 -25
  242. data/spec/extensions/association_pks_spec.rb +66 -32
  243. data/spec/extensions/association_proxies_spec.rb +4 -4
  244. data/spec/extensions/boolean_readers_spec.rb +25 -25
  245. data/spec/extensions/caching_spec.rb +47 -51
  246. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  247. data/spec/extensions/columns_introspection_spec.rb +91 -0
  248. data/spec/extensions/composition_spec.rb +18 -13
  249. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  250. data/spec/extensions/constraint_validations_spec.rb +316 -0
  251. data/spec/extensions/dataset_associations_spec.rb +199 -0
  252. data/spec/extensions/defaults_setter_spec.rb +88 -0
  253. data/spec/extensions/dirty_spec.rb +155 -0
  254. data/spec/extensions/eager_each_spec.rb +34 -0
  255. data/spec/extensions/eval_inspect_spec.rb +67 -0
  256. data/spec/extensions/force_encoding_spec.rb +4 -2
  257. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  258. data/spec/extensions/identity_map_spec.rb +142 -24
  259. data/spec/extensions/inflector_spec.rb +0 -4
  260. data/spec/extensions/instance_filters_spec.rb +11 -21
  261. data/spec/extensions/instance_hooks_spec.rb +72 -0
  262. data/spec/extensions/json_serializer_spec.rb +49 -12
  263. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  264. data/spec/extensions/list_spec.rb +49 -40
  265. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  266. data/spec/extensions/many_through_many_spec.rb +368 -254
  267. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  268. data/spec/extensions/migration_spec.rb +140 -35
  269. data/spec/extensions/named_timezones_spec.rb +29 -11
  270. data/spec/extensions/nested_attributes_spec.rb +268 -89
  271. data/spec/extensions/null_dataset_spec.rb +85 -0
  272. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  273. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  274. data/spec/extensions/pg_array_spec.rb +320 -0
  275. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  276. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  277. data/spec/extensions/pg_hstore_spec.rb +194 -0
  278. data/spec/extensions/pg_inet_spec.rb +47 -0
  279. data/spec/extensions/pg_interval_spec.rb +72 -0
  280. data/spec/extensions/pg_json_spec.rb +99 -0
  281. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  282. data/spec/extensions/pg_range_spec.rb +395 -0
  283. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  284. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  285. data/spec/extensions/pg_row_spec.rb +323 -0
  286. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  287. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  288. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  289. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  290. data/spec/extensions/prepared_statements_spec.rb +87 -0
  291. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  292. data/spec/extensions/pretty_table_spec.rb +7 -6
  293. data/spec/extensions/query_literals_spec.rb +167 -0
  294. data/spec/extensions/query_spec.rb +9 -3
  295. data/spec/extensions/rcte_tree_spec.rb +50 -43
  296. data/spec/extensions/schema_caching_spec.rb +41 -0
  297. data/spec/extensions/schema_dumper_spec.rb +434 -49
  298. data/spec/extensions/schema_spec.rb +30 -49
  299. data/spec/extensions/select_remove_spec.rb +38 -0
  300. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  301. data/spec/extensions/serialization_spec.rb +86 -48
  302. data/spec/extensions/server_block_spec.rb +90 -0
  303. data/spec/extensions/sharding_spec.rb +69 -143
  304. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  305. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  306. data/spec/extensions/spec_helper.rb +34 -67
  307. data/spec/extensions/split_array_nil_spec.rb +24 -0
  308. data/spec/extensions/sql_expr_spec.rb +29 -60
  309. data/spec/extensions/static_cache_spec.rb +145 -0
  310. data/spec/extensions/subclasses_spec.rb +14 -0
  311. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  312. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  313. data/spec/extensions/timestamps_spec.rb +6 -6
  314. data/spec/extensions/to_dot_spec.rb +8 -11
  315. data/spec/extensions/touch_spec.rb +13 -14
  316. data/spec/extensions/tree_spec.rb +11 -26
  317. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  318. data/spec/extensions/update_primary_key_spec.rb +30 -24
  319. data/spec/extensions/validation_class_methods_spec.rb +58 -67
  320. data/spec/extensions/validation_helpers_spec.rb +31 -37
  321. data/spec/extensions/xml_serializer_spec.rb +29 -4
  322. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  323. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  324. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  325. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  326. data/spec/integration/associations_test.rb +659 -21
  327. data/spec/integration/database_test.rb +11 -5
  328. data/spec/integration/dataset_test.rb +717 -129
  329. data/spec/integration/eager_loader_test.rb +38 -54
  330. data/spec/integration/migrator_test.rb +2 -3
  331. data/spec/integration/model_test.rb +81 -2
  332. data/spec/integration/plugin_test.rb +604 -147
  333. data/spec/integration/prepared_statement_test.rb +272 -128
  334. data/spec/integration/schema_test.rb +367 -57
  335. data/spec/integration/spec_helper.rb +42 -32
  336. data/spec/integration/timezone_test.rb +38 -12
  337. data/spec/integration/transaction_test.rb +183 -8
  338. data/spec/integration/type_test.rb +31 -8
  339. data/spec/model/association_reflection_spec.rb +207 -8
  340. data/spec/model/associations_spec.rb +1206 -693
  341. data/spec/model/base_spec.rb +334 -100
  342. data/spec/model/dataset_methods_spec.rb +45 -27
  343. data/spec/model/eager_loading_spec.rb +828 -692
  344. data/spec/model/hooks_spec.rb +355 -67
  345. data/spec/model/model_spec.rb +251 -179
  346. data/spec/model/plugins_spec.rb +24 -13
  347. data/spec/model/record_spec.rb +506 -232
  348. data/spec/model/spec_helper.rb +16 -77
  349. data/spec/model/validations_spec.rb +38 -2
  350. data/spec/rcov.opts +2 -0
  351. metadata +209 -80
  352. data/spec/core/core_sql_spec.rb +0 -451
@@ -0,0 +1,111 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::AssociationPks" do
4
+ before do
5
+ @db = Sequel.mock
6
+ @db.extend_datasets do
7
+ def select_sql
8
+ sql = super
9
+ sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
10
+ sql
11
+ end
12
+ end
13
+ @Artist = Class.new(Sequel::Model(@db[:artists]))
14
+ @Artist.columns :id, :id2
15
+ @Album= Class.new(Sequel::Model(@db[:albums]))
16
+ @Album.columns :id, :artist_id, :id2, :artist_id2
17
+ @Tag = Class.new(Sequel::Model(@db[:tags]))
18
+ @Tag.columns :id, :id2
19
+ @Artist.plugin :prepared_statements_associations
20
+ @Album.plugin :prepared_statements_associations
21
+ @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
22
+ @Album.many_to_one :artist, :class=>@Artist
23
+ @Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>:album_id
24
+ @Artist.plugin :many_through_many
25
+ @Artist.many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
26
+ @db.sqls
27
+ end
28
+
29
+ specify "should run correct SQL for associations" do
30
+ @Artist.load(:id=>1).albums
31
+ @db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1) -- prepared"]
32
+
33
+ @Album.load(:id=>1, :artist_id=>2).artist
34
+ @db.sqls.should == ["SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1 -- prepared"]
35
+
36
+ @Album.load(:id=>1, :artist_id=>2).tags
37
+ @db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.album_id = 1)) -- prepared"]
38
+
39
+ @Artist.load(:id=>1).tags
40
+ @db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.artist_id = 1)) -- prepared"]
41
+ end
42
+
43
+ specify "should run correct SQL for composite key associations" do
44
+ @Artist.one_to_many :albums, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
45
+ @Album.many_to_one :artist, :class=>@Artist, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
46
+ @Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>[:album_id, :album_id2], :right_key=>[:tag_id, :tag_id2], :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
47
+ @Artist.many_through_many :tags, [[:albums, [:artist_id, :artist_id2], [:id, :id2]], [:albums_tags, [:album_id, :album_id2], [:tag_id, :tag_id2]]], :class=>@Tag, :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
48
+
49
+ @Artist.load(:id=>1, :id2=>2).albums
50
+ @db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
51
+
52
+ @Album.load(:id=>1, :artist_id=>2, :artist_id2=>3).artist
53
+ @db.sqls.should == ["SELECT * FROM artists WHERE ((artists.id = 2) AND (artists.id2 = 3)) LIMIT 1 -- prepared"]
54
+
55
+ @Album.load(:id=>1, :artist_id=>2, :id2=>3).tags
56
+ @db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2) AND (albums_tags.album_id = 1) AND (albums_tags.album_id2 = 3)) -- prepared"]
57
+
58
+ @Artist.load(:id=>1, :id2=>2).tags
59
+ @db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.id2 = albums_tags.album_id2) AND (albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
60
+ end
61
+
62
+ specify "should not run query if no objects can be associated" do
63
+ @Artist.new.albums.should == []
64
+ @Album.new.artist.should == nil
65
+ @db.sqls.should == []
66
+ end
67
+
68
+ specify "should run a regular query if there is a callback" do
69
+ @Artist.load(:id=>1).albums(proc{|ds| ds})
70
+ @db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
71
+ end
72
+
73
+ specify "should run a regular query if :prepared_statement=>false option is used for the association" do
74
+ @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :prepared_statement=>false
75
+ @Artist.load(:id=>1).albums
76
+ @db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
77
+ end
78
+
79
+ specify "should run a regular query if unrecognized association is used" do
80
+ a = @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
81
+ a[:type] = :foo
82
+ @Artist.load(:id=>1).albums
83
+ @db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
84
+ end
85
+
86
+ specify "should run a regular query if a block is used when defining the association" do
87
+ @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id do |ds| ds end
88
+ @Artist.load(:id=>1).albums
89
+ @db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
90
+ end
91
+
92
+ specify "should run a regular query if :conditions option is used when defining the association" do
93
+ @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>1}
94
+ @Artist.load(:id=>1).albums
95
+ @db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (a = 1))"]
96
+ end
97
+
98
+ specify "should run a regular query if :dataset option is used when defining the association" do
99
+ album = @Album
100
+ @Artist.one_to_many :albums, :class=>@Album, :dataset=>proc{album.filter(:artist_id=>id)}
101
+ @Artist.load(:id=>1).albums
102
+ @db.sqls.should == ["SELECT * FROM albums WHERE (artist_id = 1)"]
103
+ end
104
+
105
+ specify "should run a regular query if :cloning an association that doesn't used prepared statements" do
106
+ @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>1}
107
+ @Artist.one_to_many :oalbums, :clone=>:albums
108
+ @Artist.load(:id=>1).oalbums
109
+ @db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (a = 1))"]
110
+ end
111
+ end
@@ -0,0 +1,61 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "prepared_statements_safe plugin" do
4
+ before do
5
+ @db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
6
+ @c = Class.new(Sequel::Model(@db[:people]))
7
+ @c.columns :id, :name, :i
8
+ @c.instance_variable_set(:@db_schema, {:i=>{}, :name=>{}, :id=>{:primary_key=>true}})
9
+ @c.plugin :prepared_statements_safe
10
+ @p = @c.load(:id=>1, :name=>'foo', :i=>2)
11
+ @db.sqls
12
+ end
13
+
14
+ specify "should load the prepared_statements plugin" do
15
+ @c.plugins.should include(Sequel::Plugins::PreparedStatements)
16
+ end
17
+
18
+ specify "should set default values correctly" do
19
+ @c.prepared_statements_column_defaults.should == {:name=>nil, :i=>nil}
20
+ @c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
21
+ Class.new(@c).prepared_statements_column_defaults.should == {:name=>'foo'}
22
+ end
23
+
24
+ specify "should set default values when creating" do
25
+ @c.create
26
+ @db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \(NULL, NULL\)/
27
+ @c.create(:name=>'foo')
28
+ @db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((NULL|'foo'), (NULL|'foo')\)/
29
+ @c.create(:name=>'foo', :i=>2)
30
+ @db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
31
+ end
32
+
33
+ specify "should use database default values" do
34
+ @c.instance_variable_set(:@db_schema, {:i=>{:ruby_default=>2}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
35
+ c = Class.new(@c)
36
+ c.create
37
+ @db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
38
+ end
39
+
40
+ specify "should not set defaults for unparseable dataset default values" do
41
+ @c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
42
+ c = Class.new(@c)
43
+ c.create
44
+ @db.sqls.first.should == "INSERT INTO people (name) VALUES ('foo')"
45
+ end
46
+
47
+ specify "should save all fields when updating" do
48
+ @p.update(:i=>3)
49
+ @db.sqls.first.should =~ /UPDATE people SET (name = 'foo'|i = 3), (name = 'foo'|i = 3) WHERE \(id = 1\)/
50
+ end
51
+
52
+ specify "should work with abstract classes" do
53
+ c = Class.new(Sequel::Model)
54
+ c.plugin :prepared_statements_safe
55
+ c1 = Class.new(c)
56
+ c1.meta_def(:get_db_schema){@db_schema = {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}}}
57
+ c1.set_dataset(:people)
58
+ c1.prepared_statements_column_defaults.should == {:name=>'foo'}
59
+ Class.new(c1).prepared_statements_column_defaults.should == {:name=>'foo'}
60
+ end
61
+ end
@@ -0,0 +1,87 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "prepared_statements plugin" do
4
+ before do
5
+ @db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
6
+ @c = Class.new(Sequel::Model(@db[:people]))
7
+ @c.columns :id, :name, :i
8
+ @c.plugin :prepared_statements
9
+ @p = @c.load(:id=>1, :name=>'foo', :i=>2)
10
+ @ds = @c.dataset
11
+ @db.sqls
12
+ end
13
+
14
+ specify "should correctly lookup by primary key" do
15
+ @c[1].should == @p
16
+ @db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
17
+ end
18
+
19
+ specify "should correctly delete instance" do
20
+ @p.destroy.should == @p
21
+ @db.sqls.should == ["DELETE FROM people WHERE (id = 1)"]
22
+ end
23
+
24
+ specify "should correctly update instance" do
25
+ @p.update(:name=>'bar').should == @c.load(:id=>1, :name=>'bar', :i => 2)
26
+ @db.sqls.should == ["UPDATE people SET name = 'bar' WHERE (id = 1)"]
27
+ end
28
+
29
+ specify "should correctly create instance" do
30
+ @c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
31
+ @db.sqls.should == ["INSERT INTO people (name) VALUES ('foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
32
+ end
33
+
34
+ specify "should correctly create instance if dataset supports insert_select" do
35
+ ds = @c.instance_dataset
36
+ def ds.supports_insert_select?
37
+ true
38
+ end
39
+ def @ds.supports_insert_select?
40
+ true
41
+ end
42
+ def @ds.insert_select(h)
43
+ {:id=>1, :name=>'foo', :i => 2}
44
+ end
45
+ def @ds.insert_sql(*)
46
+ "#{super}#{' RETURNING *' if opts.has_key?(:returning)}"
47
+ end
48
+ @c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
49
+ @db.sqls.should == ["INSERT INTO people (name) VALUES ('foo') RETURNING *"]
50
+ end
51
+
52
+ specify "should work correctly when subclassing" do
53
+ c = Class.new(@c)
54
+ c[1].should == c.load(:id=>1, :name=>'foo', :i=>2)
55
+ @db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
56
+ end
57
+
58
+ describe " with placeholder type specifiers" do
59
+ before do
60
+ @ds.meta_def(:requires_placeholder_type_specifiers?){true}
61
+ end
62
+
63
+ specify "should correctly handle without schema type" do
64
+ @c[1].should == @p
65
+ @db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
66
+ end
67
+
68
+ specify "should correctly handle with schema type" do
69
+ @c.db_schema[:id][:type] = :integer
70
+ ds = @c.send(:prepared_lookup)
71
+ def ds.literal_symbol_append(sql, v)
72
+ if @opts[:bind_vars] and match = /\A\$(.*)\z/.match(v.to_s)
73
+ s = match[1].split('__')[0].to_sym
74
+ if prepared_arg?(s)
75
+ literal_append(sql, prepared_arg(s))
76
+ else
77
+ sql << v.to_s
78
+ end
79
+ else
80
+ super
81
+ end
82
+ end
83
+ @c[1].should == @p
84
+ @db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,31 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "prepared_statements_with_pk plugin" do
4
+ before do
5
+ @db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
6
+ @c = Class.new(Sequel::Model(@db[:people]))
7
+ @c.columns :id, :name, :i
8
+ @c.plugin :prepared_statements_with_pk
9
+ @p = @c.load(:id=>1, :name=>'foo', :i=>2)
10
+ @db.sqls
11
+ end
12
+
13
+ specify "should load the prepared_statements plugin" do
14
+ @c.plugins.should include(Sequel::Plugins::PreparedStatements)
15
+ end
16
+
17
+ specify "should correctly lookup by primary key from dataset" do
18
+ @c.dataset.filter(:name=>'foo')[1].should == @p
19
+ @c.db.sqls.should == ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
20
+ end
21
+
22
+ specify "should still work correctly if there are multiple conflicting variables" do
23
+ @c.dataset.filter(:name=>'foo').or(:name=>'bar')[1].should == @p
24
+ @c.db.sqls.should == ["SELECT * FROM people WHERE (((name = 'foo') OR (name = 'bar')) AND (people.id = 1)) LIMIT 1 -- read_only"]
25
+ end
26
+
27
+ specify "should still work correctly if the primary key is used elsewhere in the query" do
28
+ @c.dataset.filter{id > 2}[1].should == @p
29
+ @c.db.sqls.should == ["SELECT * FROM people WHERE ((id > 2) AND (people.id = 1)) LIMIT 1 -- read_only"]
30
+ end
31
+ end
@@ -7,12 +7,7 @@ describe "Dataset#print" do
7
7
  @output = StringIO.new
8
8
  @orig_stdout = $stdout
9
9
  $stdout = @output
10
- @dataset = Sequel::Dataset.new(nil).from(:items)
11
- def @dataset.fetch_rows(sql)
12
- yield({:a=>1, :b=>2})
13
- yield({:a=>3, :b=>4})
14
- yield({:a=>5, :b=>6})
15
- end
10
+ @dataset = Sequel.mock(:fetch=>[{:a=>1, :b=>2}, {:a=>3, :b=>4}, {:a=>5, :b=>6}])[:items]
16
11
  end
17
12
 
18
13
  after do
@@ -68,6 +63,12 @@ describe "PrettyTable" do
68
63
  /\n(\|x\|y\|)|(\|y\|x\|)\n/
69
64
  end
70
65
 
66
+ specify "should have #string return the string without printing" do
67
+ Sequel::PrettyTable.string(@data1).should =~ /\n(\|x\|y\|)|(\|y\|x\|)\n/
68
+ @output.rewind
69
+ @output.read.should == ''
70
+ end
71
+
71
72
  specify "should calculate the maximum width of each column correctly" do
72
73
  Sequel::PrettyTable.print(@data2, [:a, :b])
73
74
  @output.rewind
@@ -0,0 +1,167 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "query_literals extension" do
4
+ before do
5
+ @ds = Sequel::Dataset.new(nil).from(:t).extension(:query_literals)
6
+ end
7
+
8
+ it "should not use special support if given a block" do
9
+ @ds.select('a, b, c'){d}.sql.should == 'SELECT \'a, b, c\', d FROM t'
10
+ end
11
+
12
+ it "should have #select use literal string if given a single string" do
13
+ @ds.select('a, b, c').sql.should == 'SELECT a, b, c FROM t'
14
+ end
15
+
16
+ it "should have #select use placeholder literal string if given a string and additional arguments" do
17
+ @ds.select('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t'
18
+ end
19
+
20
+ it "should have #select work the standard way if initial string is a literal string already" do
21
+ @ds.select(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1 FROM t'
22
+ end
23
+
24
+ it "should have #select work regularly if not given a string as the first argument" do
25
+ @ds.select(:a, 1).sql.should == 'SELECT a, 1 FROM t'
26
+ end
27
+
28
+ describe 'with existing selection' do
29
+ before do
30
+ @ds = @ds.select(:d)
31
+ end
32
+
33
+ it "should have #select_more use literal string if given a single string" do
34
+ @ds.select_more('a, b, c').sql.should == 'SELECT d, a, b, c FROM t'
35
+ end
36
+
37
+ it "should have #select_ use placeholder literal string if given a string and additional arguments" do
38
+ @ds.select_more('a, b, ?', 1).sql.should == 'SELECT d, a, b, 1 FROM t'
39
+ end
40
+
41
+ it "should have #select_more work the standard way if initial string is a literal string already" do
42
+ @ds.select_more(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT d, a, b, ?, 1 FROM t'
43
+ end
44
+
45
+ it "should have #select_more work regularly if not given a string as the first argument" do
46
+ @ds.select_more(:a, 1).sql.should == 'SELECT d, a, 1 FROM t'
47
+ end
48
+ end
49
+
50
+ it "should have #select_append use literal string if given a single string" do
51
+ @ds.select_append('a, b, c').sql.should == 'SELECT *, a, b, c FROM t'
52
+ end
53
+
54
+ it "should have #select_append use placeholder literal string if given a string and additional arguments" do
55
+ @ds.select_append('a, b, ?', 1).sql.should == 'SELECT *, a, b, 1 FROM t'
56
+ end
57
+
58
+ it "should have #select_append work the standard way if initial string is a literal string already" do
59
+ @ds.select_append(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT *, a, b, ?, 1 FROM t'
60
+ end
61
+
62
+ it "should have #select_append work regularly if not given a string as the first argument" do
63
+ @ds.select_append(:a, 1).sql.should == 'SELECT *, a, 1 FROM t'
64
+ end
65
+
66
+ it "should have #select_group use literal string if given a single string" do
67
+ @ds.select_group('a, b, c').sql.should == 'SELECT a, b, c FROM t GROUP BY a, b, c'
68
+ end
69
+
70
+ it "should have #select_group use placeholder literal string if given a string and additional arguments" do
71
+ @ds.select_group('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t GROUP BY a, b, 1'
72
+ end
73
+
74
+ it "should have #select_group work the standard way if initial string is a literal string already" do
75
+ @ds.select_group(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1 FROM t GROUP BY a, b, ?, 1'
76
+ end
77
+
78
+ it "should have #select_group work regularly if not given a string as the first argument" do
79
+ @ds.select_group(:a, 1).sql.should == 'SELECT a, 1 FROM t GROUP BY a, 1'
80
+ end
81
+
82
+ it "should have #group use literal string if given a single string" do
83
+ @ds.group('a, b, c').sql.should == 'SELECT * FROM t GROUP BY a, b, c'
84
+ end
85
+
86
+ it "should have #group use placeholder literal string if given a string and additional arguments" do
87
+ @ds.group('a, b, ?', 1).sql.should == 'SELECT * FROM t GROUP BY a, b, 1'
88
+ end
89
+
90
+ it "should have #group work the standard way if initial string is a literal string already" do
91
+ @ds.group(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t GROUP BY a, b, ?, 1'
92
+ end
93
+
94
+ it "should have #group work regularly if not given a string as the first argument" do
95
+ @ds.group(:a, 1).sql.should == 'SELECT * FROM t GROUP BY a, 1'
96
+ end
97
+
98
+ it "should have #group_and_count use literal string if given a single string" do
99
+ @ds.group_and_count('a, b, c').sql.should == 'SELECT a, b, c, count(*) AS count FROM t GROUP BY a, b, c'
100
+ end
101
+
102
+ it "should have #group_and_count use placeholder literal string if given a string and additional arguments" do
103
+ @ds.group_and_count('a, b, ?', 1).sql.should == 'SELECT a, b, 1, count(*) AS count FROM t GROUP BY a, b, 1'
104
+ end
105
+
106
+ it "should have #group_and_count work the standard way if initial string is a literal string already" do
107
+ @ds.group_and_count(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT a, b, ?, 1, count(*) AS count FROM t GROUP BY a, b, ?, 1'
108
+ end
109
+
110
+ it "should have #group_and_count work regularly if not given a string as the first argument" do
111
+ @ds.group_and_count(:a, 1).sql.should == 'SELECT a, 1, count(*) AS count FROM t GROUP BY a, 1'
112
+ end
113
+
114
+ it "should have #order use literal string if given a single string" do
115
+ @ds.order('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c'
116
+ end
117
+
118
+ it "should have #order use placeholder literal string if given a string and additional arguments" do
119
+ @ds.order('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1'
120
+ end
121
+
122
+ it "should have #order work the standard way if initial string is a literal string already" do
123
+ @ds.order(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1'
124
+ end
125
+
126
+ it "should have #order work regularly if not given a string as the first argument" do
127
+ @ds.order(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1'
128
+ end
129
+
130
+ describe 'with existing order' do
131
+ before do
132
+ @ds = @ds.order(:d)
133
+ end
134
+
135
+ it "should have #order_more use literal string if given a single string" do
136
+ @ds.order_more('a, b, c').sql.should == 'SELECT * FROM t ORDER BY d, a, b, c'
137
+ end
138
+
139
+ it "should have #order_more use placeholder literal string if given a string and additional arguments" do
140
+ @ds.order_more('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, 1'
141
+ end
142
+
143
+ it "should have #order_more work the standard way if initial string is a literal string already" do
144
+ @ds.order_more(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, ?, 1'
145
+ end
146
+
147
+ it "should have #order_more work regularly if not given a string as the first argument" do
148
+ @ds.order_more(:a, 1).sql.should == 'SELECT * FROM t ORDER BY d, a, 1'
149
+ end
150
+
151
+ it "should have #order_prepend use literal string if given a single string" do
152
+ @ds.order_prepend('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c, d'
153
+ end
154
+
155
+ it "should have #order_append use placeholder literal string if given a string and additional arguments" do
156
+ @ds.order_prepend('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1, d'
157
+ end
158
+
159
+ it "should have #order_append work the standard way if initial string is a literal string already" do
160
+ @ds.order_prepend(Sequel.lit('a, b, ?'), 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1, d'
161
+ end
162
+
163
+ it "should have #order_append work regularly if not given a string as the first argument" do
164
+ @ds.order_prepend(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1, d'
165
+ end
166
+ end
167
+ end
@@ -17,6 +17,12 @@ describe "Dataset#query" do
17
17
  @d = Sequel::Dataset.new(nil)
18
18
  end
19
19
 
20
+ specify "should allow cloning without arguments" do
21
+ q = @d.query {clone}
22
+ q.class.should == @d.class
23
+ q.sql.should == "SELECT *"
24
+ end
25
+
20
26
  specify "should support #from" do
21
27
  q = @d.query {from :xxx}
22
28
  q.class.should == @d.class
@@ -35,13 +41,13 @@ describe "Dataset#query" do
35
41
  specify "should support #where" do
36
42
  q = @d.query do
37
43
  from :zzz
38
- where(:x + 2 > :y + 3)
44
+ where{x + 2 > Sequel.expr(:y) + 3}
39
45
  end
40
46
  q.class.should == @d.class
41
47
  q.sql.should == "SELECT * FROM zzz WHERE ((x + 2) > (y + 3))"
42
48
 
43
49
  q = @d.from(:zzz).query do
44
- where((:x.sql_number > 1) & (:y.sql_number > 2))
50
+ where{(x > 1) & (Sequel.expr(:y) > 2)}
45
51
  end
46
52
  q.class.should == @d.class
47
53
  q.sql.should == "SELECT * FROM zzz WHERE ((x > 1) AND (y > 2))"
@@ -57,7 +63,7 @@ describe "Dataset#query" do
57
63
  q = @d.query do
58
64
  from :abc
59
65
  group_by :id
60
- having(:x.sql_number >= 2)
66
+ having{x >= 2}
61
67
  end
62
68
  q.class.should == @d.class
63
69
  q.sql.should == "SELECT * FROM abc GROUP BY id HAVING (x >= 2)"