sequel 4.36.0 → 5.61.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.
- checksums.yaml +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
data/spec/adapters/mysql_spec.rb
DELETED
@@ -1,1319 +0,0 @@
|
|
1
|
-
SEQUEL_ADAPTER_TEST = :mysql
|
2
|
-
|
3
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
4
|
-
|
5
|
-
unless defined?(MYSQL_SOCKET_FILE)
|
6
|
-
MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
|
7
|
-
end
|
8
|
-
MYSQL_URI = URI.parse(DB.uri)
|
9
|
-
|
10
|
-
def DB.sqls
|
11
|
-
(@sqls ||= [])
|
12
|
-
end
|
13
|
-
logger = Object.new
|
14
|
-
def logger.method_missing(m, msg)
|
15
|
-
DB.sqls << msg
|
16
|
-
end
|
17
|
-
DB.loggers = [logger]
|
18
|
-
DB.drop_table?(:items, :dolls, :booltest)
|
19
|
-
|
20
|
-
SQL_BEGIN = 'BEGIN'
|
21
|
-
SQL_ROLLBACK = 'ROLLBACK'
|
22
|
-
SQL_COMMIT = 'COMMIT'
|
23
|
-
|
24
|
-
describe "MySQL", '#create_table' do
|
25
|
-
before do
|
26
|
-
@db = DB
|
27
|
-
@db.test_connection
|
28
|
-
DB.sqls.clear
|
29
|
-
end
|
30
|
-
after do
|
31
|
-
@db.drop_table?(:dolls)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should allow to specify options for MySQL" do
|
35
|
-
@db.create_table(:dolls, :engine => 'MyISAM', :charset => 'latin2'){text :name}
|
36
|
-
check_sqls do
|
37
|
-
@db.sqls.must_equal ["CREATE TABLE `dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should create a temporary table" do
|
42
|
-
@db.create_table(:tmp_dolls, :temp => true, :engine => 'MyISAM', :charset => 'latin2'){text :name}
|
43
|
-
check_sqls do
|
44
|
-
@db.sqls.must_equal ["CREATE TEMPORARY TABLE `tmp_dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should not use a default for a String :text=>true type" do
|
49
|
-
@db.create_table(:dolls){String :name, :text=>true, :default=>'blah'}
|
50
|
-
check_sqls do
|
51
|
-
@db.sqls.must_equal ["CREATE TABLE `dolls` (`name` text)"]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should not use a default for a File type" do
|
56
|
-
@db.create_table(:dolls){File :name, :default=>'blah'}
|
57
|
-
check_sqls do
|
58
|
-
@db.sqls.must_equal ["CREATE TABLE `dolls` (`name` blob)"]
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should respect the size option for File type" do
|
63
|
-
@db.create_table(:dolls) do
|
64
|
-
File :n1
|
65
|
-
File :n2, :size=>:tiny
|
66
|
-
File :n3, :size=>:medium
|
67
|
-
File :n4, :size=>:long
|
68
|
-
File :n5, :size=>255
|
69
|
-
end
|
70
|
-
@db.schema(:dolls).map{|k, v| v[:db_type]}.must_equal %w"blob tinyblob mediumblob longblob blob"
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should include an :auto_increment schema attribute if auto incrementing" do
|
74
|
-
@db.create_table(:dolls) do
|
75
|
-
primary_key :n4
|
76
|
-
Integer :n2
|
77
|
-
String :n3
|
78
|
-
end
|
79
|
-
@db.schema(:dolls).map{|k, v| v[:auto_increment]}.must_equal [true, nil, nil]
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should support collate with various other column options" do
|
83
|
-
@db.create_table!(:dolls){ String :name, :size=>128, :collate=>:utf8_bin, :default=>'foo', :null=>false, :unique=>true}
|
84
|
-
@db[:dolls].insert
|
85
|
-
@db[:dolls].select_map(:name).must_equal ["foo"]
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should be able to parse the default value for set and enum types" do
|
89
|
-
@db.create_table!(:dolls){column :t, "set('a', 'b', 'c', 'd')", :default=>'a,b'}
|
90
|
-
@db.schema(:dolls).first.last[:ruby_default].must_equal 'a,b'
|
91
|
-
@db.create_table!(:dolls){column :t, "enum('a', 'b', 'c', 'd')", :default=>'b'}
|
92
|
-
@db.schema(:dolls).first.last[:ruby_default].must_equal 'b'
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should allow setting auto_increment for existing column" do
|
96
|
-
@db.create_table(:dolls){Integer :a, :primary_key=>true}
|
97
|
-
@db.schema(:dolls).first.last[:auto_increment].must_equal false
|
98
|
-
@db.set_column_type :dolls, :a, Integer, :auto_increment=>true
|
99
|
-
@db.schema(:dolls).first.last[:auto_increment].must_equal true
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
if [:mysql, :mysql2].include?(DB.adapter_scheme)
|
104
|
-
describe "Sequel::MySQL::Database#convert_tinyint_to_bool" do
|
105
|
-
before do
|
106
|
-
@db = DB
|
107
|
-
@db.create_table(:booltest){column :b, 'tinyint(1)'; column :i, 'tinyint(4)'}
|
108
|
-
@ds = @db[:booltest]
|
109
|
-
end
|
110
|
-
after do
|
111
|
-
@db.convert_tinyint_to_bool = true
|
112
|
-
@db.drop_table?(:booltest)
|
113
|
-
end
|
114
|
-
|
115
|
-
it "should consider tinyint(1) datatypes as boolean if set, but not larger tinyints" do
|
116
|
-
@db.schema(:booltest, :reload=>true).map{|_, s| s[:type]}.must_equal [:boolean, :integer]
|
117
|
-
@db.convert_tinyint_to_bool = false
|
118
|
-
@db.schema(:booltest, :reload=>true).map{|_, s| s[:type]}.must_equal [:integer, :integer]
|
119
|
-
end
|
120
|
-
|
121
|
-
it "should return tinyint(1)s as bools and tinyint(4)s as integers when set" do
|
122
|
-
@db.convert_tinyint_to_bool = true
|
123
|
-
@ds.delete
|
124
|
-
@ds << {:b=>true, :i=>10}
|
125
|
-
@ds.all.must_equal [{:b=>true, :i=>10}]
|
126
|
-
@ds.delete
|
127
|
-
@ds << {:b=>false, :i=>0}
|
128
|
-
@ds.all.must_equal [{:b=>false, :i=>0}]
|
129
|
-
@ds.delete
|
130
|
-
@ds << {:b=>true, :i=>1}
|
131
|
-
@ds.all.must_equal [{:b=>true, :i=>1}]
|
132
|
-
end
|
133
|
-
|
134
|
-
it "should return all tinyints as integers when unset" do
|
135
|
-
@db.convert_tinyint_to_bool = false
|
136
|
-
@ds.delete
|
137
|
-
@ds << {:b=>true, :i=>10}
|
138
|
-
@ds.all.must_equal [{:b=>1, :i=>10}]
|
139
|
-
@ds.delete
|
140
|
-
@ds << {:b=>false, :i=>0}
|
141
|
-
@ds.all.must_equal [{:b=>0, :i=>0}]
|
142
|
-
|
143
|
-
@ds.delete
|
144
|
-
@ds << {:b=>1, :i=>10}
|
145
|
-
@ds.all.must_equal [{:b=>1, :i=>10}]
|
146
|
-
@ds.delete
|
147
|
-
@ds << {:b=>0, :i=>0}
|
148
|
-
@ds.all.must_equal [{:b=>0, :i=>0}]
|
149
|
-
end
|
150
|
-
|
151
|
-
it "should allow disabling the conversion on a per-dataset basis" do
|
152
|
-
@db.convert_tinyint_to_bool = true
|
153
|
-
ds = @ds.clone
|
154
|
-
def ds.cast_tinyint_integer?(f) true end #mysql
|
155
|
-
def ds.convert_tinyint_to_bool?() false end #mysql2
|
156
|
-
ds.delete
|
157
|
-
ds << {:b=>true, :i=>10}
|
158
|
-
ds.all.must_equal [{:b=>1, :i=>10}]
|
159
|
-
@ds.all.must_equal [{:b=>true, :i=>10}]
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
describe "A MySQL dataset" do
|
165
|
-
before do
|
166
|
-
DB.create_table(:items){String :name; Integer :value}
|
167
|
-
@d = DB[:items]
|
168
|
-
DB.sqls.clear
|
169
|
-
end
|
170
|
-
after do
|
171
|
-
DB.drop_table?(:items)
|
172
|
-
end
|
173
|
-
|
174
|
-
it "should quote columns and tables using back-ticks if quoting identifiers" do
|
175
|
-
@d.quote_identifiers = true
|
176
|
-
@d.select(:name).sql.must_equal 'SELECT `name` FROM `items`'
|
177
|
-
@d.select(Sequel.lit('COUNT(*)')).sql.must_equal 'SELECT COUNT(*) FROM `items`'
|
178
|
-
@d.select(Sequel.function(:max, :value)).sql.must_equal 'SELECT max(`value`) FROM `items`'
|
179
|
-
@d.select(Sequel.function(:NOW)).sql.must_equal 'SELECT NOW() FROM `items`'
|
180
|
-
@d.select(Sequel.function(:max, :items__value)).sql.must_equal 'SELECT max(`items`.`value`) FROM `items`'
|
181
|
-
@d.order(Sequel.expr(:name).desc).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
|
182
|
-
@d.select(Sequel.lit('items.name AS item_name')).sql.must_equal 'SELECT items.name AS item_name FROM `items`'
|
183
|
-
@d.select(Sequel.lit('`name`')).sql.must_equal 'SELECT `name` FROM `items`'
|
184
|
-
@d.select(Sequel.lit('max(items.`name`) AS `max_name`')).sql.must_equal 'SELECT max(items.`name`) AS `max_name` FROM `items`'
|
185
|
-
@d.select(Sequel.function(:test, :abc, 'hello')).sql.must_equal "SELECT test(`abc`, 'hello') FROM `items`"
|
186
|
-
@d.select(Sequel.function(:test, :abc__def, 'hello')).sql.must_equal "SELECT test(`abc`.`def`, 'hello') FROM `items`"
|
187
|
-
@d.select(Sequel.function(:test, :abc__def, 'hello').as(:x2)).sql.must_equal "SELECT test(`abc`.`def`, 'hello') AS `x2` FROM `items`"
|
188
|
-
@d.insert_sql(:value => 333).must_equal 'INSERT INTO `items` (`value`) VALUES (333)'
|
189
|
-
@d.insert_sql(:x => :y).must_equal 'INSERT INTO `items` (`x`) VALUES (`y`)'
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should quote fields correctly when reversing the order" do
|
193
|
-
@d.quote_identifiers = true
|
194
|
-
@d.reverse_order(:name).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
|
195
|
-
@d.reverse_order(Sequel.desc(:name)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC'
|
196
|
-
@d.reverse_order(:name, Sequel.desc(:test)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC, `test` ASC'
|
197
|
-
@d.reverse_order(Sequel.desc(:name), :test).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC, `test` DESC'
|
198
|
-
end
|
199
|
-
|
200
|
-
it "should support ORDER clause in UPDATE statements" do
|
201
|
-
@d.order(:name).update_sql(:value => 1).must_equal 'UPDATE `items` SET `value` = 1 ORDER BY `name`'
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should support LIMIT clause in UPDATE statements" do
|
205
|
-
@d.limit(10).update_sql(:value => 1).must_equal 'UPDATE `items` SET `value` = 1 LIMIT 10'
|
206
|
-
end
|
207
|
-
|
208
|
-
it "should support regexps" do
|
209
|
-
@d << {:name => 'abc', :value => 1}
|
210
|
-
@d << {:name => 'bcd', :value => 2}
|
211
|
-
@d.filter(:name => /bc/).count.must_equal 2
|
212
|
-
@d.filter(:name => /^bc/).count.must_equal 1
|
213
|
-
end
|
214
|
-
|
215
|
-
it "should have explain output" do
|
216
|
-
@d.explain.must_be_kind_of(String)
|
217
|
-
@d.explain(:extended=>true).must_be_kind_of(String)
|
218
|
-
@d.explain.wont_equal @d.explain(:extended=>true)
|
219
|
-
end
|
220
|
-
|
221
|
-
it "should correctly literalize strings with comment backslashes in them" do
|
222
|
-
@d.delete
|
223
|
-
@d << {:name => ':\\'}
|
224
|
-
|
225
|
-
@d.first[:name].must_equal ':\\'
|
226
|
-
end
|
227
|
-
|
228
|
-
it "should handle prepared statements with on_duplicate_key_update" do
|
229
|
-
@d.db.add_index :items, :value, :unique=>true
|
230
|
-
ds = @d.on_duplicate_key_update
|
231
|
-
ps = ds.prepare(:insert, :insert_user_id_feature_name, :value => :$v, :name => :$n)
|
232
|
-
ps.call(:v => 1, :n => 'a')
|
233
|
-
ds.all.must_equal [{:value=>1, :name=>'a'}]
|
234
|
-
ps.call(:v => 1, :n => 'b')
|
235
|
-
ds.all.must_equal [{:value=>1, :name=>'b'}]
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
describe "MySQL datasets" do
|
240
|
-
before do
|
241
|
-
@d = DB[:orders]
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should correctly quote column references" do
|
245
|
-
@d.quote_identifiers = true
|
246
|
-
market = 'ICE'
|
247
|
-
ack_stamp = Time.now - 15 * 60 # 15 minutes ago
|
248
|
-
@d.select(:market, Sequel.function(:minute, Sequel.function(:from_unixtime, :ack)).as(:minute)).
|
249
|
-
where{(ack > ack_stamp) & {:market => market}}.
|
250
|
-
group_by(Sequel.function(:minute, Sequel.function(:from_unixtime, :ack))).sql.must_equal \
|
251
|
-
"SELECT `market`, minute(from_unixtime(`ack`)) AS `minute` FROM `orders` WHERE ((`ack` > #{@d.literal(ack_stamp)}) AND (`market` = 'ICE')) GROUP BY minute(from_unixtime(`ack`))"
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
describe "Dataset#distinct" do
|
256
|
-
before do
|
257
|
-
@db = DB
|
258
|
-
@db.create_table!(:a) do
|
259
|
-
Integer :a
|
260
|
-
Integer :b
|
261
|
-
end
|
262
|
-
@ds = @db[:a]
|
263
|
-
end
|
264
|
-
after do
|
265
|
-
@db.drop_table?(:a)
|
266
|
-
end
|
267
|
-
|
268
|
-
it "#distinct with arguments should return results distinct on those arguments" do
|
269
|
-
@ds.insert(20, 10)
|
270
|
-
@ds.insert(30, 10)
|
271
|
-
@ds.order(:b, :a).distinct.map(:a).must_equal [20, 30]
|
272
|
-
@ds.order(:b, Sequel.desc(:a)).distinct.map(:a).must_equal [30, 20]
|
273
|
-
# MySQL doesn't respect orders when using the nonstandard GROUP BY
|
274
|
-
[[20], [30]].must_include(@ds.order(:b, :a).distinct(:b).map(:a))
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
describe "MySQL join expressions" do
|
279
|
-
before do
|
280
|
-
@ds = DB[:nodes]
|
281
|
-
end
|
282
|
-
|
283
|
-
it "should raise error for :full_outer join requests." do
|
284
|
-
lambda{@ds.join_table(:full_outer, :nodes)}.must_raise(Sequel::Error)
|
285
|
-
end
|
286
|
-
it "should support natural left joins" do
|
287
|
-
@ds.join_table(:natural_left, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
|
288
|
-
end
|
289
|
-
it "should support natural right joins" do
|
290
|
-
@ds.join_table(:natural_right, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT JOIN `nodes`'
|
291
|
-
end
|
292
|
-
it "should support natural left outer joins" do
|
293
|
-
@ds.join_table(:natural_left_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT OUTER JOIN `nodes`'
|
294
|
-
end
|
295
|
-
it "should support natural right outer joins" do
|
296
|
-
@ds.join_table(:natural_right_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT OUTER JOIN `nodes`'
|
297
|
-
end
|
298
|
-
it "should support natural inner joins" do
|
299
|
-
@ds.join_table(:natural_inner, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
|
300
|
-
end
|
301
|
-
it "should support cross joins" do
|
302
|
-
@ds.join_table(:cross, :nodes).sql.must_equal 'SELECT * FROM `nodes` CROSS JOIN `nodes`'
|
303
|
-
end
|
304
|
-
it "should support cross joins as inner joins if conditions are used" do
|
305
|
-
@ds.join_table(:cross, :nodes, :id=>:id).sql.must_equal 'SELECT * FROM `nodes` INNER JOIN `nodes` ON (`nodes`.`id` = `nodes`.`id`)'
|
306
|
-
end
|
307
|
-
it "should support straight joins (force left table to be read before right)" do
|
308
|
-
@ds.join_table(:straight, :nodes).sql.must_equal 'SELECT * FROM `nodes` STRAIGHT_JOIN `nodes`'
|
309
|
-
end
|
310
|
-
it "should support natural joins on multiple tables." do
|
311
|
-
@ds.join_table(:natural_left_outer, [:nodes, :branches]).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT OUTER JOIN (`nodes`, `branches`)'
|
312
|
-
end
|
313
|
-
it "should support straight joins on multiple tables." do
|
314
|
-
@ds.join_table(:straight, [:nodes,:branches]).sql.must_equal 'SELECT * FROM `nodes` STRAIGHT_JOIN (`nodes`, `branches`)'
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
describe "Joined MySQL dataset" do
|
319
|
-
before do
|
320
|
-
@ds = DB[:nodes]
|
321
|
-
end
|
322
|
-
|
323
|
-
it "should quote fields correctly" do
|
324
|
-
@ds.quote_identifiers = true
|
325
|
-
@ds.join(:attributes, :node_id => :id).sql.must_equal "SELECT * FROM `nodes` INNER JOIN `attributes` ON (`attributes`.`node_id` = `nodes`.`id`)"
|
326
|
-
end
|
327
|
-
|
328
|
-
it "should put a having clause before an order by clause" do
|
329
|
-
@ds.order(:aaa).having(:bbb => :ccc).sql.must_equal "SELECT * FROM `nodes` HAVING (`bbb` = `ccc`) ORDER BY `aaa`"
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
describe "A MySQL database" do
|
334
|
-
after do
|
335
|
-
DB.drop_table?(:test_innodb)
|
336
|
-
end
|
337
|
-
|
338
|
-
it "should handle the creation and dropping of an InnoDB table with foreign keys" do
|
339
|
-
DB.create_table!(:test_innodb, :engine=>:InnoDB){primary_key :id; foreign_key :fk, :test_innodb, :key=>:id}
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
describe "A MySQL database" do
|
344
|
-
before(:all) do
|
345
|
-
@db = DB
|
346
|
-
@db.create_table! :test2 do
|
347
|
-
text :name
|
348
|
-
integer :value
|
349
|
-
end
|
350
|
-
end
|
351
|
-
after(:all) do
|
352
|
-
@db.drop_table?(:test2)
|
353
|
-
end
|
354
|
-
|
355
|
-
it "should provide the server version" do
|
356
|
-
@db.server_version.must_be :>=, 40000
|
357
|
-
end
|
358
|
-
|
359
|
-
it "should cache the server version" do
|
360
|
-
# warm cache:
|
361
|
-
@db.server_version
|
362
|
-
@db.sqls.clear
|
363
|
-
3.times{@db.server_version}
|
364
|
-
@db.sqls.must_be :empty?
|
365
|
-
end
|
366
|
-
|
367
|
-
it "should support for_share" do
|
368
|
-
@db[:test2].delete
|
369
|
-
@db.transaction{@db[:test2].for_share.all.must_equal []}
|
370
|
-
end
|
371
|
-
|
372
|
-
it "should support column operations" do
|
373
|
-
@db.add_column :test2, :xyz, :text
|
374
|
-
|
375
|
-
@db[:test2].columns.must_equal [:name, :value, :xyz]
|
376
|
-
@db[:test2] << {:name => 'mmm', :value => 111, :xyz => '000'}
|
377
|
-
@db[:test2].first[:xyz].must_equal '000'
|
378
|
-
|
379
|
-
@db[:test2].columns.must_equal [:name, :value, :xyz]
|
380
|
-
@db.drop_column :test2, :xyz
|
381
|
-
|
382
|
-
@db[:test2].columns.must_equal [:name, :value]
|
383
|
-
|
384
|
-
@db[:test2].delete
|
385
|
-
@db.add_column :test2, :xyz, :text
|
386
|
-
@db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
|
387
|
-
|
388
|
-
@db[:test2].columns.must_equal [:name, :value, :xyz]
|
389
|
-
@db.rename_column :test2, :xyz, :zyx, :type => :text
|
390
|
-
@db[:test2].columns.must_equal [:name, :value, :zyx]
|
391
|
-
@db[:test2].first[:zyx].must_equal 'qqqq'
|
392
|
-
|
393
|
-
@db[:test2].delete
|
394
|
-
@db.add_column :test2, :tre, :text
|
395
|
-
@db[:test2] << {:name => 'mmm', :value => 111, :tre => 'qqqq'}
|
396
|
-
|
397
|
-
@db[:test2].columns.must_equal [:name, :value, :zyx, :tre]
|
398
|
-
@db.rename_column :test2, :tre, :ert, :type => :varchar, :size=>255
|
399
|
-
@db[:test2].columns.must_equal [:name, :value, :zyx, :ert]
|
400
|
-
@db[:test2].first[:ert].must_equal 'qqqq'
|
401
|
-
|
402
|
-
@db.add_column :test2, :xyz, :float
|
403
|
-
@db[:test2].delete
|
404
|
-
@db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
|
405
|
-
@db.set_column_type :test2, :xyz, :integer
|
406
|
-
|
407
|
-
@db[:test2].first[:xyz].must_equal 57
|
408
|
-
|
409
|
-
@db.alter_table :test2 do
|
410
|
-
add_index :value, :unique=>true
|
411
|
-
add_foreign_key :value2, :test2, :key=>:value
|
412
|
-
end
|
413
|
-
@db[:test2].columns.must_equal [:name, :value, :zyx, :ert, :xyz, :value2]
|
414
|
-
|
415
|
-
@db.alter_table :test2 do
|
416
|
-
drop_foreign_key :value2
|
417
|
-
drop_index :value
|
418
|
-
end
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
|
-
describe "A MySQL database with table options" do
|
423
|
-
before do
|
424
|
-
@options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
|
425
|
-
|
426
|
-
Sequel::MySQL.default_engine = 'InnoDB'
|
427
|
-
Sequel::MySQL.default_charset = 'utf8'
|
428
|
-
Sequel::MySQL.default_collate = 'utf8_general_ci'
|
429
|
-
|
430
|
-
@db = DB
|
431
|
-
@db.drop_table?(:items)
|
432
|
-
|
433
|
-
DB.sqls.clear
|
434
|
-
end
|
435
|
-
after do
|
436
|
-
@db.drop_table?(:items)
|
437
|
-
|
438
|
-
Sequel::MySQL.default_engine = nil
|
439
|
-
Sequel::MySQL.default_charset = nil
|
440
|
-
Sequel::MySQL.default_collate = nil
|
441
|
-
end
|
442
|
-
|
443
|
-
it "should allow to pass custom options (engine, charset, collate) for table creation" do
|
444
|
-
@db.create_table(:items, @options){Integer :size; text :name}
|
445
|
-
check_sqls do
|
446
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
it "should use default options if specified (engine, charset, collate) for table creation" do
|
451
|
-
@db.create_table(:items){Integer :size; text :name}
|
452
|
-
check_sqls do
|
453
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
|
-
it "should not use default if option has a nil value" do
|
458
|
-
@db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
|
459
|
-
check_sqls do
|
460
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
|
461
|
-
end
|
462
|
-
end
|
463
|
-
end
|
464
|
-
|
465
|
-
describe "A MySQL database" do
|
466
|
-
before do
|
467
|
-
@db = DB
|
468
|
-
@db.drop_table?(:items)
|
469
|
-
DB.sqls.clear
|
470
|
-
end
|
471
|
-
after do
|
472
|
-
@db.drop_table?(:items, :users)
|
473
|
-
end
|
474
|
-
|
475
|
-
it "should support defaults for boolean columns" do
|
476
|
-
@db.create_table(:items){TrueClass :active1, :default=>true; FalseClass :active2, :default => false}
|
477
|
-
check_sqls do
|
478
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`active1` tinyint(1) DEFAULT 1, `active2` tinyint(1) DEFAULT 0)"]
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
it "should correctly format CREATE TABLE statements with foreign keys" do
|
483
|
-
@db.create_table(:items){primary_key :id; foreign_key :p_id, :items, :key => :id, :null => false, :on_delete => :cascade}
|
484
|
-
check_sqls do
|
485
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer PRIMARY KEY AUTO_INCREMENT, `p_id` integer NOT NULL, UNIQUE (`id`), FOREIGN KEY (`p_id`) REFERENCES `items`(`id`) ON DELETE CASCADE)"]
|
486
|
-
end
|
487
|
-
end
|
488
|
-
|
489
|
-
it "should correctly format CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
|
490
|
-
@db.create_table(:items){primary_key :id; Integer :other_than_id; foreign_key :p_id, :items, :key => :other_than_id, :null => false, :on_delete => :cascade}
|
491
|
-
check_sqls do
|
492
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer PRIMARY KEY AUTO_INCREMENT, `other_than_id` integer, `p_id` integer NOT NULL, UNIQUE (`other_than_id`), FOREIGN KEY (`p_id`) REFERENCES `items`(`other_than_id`) ON DELETE CASCADE)"]
|
493
|
-
end
|
494
|
-
end
|
495
|
-
|
496
|
-
it "should correctly format ALTER TABLE statements with foreign keys" do
|
497
|
-
@db.create_table(:items){Integer :id}
|
498
|
-
@db.create_table(:users){primary_key :id}
|
499
|
-
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade}
|
500
|
-
check_sqls do
|
501
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer)",
|
502
|
-
"CREATE TABLE `users` (`id` integer PRIMARY KEY AUTO_INCREMENT)",
|
503
|
-
"ALTER TABLE `items` ADD COLUMN `p_id` integer NOT NULL, ADD FOREIGN KEY (`p_id`) REFERENCES `users`(`id`) ON DELETE CASCADE"]
|
504
|
-
end
|
505
|
-
end
|
506
|
-
|
507
|
-
it "should correctly format ALTER TABLE statements with named foreign keys" do
|
508
|
-
@db.create_table(:items){Integer :id}
|
509
|
-
@db.create_table(:users){primary_key :id}
|
510
|
-
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade, :foreign_key_constraint_name => :pk_items__users }
|
511
|
-
check_sqls do
|
512
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer)",
|
513
|
-
"CREATE TABLE `users` (`id` integer PRIMARY KEY AUTO_INCREMENT)",
|
514
|
-
"ALTER TABLE `items` ADD COLUMN `p_id` integer NOT NULL, ADD CONSTRAINT `pk_items__users` FOREIGN KEY (`p_id`) REFERENCES `users`(`id`) ON DELETE CASCADE"]
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
it "should have rename_column support keep existing options" do
|
519
|
-
@db.create_table(:items){String :id, :null=>false, :default=>'blah'}
|
520
|
-
@db.alter_table(:items){rename_column :id, :nid}
|
521
|
-
check_sqls do
|
522
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` varchar(255) NOT NULL DEFAULT 'blah')", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `nid` varchar(255) NOT NULL DEFAULT 'blah'"]
|
523
|
-
end
|
524
|
-
@db[:items].insert
|
525
|
-
@db[:items].all.must_equal [{:nid=>'blah'}]
|
526
|
-
proc{@db[:items].insert(:nid=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
527
|
-
end
|
528
|
-
|
529
|
-
it "should have set_column_type support keep existing options" do
|
530
|
-
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
531
|
-
@db.alter_table(:items){set_column_type :id, :Bignum}
|
532
|
-
check_sqls do
|
533
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` bigint NOT NULL DEFAULT 5"]
|
534
|
-
end
|
535
|
-
@db[:items].insert
|
536
|
-
@db[:items].all.must_equal [{:id=>5}]
|
537
|
-
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
538
|
-
@db[:items].delete
|
539
|
-
@db[:items].insert(2**40)
|
540
|
-
@db[:items].all.must_equal [{:id=>2**40}]
|
541
|
-
end
|
542
|
-
|
543
|
-
it "should have set_column_type pass through options" do
|
544
|
-
@db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
|
545
|
-
@db.alter_table(:items){set_column_type :id, :int, :unsigned=>true, :size=>8; set_column_type :list, :enum, :elements=>%w[two]}
|
546
|
-
check_sqls do
|
547
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer, `list` enum('one'))", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(8) UNSIGNED NULL, CHANGE COLUMN `list` `list` enum('two') NULL"]
|
548
|
-
end
|
549
|
-
end
|
550
|
-
|
551
|
-
it "should have set_column_default support keep existing options" do
|
552
|
-
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
553
|
-
@db.alter_table(:items){set_column_default :id, 6}
|
554
|
-
check_sqls do
|
555
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NOT NULL DEFAULT 6"]
|
556
|
-
end
|
557
|
-
@db[:items].insert
|
558
|
-
@db[:items].all.must_equal [{:id=>6}]
|
559
|
-
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
560
|
-
end
|
561
|
-
|
562
|
-
it "should have set_column_allow_null support keep existing options" do
|
563
|
-
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
564
|
-
@db.alter_table(:items){set_column_allow_null :id, true}
|
565
|
-
check_sqls do
|
566
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NULL DEFAULT 5"]
|
567
|
-
end
|
568
|
-
@db[:items].insert
|
569
|
-
@db[:items].all.must_equal [{:id=>5}]
|
570
|
-
@db[:items].insert(:id=>nil)
|
571
|
-
end
|
572
|
-
|
573
|
-
it "should accept repeated raw sql statements using Database#<<" do
|
574
|
-
@db.create_table(:items){String :name; Integer :value}
|
575
|
-
@db << 'DELETE FROM items'
|
576
|
-
@db[:items].count.must_equal 0
|
577
|
-
|
578
|
-
@db << "INSERT INTO items (name, value) VALUES ('tutu', 1234)"
|
579
|
-
@db[:items].first.must_equal(:name => 'tutu', :value => 1234)
|
580
|
-
|
581
|
-
@db << 'DELETE FROM items'
|
582
|
-
@db[:items].first.must_equal nil
|
583
|
-
end
|
584
|
-
end
|
585
|
-
|
586
|
-
# Socket tests should only be run if the MySQL server is on localhost
|
587
|
-
if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and DB.adapter_scheme == :mysql
|
588
|
-
describe "A MySQL database" do
|
589
|
-
it "should accept a socket option" do
|
590
|
-
db = Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
591
|
-
db.test_connection
|
592
|
-
end
|
593
|
-
|
594
|
-
it "should accept a socket option without host option" do
|
595
|
-
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
596
|
-
db.test_connection
|
597
|
-
end
|
598
|
-
|
599
|
-
it "should fail to connect with invalid socket" do
|
600
|
-
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah')
|
601
|
-
proc{db.test_connection}.must_raise Sequel::DatabaseConnectionError
|
602
|
-
end
|
603
|
-
end
|
604
|
-
end
|
605
|
-
|
606
|
-
describe "A MySQL database" do
|
607
|
-
it "should accept a read_timeout option when connecting" do
|
608
|
-
db = Sequel.connect(DB.opts.merge(:read_timeout=>22342))
|
609
|
-
db.test_connection
|
610
|
-
end
|
611
|
-
|
612
|
-
it "should accept a connect_timeout option when connecting" do
|
613
|
-
db = Sequel.connect(DB.opts.merge(:connect_timeout=>22342))
|
614
|
-
db.test_connection
|
615
|
-
end
|
616
|
-
end
|
617
|
-
|
618
|
-
describe "MySQL foreign key support" do
|
619
|
-
after do
|
620
|
-
DB.drop_table?(:testfk, :testpk)
|
621
|
-
end
|
622
|
-
|
623
|
-
it "should create table without :key" do
|
624
|
-
DB.create_table!(:testpk){primary_key :id}
|
625
|
-
DB.create_table!(:testfk){foreign_key :fk, :testpk}
|
626
|
-
end
|
627
|
-
|
628
|
-
it "should create table with composite keys without :key" do
|
629
|
-
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
630
|
-
DB.create_table!(:testfk){Integer :fk; Integer :fk2; foreign_key([:fk, :fk2], :testpk)}
|
631
|
-
end
|
632
|
-
|
633
|
-
it "should create table with self referential without :key" do
|
634
|
-
DB.create_table!(:testfk){primary_key :id; foreign_key :fk, :testfk}
|
635
|
-
end
|
636
|
-
|
637
|
-
it "should create table with self referential with non-autoincrementing key without :key" do
|
638
|
-
DB.create_table!(:testfk){Integer :id, :primary_key=>true; foreign_key :fk, :testfk}
|
639
|
-
end
|
640
|
-
|
641
|
-
it "should create table with self referential with composite keys without :key" do
|
642
|
-
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2]); foreign_key([:fk, :fk2], :testfk)}
|
643
|
-
end
|
644
|
-
|
645
|
-
it "should alter table without :key" do
|
646
|
-
DB.create_table!(:testpk){primary_key :id}
|
647
|
-
DB.create_table!(:testfk){Integer :id}
|
648
|
-
DB.alter_table(:testfk){add_foreign_key :fk, :testpk}
|
649
|
-
end
|
650
|
-
|
651
|
-
it "should alter table with composite keys without :key" do
|
652
|
-
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
653
|
-
DB.create_table!(:testfk){Integer :fk; Integer :fk2}
|
654
|
-
DB.alter_table(:testfk){add_foreign_key([:fk, :fk2], :testpk)}
|
655
|
-
end
|
656
|
-
|
657
|
-
it "should alter table with self referential without :key" do
|
658
|
-
DB.create_table!(:testfk){primary_key :id}
|
659
|
-
DB.alter_table(:testfk){add_foreign_key :fk, :testfk}
|
660
|
-
end
|
661
|
-
|
662
|
-
it "should alter table with self referential with composite keys without :key" do
|
663
|
-
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2])}
|
664
|
-
DB.alter_table(:testfk){add_foreign_key [:fk, :fk2], :testfk}
|
665
|
-
end
|
666
|
-
end
|
667
|
-
|
668
|
-
describe "A grouped MySQL dataset" do
|
669
|
-
before do
|
670
|
-
DB.create_table! :test2 do
|
671
|
-
text :name
|
672
|
-
integer :value
|
673
|
-
end
|
674
|
-
DB[:test2] << {:name => '11', :value => 10}
|
675
|
-
DB[:test2] << {:name => '11', :value => 20}
|
676
|
-
DB[:test2] << {:name => '11', :value => 30}
|
677
|
-
DB[:test2] << {:name => '12', :value => 10}
|
678
|
-
DB[:test2] << {:name => '12', :value => 20}
|
679
|
-
DB[:test2] << {:name => '13', :value => 10}
|
680
|
-
end
|
681
|
-
after do
|
682
|
-
DB.drop_table?(:test2)
|
683
|
-
end
|
684
|
-
|
685
|
-
it "should return the correct count for raw sql query" do
|
686
|
-
ds = DB["select name FROM test2 WHERE name = '11' GROUP BY name"]
|
687
|
-
ds.count.must_equal 1
|
688
|
-
end
|
689
|
-
|
690
|
-
it "should return the correct count for a normal dataset" do
|
691
|
-
ds = DB[:test2].select(:name).where(:name => '11').group(:name)
|
692
|
-
ds.count.must_equal 1
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
describe "A MySQL database" do
|
697
|
-
before do
|
698
|
-
@db = DB
|
699
|
-
@db.drop_table?(:posts)
|
700
|
-
@db.sqls.clear
|
701
|
-
end
|
702
|
-
after do
|
703
|
-
@db.drop_table?(:posts)
|
704
|
-
end
|
705
|
-
|
706
|
-
it "should support fulltext indexes and full_text_search" do
|
707
|
-
@db.create_table(:posts, :engine=>:MyISAM){text :title; text :body; full_text_index :title; full_text_index [:title, :body]}
|
708
|
-
check_sqls do
|
709
|
-
@db.sqls.must_equal [
|
710
|
-
"CREATE TABLE `posts` (`title` text, `body` text) ENGINE=MyISAM",
|
711
|
-
"CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)",
|
712
|
-
"CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)"
|
713
|
-
]
|
714
|
-
end
|
715
|
-
|
716
|
-
@db[:posts].insert(:title=>'ruby rails', :body=>'y')
|
717
|
-
@db[:posts].insert(:title=>'sequel', :body=>'ruby')
|
718
|
-
@db[:posts].insert(:title=>'ruby scooby', :body=>'x')
|
719
|
-
@db.sqls.clear
|
720
|
-
|
721
|
-
@db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
|
722
|
-
@db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
|
723
|
-
@db[:posts].full_text_search(:title, '+ruby -rails', :boolean => true).all.must_equal [{:title=>'ruby scooby', :body=>'x'}]
|
724
|
-
check_sqls do
|
725
|
-
@db.sqls.must_equal [
|
726
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('rails'))",
|
727
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`, `body`) AGAINST ('sequel ruby'))",
|
728
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('+ruby -rails' IN BOOLEAN MODE))"]
|
729
|
-
end
|
730
|
-
|
731
|
-
@db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
732
|
-
@db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
733
|
-
end
|
734
|
-
|
735
|
-
it "should support spatial indexes" do
|
736
|
-
@db.create_table(:posts, :engine=>:MyISAM){point :geom, :null=>false; spatial_index [:geom]}
|
737
|
-
check_sqls do
|
738
|
-
@db.sqls.must_equal [
|
739
|
-
"CREATE TABLE `posts` (`geom` point NOT NULL) ENGINE=MyISAM",
|
740
|
-
"CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)"
|
741
|
-
]
|
742
|
-
end
|
743
|
-
end
|
744
|
-
|
745
|
-
it "should support indexes with index type" do
|
746
|
-
@db.create_table(:posts){Integer :id; index :id, :type => :btree}
|
747
|
-
check_sqls do
|
748
|
-
@db.sqls.must_equal [
|
749
|
-
"CREATE TABLE `posts` (`id` integer)",
|
750
|
-
"CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
751
|
-
]
|
752
|
-
end
|
753
|
-
end
|
754
|
-
|
755
|
-
it "should support unique indexes with index type" do
|
756
|
-
@db.create_table(:posts){Integer :id; index :id, :type => :btree, :unique => true}
|
757
|
-
check_sqls do
|
758
|
-
@db.sqls.must_equal [
|
759
|
-
"CREATE TABLE `posts` (`id` integer)",
|
760
|
-
"CREATE UNIQUE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
761
|
-
]
|
762
|
-
end
|
763
|
-
end
|
764
|
-
|
765
|
-
it "should not dump partial indexes" do
|
766
|
-
@db.create_table(:posts){text :id}
|
767
|
-
@db << "CREATE INDEX posts_id_index ON posts (id(10))"
|
768
|
-
@db.indexes(:posts).must_equal({})
|
769
|
-
end
|
770
|
-
|
771
|
-
it "should dump partial indexes if :partial option is set to true" do
|
772
|
-
@db.create_table(:posts){text :id}
|
773
|
-
@db << "CREATE INDEX posts_id_index ON posts (id(10))"
|
774
|
-
@db.indexes(:posts, :partial => true).must_equal(:posts_id_index => {:columns => [:id], :unique => false})
|
775
|
-
end
|
776
|
-
end
|
777
|
-
|
778
|
-
describe "MySQL::Dataset#insert and related methods" do
|
779
|
-
before do
|
780
|
-
DB.create_table(:items){String :name; Integer :value}
|
781
|
-
@d = DB[:items]
|
782
|
-
DB.sqls.clear
|
783
|
-
end
|
784
|
-
after do
|
785
|
-
DB.drop_table?(:items)
|
786
|
-
end
|
787
|
-
|
788
|
-
it "#insert should insert record with default values when no arguments given" do
|
789
|
-
@d.insert
|
790
|
-
check_sqls do
|
791
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
792
|
-
end
|
793
|
-
@d.all.must_equal [{:name => nil, :value => nil}]
|
794
|
-
end
|
795
|
-
|
796
|
-
it "#insert should insert record with default values when empty hash given" do
|
797
|
-
@d.insert({})
|
798
|
-
check_sqls do
|
799
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
800
|
-
end
|
801
|
-
@d.all.must_equal [{:name => nil, :value => nil}]
|
802
|
-
end
|
803
|
-
|
804
|
-
it "#insert should insert record with default values when empty array given" do
|
805
|
-
@d.insert []
|
806
|
-
check_sqls do
|
807
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
808
|
-
end
|
809
|
-
@d.all.must_equal [{:name => nil, :value => nil}]
|
810
|
-
end
|
811
|
-
|
812
|
-
it "#on_duplicate_key_update should work with regular inserts" do
|
813
|
-
DB.add_index :items, :name, :unique=>true
|
814
|
-
DB.sqls.clear
|
815
|
-
@d.insert(:name => 'abc', :value => 1)
|
816
|
-
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
817
|
-
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
|
818
|
-
|
819
|
-
check_sqls do
|
820
|
-
DB.sqls.length.must_equal 3
|
821
|
-
DB.sqls[0].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/)
|
822
|
-
DB.sqls[1].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/)
|
823
|
-
DB.sqls[2].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('def'|2), (2|'def')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/)
|
824
|
-
end
|
825
|
-
|
826
|
-
@d.all.must_equal [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
827
|
-
end
|
828
|
-
|
829
|
-
it "#multi_replace should insert multiple records in a single statement" do
|
830
|
-
@d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
|
831
|
-
|
832
|
-
check_sqls do
|
833
|
-
DB.sqls.must_equal [
|
834
|
-
SQL_BEGIN,
|
835
|
-
"REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
836
|
-
SQL_COMMIT
|
837
|
-
]
|
838
|
-
end
|
839
|
-
|
840
|
-
@d.all.must_equal [
|
841
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
842
|
-
]
|
843
|
-
end
|
844
|
-
|
845
|
-
it "#multi_replace should split the list of records into batches if :commit_every option is given" do
|
846
|
-
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
847
|
-
:commit_every => 2)
|
848
|
-
|
849
|
-
check_sqls do
|
850
|
-
DB.sqls.must_equal [
|
851
|
-
SQL_BEGIN,
|
852
|
-
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
853
|
-
SQL_COMMIT,
|
854
|
-
SQL_BEGIN,
|
855
|
-
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
856
|
-
SQL_COMMIT
|
857
|
-
]
|
858
|
-
end
|
859
|
-
|
860
|
-
@d.all.must_equal [
|
861
|
-
{:name => nil, :value => 1},
|
862
|
-
{:name => nil, :value => 2},
|
863
|
-
{:name => nil, :value => 3},
|
864
|
-
{:name => nil, :value => 4}
|
865
|
-
]
|
866
|
-
end
|
867
|
-
|
868
|
-
it "#multi_replace should split the list of records into batches if :slice option is given" do
|
869
|
-
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
870
|
-
:slice => 2)
|
871
|
-
|
872
|
-
check_sqls do
|
873
|
-
DB.sqls.must_equal [
|
874
|
-
SQL_BEGIN,
|
875
|
-
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
876
|
-
SQL_COMMIT,
|
877
|
-
SQL_BEGIN,
|
878
|
-
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
879
|
-
SQL_COMMIT
|
880
|
-
]
|
881
|
-
end
|
882
|
-
|
883
|
-
@d.all.must_equal [
|
884
|
-
{:name => nil, :value => 1},
|
885
|
-
{:name => nil, :value => 2},
|
886
|
-
{:name => nil, :value => 3},
|
887
|
-
{:name => nil, :value => 4}
|
888
|
-
]
|
889
|
-
end
|
890
|
-
|
891
|
-
it "#multi_insert should insert multiple records in a single statement" do
|
892
|
-
@d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
893
|
-
|
894
|
-
check_sqls do
|
895
|
-
DB.sqls.must_equal [
|
896
|
-
SQL_BEGIN,
|
897
|
-
"INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
|
898
|
-
SQL_COMMIT
|
899
|
-
]
|
900
|
-
end
|
901
|
-
|
902
|
-
@d.all.must_equal [
|
903
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
904
|
-
]
|
905
|
-
end
|
906
|
-
|
907
|
-
it "#multi_insert should split the list of records into batches if :commit_every option is given" do
|
908
|
-
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
909
|
-
:commit_every => 2)
|
910
|
-
|
911
|
-
check_sqls do
|
912
|
-
DB.sqls.must_equal [
|
913
|
-
SQL_BEGIN,
|
914
|
-
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
915
|
-
SQL_COMMIT,
|
916
|
-
SQL_BEGIN,
|
917
|
-
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
918
|
-
SQL_COMMIT
|
919
|
-
]
|
920
|
-
end
|
921
|
-
|
922
|
-
@d.all.must_equal [
|
923
|
-
{:name => nil, :value => 1},
|
924
|
-
{:name => nil, :value => 2},
|
925
|
-
{:name => nil, :value => 3},
|
926
|
-
{:name => nil, :value => 4}
|
927
|
-
]
|
928
|
-
end
|
929
|
-
|
930
|
-
it "#multi_insert should split the list of records into batches if :slice option is given" do
|
931
|
-
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
932
|
-
:slice => 2)
|
933
|
-
|
934
|
-
check_sqls do
|
935
|
-
DB.sqls.must_equal [
|
936
|
-
SQL_BEGIN,
|
937
|
-
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
938
|
-
SQL_COMMIT,
|
939
|
-
SQL_BEGIN,
|
940
|
-
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
941
|
-
SQL_COMMIT
|
942
|
-
]
|
943
|
-
end
|
944
|
-
|
945
|
-
@d.all.must_equal [
|
946
|
-
{:name => nil, :value => 1},
|
947
|
-
{:name => nil, :value => 2},
|
948
|
-
{:name => nil, :value => 3},
|
949
|
-
{:name => nil, :value => 4}
|
950
|
-
]
|
951
|
-
end
|
952
|
-
|
953
|
-
it "#import should support inserting using columns and values arrays" do
|
954
|
-
@d.import([:name, :value], [['abc', 1], ['def', 2]])
|
955
|
-
|
956
|
-
check_sqls do
|
957
|
-
DB.sqls.must_equal [
|
958
|
-
SQL_BEGIN,
|
959
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
|
960
|
-
SQL_COMMIT
|
961
|
-
]
|
962
|
-
end
|
963
|
-
|
964
|
-
@d.all.must_equal [
|
965
|
-
{:name => 'abc', :value => 1},
|
966
|
-
{:name => 'def', :value => 2}
|
967
|
-
]
|
968
|
-
end
|
969
|
-
|
970
|
-
it "#insert_ignore should add the IGNORE keyword when inserting" do
|
971
|
-
@d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
972
|
-
|
973
|
-
check_sqls do
|
974
|
-
DB.sqls.must_equal [
|
975
|
-
SQL_BEGIN,
|
976
|
-
"INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
977
|
-
SQL_COMMIT
|
978
|
-
]
|
979
|
-
end
|
980
|
-
|
981
|
-
@d.all.must_equal [
|
982
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
983
|
-
]
|
984
|
-
end
|
985
|
-
|
986
|
-
it "#insert_ignore should add the IGNORE keyword for single inserts" do
|
987
|
-
@d.insert_ignore.insert(:name => 'ghi')
|
988
|
-
check_sqls do
|
989
|
-
DB.sqls.must_equal ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
|
990
|
-
end
|
991
|
-
@d.all.must_equal [{:name => 'ghi', :value => nil}]
|
992
|
-
end
|
993
|
-
|
994
|
-
it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and ALL columns when no args given" do
|
995
|
-
@d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
|
996
|
-
|
997
|
-
check_sqls do
|
998
|
-
DB.sqls.must_equal [
|
999
|
-
"SELECT * FROM `items` LIMIT 1",
|
1000
|
-
SQL_BEGIN,
|
1001
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
|
1002
|
-
SQL_COMMIT
|
1003
|
-
]
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
@d.all.must_equal [
|
1007
|
-
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
1008
|
-
]
|
1009
|
-
end
|
1010
|
-
|
1011
|
-
it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and columns specified when args are given" do
|
1012
|
-
@d.on_duplicate_key_update(:value).import([:name,:value],
|
1013
|
-
[['abc', 1], ['def',2]]
|
1014
|
-
)
|
1015
|
-
|
1016
|
-
check_sqls do
|
1017
|
-
DB.sqls.must_equal [
|
1018
|
-
SQL_BEGIN,
|
1019
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
|
1020
|
-
SQL_COMMIT
|
1021
|
-
]
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
@d.all.must_equal [
|
1025
|
-
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
1026
|
-
]
|
1027
|
-
end
|
1028
|
-
|
1029
|
-
end
|
1030
|
-
|
1031
|
-
describe "MySQL::Dataset#update and related methods" do
|
1032
|
-
before do
|
1033
|
-
DB.create_table(:items){String :name; Integer :value; index :name, :unique=>true}
|
1034
|
-
@d = DB[:items]
|
1035
|
-
end
|
1036
|
-
after do
|
1037
|
-
DB.drop_table?(:items)
|
1038
|
-
end
|
1039
|
-
|
1040
|
-
it "#update_ignore should not raise error where normal update would fail" do
|
1041
|
-
@d.insert(:name => 'cow', :value => 0)
|
1042
|
-
@d.insert(:name => 'cat', :value => 1)
|
1043
|
-
proc{@d.where(:value => 1).update(:name => 'cow')}.must_raise(Sequel::UniqueConstraintViolation)
|
1044
|
-
DB.sqls.clear
|
1045
|
-
@d.update_ignore.where(:value => 1).update(:name => 'cow')
|
1046
|
-
check_sqls do
|
1047
|
-
DB.sqls.must_equal ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
|
1048
|
-
end
|
1049
|
-
@d.order(:name).all.must_equal [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
1050
|
-
end
|
1051
|
-
end
|
1052
|
-
|
1053
|
-
describe "MySQL::Dataset#replace" do
|
1054
|
-
before do
|
1055
|
-
DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
|
1056
|
-
@d = DB[:items]
|
1057
|
-
DB.sqls.clear
|
1058
|
-
end
|
1059
|
-
after do
|
1060
|
-
DB.drop_table?(:items)
|
1061
|
-
end
|
1062
|
-
|
1063
|
-
it "should use default values if they exist" do
|
1064
|
-
DB.alter_table(:items){set_column_default :id, 1; set_column_default :value, 2}
|
1065
|
-
@d.replace
|
1066
|
-
@d.all.must_equal [{:id=>1, :value=>2}]
|
1067
|
-
@d.replace([])
|
1068
|
-
@d.all.must_equal [{:id=>1, :value=>2}]
|
1069
|
-
@d.replace({})
|
1070
|
-
@d.all.must_equal [{:id=>1, :value=>2}]
|
1071
|
-
end
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
describe "MySQL::Dataset#complex_expression_sql" do
|
1075
|
-
before do
|
1076
|
-
@d = DB.dataset
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
it "should handle string concatenation with CONCAT if more than one record" do
|
1080
|
-
@d.literal(Sequel.join([:x, :y])).must_equal "CONCAT(`x`, `y`)"
|
1081
|
-
@d.literal(Sequel.join([:x, :y], ' ')).must_equal "CONCAT(`x`, ' ', `y`)"
|
1082
|
-
@d.literal(Sequel.join([Sequel.function(:x, :y), 1, Sequel.lit('z')], Sequel.subscript(:y, 1))).must_equal "CONCAT(x(`y`), `y`[1], '1', `y`[1], z)"
|
1083
|
-
end
|
1084
|
-
|
1085
|
-
it "should handle string concatenation as simple string if just one record" do
|
1086
|
-
@d.literal(Sequel.join([:x])).must_equal "`x`"
|
1087
|
-
@d.literal(Sequel.join([:x], ' ')).must_equal "`x`"
|
1088
|
-
end
|
1089
|
-
end
|
1090
|
-
|
1091
|
-
describe "MySQL::Dataset#calc_found_rows" do
|
1092
|
-
before do
|
1093
|
-
DB.create_table!(:items){Integer :a}
|
1094
|
-
end
|
1095
|
-
after do
|
1096
|
-
DB.drop_table?(:items)
|
1097
|
-
end
|
1098
|
-
|
1099
|
-
it "should add the SQL_CALC_FOUND_ROWS keyword when selecting" do
|
1100
|
-
DB[:items].select(:a).calc_found_rows.limit(1).sql.must_equal \
|
1101
|
-
'SELECT SQL_CALC_FOUND_ROWS `a` FROM `items` LIMIT 1'
|
1102
|
-
end
|
1103
|
-
|
1104
|
-
it "should count matching rows disregarding LIMIT clause" do
|
1105
|
-
DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
1106
|
-
DB.sqls.clear
|
1107
|
-
|
1108
|
-
DB.synchronize do
|
1109
|
-
DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.must_equal [{:a => 1}]
|
1110
|
-
DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.must_equal [{:rows => 2 }]
|
1111
|
-
end
|
1112
|
-
|
1113
|
-
check_sqls do
|
1114
|
-
DB.sqls.must_equal [
|
1115
|
-
'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
|
1116
|
-
'SELECT FOUND_ROWS() AS `rows`',
|
1117
|
-
]
|
1118
|
-
end
|
1119
|
-
end
|
1120
|
-
end
|
1121
|
-
|
1122
|
-
if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_scheme == :mysql2
|
1123
|
-
describe "MySQL Stored Procedures" do
|
1124
|
-
before do
|
1125
|
-
DB.create_table(:items){Integer :id; Integer :value}
|
1126
|
-
@d = DB[:items]
|
1127
|
-
DB.sqls.clear
|
1128
|
-
end
|
1129
|
-
after do
|
1130
|
-
DB.drop_table?(:items)
|
1131
|
-
DB.execute('DROP PROCEDURE test_sproc')
|
1132
|
-
end
|
1133
|
-
|
1134
|
-
it "should be callable on the database object" do
|
1135
|
-
DB.execute_ddl('CREATE PROCEDURE test_sproc() BEGIN DELETE FROM items; END')
|
1136
|
-
DB[:items].delete
|
1137
|
-
DB[:items].insert(:value=>1)
|
1138
|
-
DB[:items].count.must_equal 1
|
1139
|
-
DB.call_sproc(:test_sproc)
|
1140
|
-
DB[:items].count.must_equal 0
|
1141
|
-
end
|
1142
|
-
|
1143
|
-
# Mysql2 doesn't support stored procedures that return result sets, probably because
|
1144
|
-
# CLIENT_MULTI_RESULTS is not set.
|
1145
|
-
unless DB.adapter_scheme == :mysql2
|
1146
|
-
it "should be callable on the dataset object" do
|
1147
|
-
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER) BEGIN SELECT *, a AS b FROM items; END')
|
1148
|
-
DB[:items].delete
|
1149
|
-
@d = DB[:items]
|
1150
|
-
@d.call_sproc(:select, :test_sproc, 3).must_equal []
|
1151
|
-
@d.insert(:value=>1)
|
1152
|
-
@d.call_sproc(:select, :test_sproc, 4).must_equal [{:id=>nil, :value=>1, :b=>4}]
|
1153
|
-
@d.row_proc = proc{|r| r.keys.each{|k| r[k] *= 2 if r[k].is_a?(Integer)}; r}
|
1154
|
-
@d.call_sproc(:select, :test_sproc, 3).must_equal [{:id=>nil, :value=>2, :b=>6}]
|
1155
|
-
end
|
1156
|
-
|
1157
|
-
it "should be callable on the dataset object with multiple arguments" do
|
1158
|
-
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER, c INTEGER) BEGIN SELECT *, a AS b, c AS d FROM items; END')
|
1159
|
-
DB[:items].delete
|
1160
|
-
@d = DB[:items]
|
1161
|
-
@d.call_sproc(:select, :test_sproc, 3, 4).must_equal []
|
1162
|
-
@d.insert(:value=>1)
|
1163
|
-
@d.call_sproc(:select, :test_sproc, 4, 5).must_equal [{:id=>nil, :value=>1, :b=>4, :d=>5}]
|
1164
|
-
@d.row_proc = proc{|r| r.keys.each{|k| r[k] *= 2 if r[k].is_a?(Integer)}; r}
|
1165
|
-
@d.call_sproc(:select, :test_sproc, 3, 4).must_equal [{:id=>nil, :value=>2, :b=>6, :d => 8}]
|
1166
|
-
end
|
1167
|
-
end
|
1168
|
-
|
1169
|
-
it "should deal with nil values" do
|
1170
|
-
DB.execute_ddl('CREATE PROCEDURE test_sproc(i INTEGER, v INTEGER) BEGIN INSERT INTO items VALUES (i, v); END')
|
1171
|
-
DB[:items].delete
|
1172
|
-
DB.call_sproc(:test_sproc, :args=>[1, nil])
|
1173
|
-
DB[:items].all.must_equal [{:id=>1, :value=>nil}]
|
1174
|
-
end
|
1175
|
-
end
|
1176
|
-
end
|
1177
|
-
|
1178
|
-
if DB.adapter_scheme == :mysql
|
1179
|
-
describe "MySQL bad date/time conversions" do
|
1180
|
-
after do
|
1181
|
-
DB.convert_invalid_date_time = false
|
1182
|
-
end
|
1183
|
-
|
1184
|
-
it "should raise an exception when a bad date/time is used and convert_invalid_date_time is false" do
|
1185
|
-
DB.convert_invalid_date_time = false
|
1186
|
-
proc{DB["SELECT CAST('0000-00-00' AS date)"].single_value}.must_raise(Sequel::InvalidValue)
|
1187
|
-
proc{DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value}.must_raise(Sequel::InvalidValue)
|
1188
|
-
proc{DB["SELECT CAST('25:00:00' AS time)"].single_value}.must_raise(Sequel::InvalidValue)
|
1189
|
-
end
|
1190
|
-
|
1191
|
-
it "should not use a nil value bad date/time is used and convert_invalid_date_time is nil or :nil" do
|
1192
|
-
DB.convert_invalid_date_time = nil
|
1193
|
-
DB["SELECT CAST('0000-00-00' AS date)"].single_value.must_equal nil
|
1194
|
-
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.must_equal nil
|
1195
|
-
DB["SELECT CAST('25:00:00' AS time)"].single_value.must_equal nil
|
1196
|
-
DB.convert_invalid_date_time = :nil
|
1197
|
-
DB["SELECT CAST('0000-00-00' AS date)"].single_value.must_equal nil
|
1198
|
-
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.must_equal nil
|
1199
|
-
DB["SELECT CAST('25:00:00' AS time)"].single_value.must_equal nil
|
1200
|
-
end
|
1201
|
-
|
1202
|
-
it "should not use a nil value bad date/time is used and convert_invalid_date_time is :string" do
|
1203
|
-
DB.convert_invalid_date_time = :string
|
1204
|
-
DB["SELECT CAST('0000-00-00' AS date)"].single_value.must_equal '0000-00-00'
|
1205
|
-
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.must_equal '0000-00-00 00:00:00'
|
1206
|
-
DB["SELECT CAST('25:00:00' AS time)"].single_value.must_equal '25:00:00'
|
1207
|
-
end
|
1208
|
-
end
|
1209
|
-
|
1210
|
-
describe "MySQL multiple result sets" do
|
1211
|
-
before do
|
1212
|
-
DB.create_table!(:a){Integer :a}
|
1213
|
-
DB.create_table!(:b){Integer :b}
|
1214
|
-
@ds = DB['SELECT * FROM a; SELECT * FROM b']
|
1215
|
-
DB[:a].insert(10)
|
1216
|
-
DB[:a].insert(15)
|
1217
|
-
DB[:b].insert(20)
|
1218
|
-
DB[:b].insert(25)
|
1219
|
-
end
|
1220
|
-
after do
|
1221
|
-
DB.drop_table?(:a, :b)
|
1222
|
-
end
|
1223
|
-
|
1224
|
-
it "should combine all results by default" do
|
1225
|
-
@ds.all.must_equal [{:a=>10}, {:a=>15}, {:b=>20}, {:b=>25}]
|
1226
|
-
end
|
1227
|
-
|
1228
|
-
it "should work with Database#run" do
|
1229
|
-
DB.run('SELECT * FROM a; SELECT * FROM b')
|
1230
|
-
DB.run('SELECT * FROM a; SELECT * FROM b')
|
1231
|
-
end
|
1232
|
-
|
1233
|
-
it "should work with Database#run and other statements" do
|
1234
|
-
DB.run('UPDATE a SET a = 1; SELECT * FROM a; DELETE FROM b')
|
1235
|
-
DB[:a].select_order_map(:a).must_equal [1, 1]
|
1236
|
-
DB[:b].all.must_equal []
|
1237
|
-
end
|
1238
|
-
|
1239
|
-
it "should split results returned into arrays if split_multiple_result_sets is used" do
|
1240
|
-
@ds.split_multiple_result_sets.all.must_equal [[{:a=>10}, {:a=>15}], [{:b=>20}, {:b=>25}]]
|
1241
|
-
end
|
1242
|
-
|
1243
|
-
it "should have regular row_procs work when splitting multiple result sets" do
|
1244
|
-
@ds.row_proc = proc{|x| x[x.keys.first] *= 2; x}
|
1245
|
-
@ds.split_multiple_result_sets.all.must_equal [[{:a=>20}, {:a=>30}], [{:b=>40}, {:b=>50}]]
|
1246
|
-
end
|
1247
|
-
|
1248
|
-
it "should use the columns from the first result set when splitting result sets" do
|
1249
|
-
@ds.split_multiple_result_sets.columns.must_equal [:a]
|
1250
|
-
end
|
1251
|
-
|
1252
|
-
it "should not allow graphing a dataset that splits multiple statements" do
|
1253
|
-
proc{@ds.split_multiple_result_sets.graph(:b, :b=>:a)}.must_raise(Sequel::Error)
|
1254
|
-
end
|
1255
|
-
|
1256
|
-
it "should not allow splitting a graphed dataset" do
|
1257
|
-
proc{DB[:a].graph(:b, :b=>:a).split_multiple_result_sets}.must_raise(Sequel::Error)
|
1258
|
-
end
|
1259
|
-
end
|
1260
|
-
end
|
1261
|
-
|
1262
|
-
if DB.adapter_scheme == :mysql2
|
1263
|
-
describe "Mysql2 streaming" do
|
1264
|
-
before(:all) do
|
1265
|
-
DB.create_table!(:a){Integer :a}
|
1266
|
-
DB.transaction do
|
1267
|
-
1000.times do |i|
|
1268
|
-
DB[:a].insert(i)
|
1269
|
-
end
|
1270
|
-
end
|
1271
|
-
@ds = DB[:a].stream.order(:a)
|
1272
|
-
end
|
1273
|
-
after(:all) do
|
1274
|
-
DB.drop_table?(:a)
|
1275
|
-
end
|
1276
|
-
|
1277
|
-
it "should correctly stream results" do
|
1278
|
-
@ds.map(:a).must_equal((0...1000).to_a)
|
1279
|
-
end
|
1280
|
-
|
1281
|
-
it "should correctly handle early returning when streaming results" do
|
1282
|
-
3.times{@ds.each{|r| break r[:a]}.must_equal 0}
|
1283
|
-
end
|
1284
|
-
end
|
1285
|
-
end
|
1286
|
-
|
1287
|
-
describe "MySQL joined datasets" do
|
1288
|
-
before do
|
1289
|
-
@db = DB
|
1290
|
-
@db.create_table!(:a) do
|
1291
|
-
Integer :id
|
1292
|
-
end
|
1293
|
-
@db.create_table!(:b) do
|
1294
|
-
Integer :id
|
1295
|
-
Integer :a_id
|
1296
|
-
end
|
1297
|
-
@db[:a].insert(1)
|
1298
|
-
@db[:a].insert(2)
|
1299
|
-
@db[:b].insert(3, 1)
|
1300
|
-
@db[:b].insert(4, 1)
|
1301
|
-
@db[:b].insert(5, 2)
|
1302
|
-
@ds = @db[:a].join(:b, :a_id=>:id)
|
1303
|
-
end
|
1304
|
-
after do
|
1305
|
-
@db.drop_table?(:a, :b)
|
1306
|
-
end
|
1307
|
-
|
1308
|
-
it "should support deletions from a single table" do
|
1309
|
-
@ds.where(:a__id=>1).delete
|
1310
|
-
@db[:a].select_order_map(:id).must_equal [2]
|
1311
|
-
@db[:b].select_order_map(:id).must_equal [3, 4, 5]
|
1312
|
-
end
|
1313
|
-
|
1314
|
-
it "should support deletions from multiple tables" do
|
1315
|
-
@ds.delete_from(:a, :b).where(:a__id=>1).delete
|
1316
|
-
@db[:a].select_order_map(:id).must_equal [2]
|
1317
|
-
@db[:b].select_order_map(:id).must_equal [5]
|
1318
|
-
end
|
1319
|
-
end
|