sequel 4.49.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -1,62 +1,33 @@
|
|
1
1
|
SEQUEL_ADAPTER_TEST = :mysql
|
2
2
|
|
3
|
-
|
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'
|
3
|
+
require_relative 'spec_helper'
|
23
4
|
|
24
5
|
describe "MySQL", '#create_table' do
|
25
6
|
before do
|
26
7
|
@db = DB
|
27
8
|
@db.test_connection
|
28
|
-
DB.sqls.clear
|
29
9
|
end
|
30
10
|
after do
|
31
11
|
@db.drop_table?(:dolls)
|
32
12
|
end
|
33
13
|
|
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
14
|
it "should create a temporary table" do
|
42
15
|
@db.create_table(:tmp_dolls, :temp => true, :engine => 'MyISAM', :charset => 'latin2'){text :name}
|
43
|
-
|
44
|
-
|
45
|
-
|
16
|
+
@db.table_exists?(:tmp_dolls).must_equal true
|
17
|
+
@db.disconnect
|
18
|
+
@db.table_exists?(:tmp_dolls).must_equal false
|
46
19
|
end
|
47
20
|
|
48
21
|
it "should not use a default for a String :text=>true type" do
|
49
22
|
@db.create_table(:dolls){String :name, :text=>true, :default=>'blah'}
|
50
|
-
|
51
|
-
|
52
|
-
end
|
23
|
+
@db[:dolls].insert
|
24
|
+
@db[:dolls].all.must_equal [{:name=>nil}]
|
53
25
|
end
|
54
26
|
|
55
27
|
it "should not use a default for a File type" do
|
56
28
|
@db.create_table(:dolls){File :name, :default=>'blah'}
|
57
|
-
|
58
|
-
|
59
|
-
end
|
29
|
+
@db[:dolls].insert
|
30
|
+
@db[:dolls].all.must_equal [{:name=>nil}]
|
60
31
|
end
|
61
32
|
|
62
33
|
it "should respect the size option for File type" do
|
@@ -166,38 +137,11 @@ describe "A MySQL dataset" do
|
|
166
137
|
before do
|
167
138
|
DB.create_table(:items){String :name; Integer :value}
|
168
139
|
@d = DB[:items]
|
169
|
-
DB.sqls.clear
|
170
140
|
end
|
171
141
|
after do
|
172
142
|
DB.drop_table?(:items)
|
173
143
|
end
|
174
144
|
|
175
|
-
it "should quote columns and tables using back-ticks if quoting identifiers" do
|
176
|
-
@d = @d.with_quote_identifiers(true)
|
177
|
-
@d.select(:name).sql.must_equal 'SELECT `name` FROM `items`'
|
178
|
-
@d.select(Sequel.lit('COUNT(*)')).sql.must_equal 'SELECT COUNT(*) FROM `items`'
|
179
|
-
@d.select(Sequel.function(:max, :value)).sql.must_equal 'SELECT max(`value`) FROM `items`'
|
180
|
-
@d.select(Sequel.function(:NOW)).sql.must_equal 'SELECT NOW() FROM `items`'
|
181
|
-
@d.select(Sequel.function(:max, Sequel[:items][:value])).sql.must_equal 'SELECT max(`items`.`value`) FROM `items`'
|
182
|
-
@d.order(Sequel.expr(:name).desc).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
|
183
|
-
@d.select(Sequel.lit('items.name AS item_name')).sql.must_equal 'SELECT items.name AS item_name FROM `items`'
|
184
|
-
@d.select(Sequel.lit('`name`')).sql.must_equal 'SELECT `name` FROM `items`'
|
185
|
-
@d.select(Sequel.lit('max(items.`name`) AS `max_name`')).sql.must_equal 'SELECT max(items.`name`) AS `max_name` FROM `items`'
|
186
|
-
@d.select(Sequel.function(:test, :abc, 'hello')).sql.must_equal "SELECT test(`abc`, 'hello') FROM `items`"
|
187
|
-
@d.select(Sequel.function(:test, Sequel[:abc][:def], 'hello')).sql.must_equal "SELECT test(`abc`.`def`, 'hello') FROM `items`"
|
188
|
-
@d.select(Sequel.function(:test, Sequel[:abc][:def], 'hello').as(:x2)).sql.must_equal "SELECT test(`abc`.`def`, 'hello') AS `x2` FROM `items`"
|
189
|
-
@d.insert_sql(:value => 333).must_equal 'INSERT INTO `items` (`value`) VALUES (333)'
|
190
|
-
@d.insert_sql(:x => :y).must_equal 'INSERT INTO `items` (`x`) VALUES (`y`)'
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should quote fields correctly when reversing the order" do
|
194
|
-
@d = @d.with_quote_identifiers(true)
|
195
|
-
@d.reverse_order(:name).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
|
196
|
-
@d.reverse_order(Sequel.desc(:name)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC'
|
197
|
-
@d.reverse_order(:name, Sequel.desc(:test)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC, `test` ASC'
|
198
|
-
@d.reverse_order(Sequel.desc(:name), :test).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC, `test` DESC'
|
199
|
-
end
|
200
|
-
|
201
145
|
it "should support ORDER clause in UPDATE statements" do
|
202
146
|
@d.order(:name).update_sql(:value => 1).must_equal 'UPDATE `items` SET `value` = 1 ORDER BY `name`'
|
203
147
|
end
|
@@ -217,7 +161,7 @@ describe "A MySQL dataset" do
|
|
217
161
|
it "should raise error for updating a dataset with an offset" do
|
218
162
|
proc{@d.offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
219
163
|
proc{@d.order(:value).offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
220
|
-
end
|
164
|
+
end
|
221
165
|
|
222
166
|
it "should support regexps" do
|
223
167
|
@d.insert(:name => 'abc', :value => 1)
|
@@ -250,22 +194,6 @@ describe "A MySQL dataset" do
|
|
250
194
|
end
|
251
195
|
end
|
252
196
|
|
253
|
-
describe "MySQL datasets" do
|
254
|
-
before do
|
255
|
-
@d = DB[:orders]
|
256
|
-
end
|
257
|
-
|
258
|
-
it "should correctly quote column references" do
|
259
|
-
@d = @d.with_quote_identifiers(true)
|
260
|
-
market = 'ICE'
|
261
|
-
ack_stamp = Time.now - 15 * 60 # 15 minutes ago
|
262
|
-
@d.select(:market, Sequel.function(:minute, Sequel.function(:from_unixtime, :ack)).as(:minute)).
|
263
|
-
where{(ack > ack_stamp) & {:market => market}}.
|
264
|
-
group_by(Sequel.function(:minute, Sequel.function(:from_unixtime, :ack))).sql.must_equal \
|
265
|
-
"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`))"
|
266
|
-
end
|
267
|
-
end
|
268
|
-
|
269
197
|
describe "Dataset#distinct" do
|
270
198
|
before do
|
271
199
|
@db = DB
|
@@ -290,59 +218,27 @@ describe "Dataset#distinct" do
|
|
290
218
|
end
|
291
219
|
|
292
220
|
describe "MySQL join expressions" do
|
293
|
-
before do
|
221
|
+
before(:all) do
|
294
222
|
@ds = DB[:nodes]
|
223
|
+
DB.create_table!(:nodes){Integer :id; Integer :y}
|
224
|
+
DB.create_table!(:n1){Integer :id}
|
225
|
+
DB.create_table!(:n2){Integer :y}
|
226
|
+
@ds.insert(:id=>1, :y=>2)
|
227
|
+
DB[:n1].insert(1)
|
228
|
+
DB[:n2].insert(2)
|
295
229
|
end
|
296
|
-
|
297
|
-
|
298
|
-
lambda{@ds.join_table(:full_outer, :nodes)}.must_raise(Sequel::Error)
|
299
|
-
end
|
300
|
-
it "should raise error for :natural_full join requests." do
|
301
|
-
lambda{@ds.join_table(:natural_full, :nodes)}.must_raise(Sequel::Error)
|
302
|
-
end
|
303
|
-
it "should support natural left joins" do
|
304
|
-
@ds.join_table(:natural_left, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
|
305
|
-
end
|
306
|
-
it "should support natural right joins" do
|
307
|
-
@ds.join_table(:natural_right, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT JOIN `nodes`'
|
308
|
-
end
|
309
|
-
it "should support natural left outer joins" do
|
310
|
-
@ds.join_table(:natural_left_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT OUTER JOIN `nodes`'
|
311
|
-
end
|
312
|
-
it "should support natural right outer joins" do
|
313
|
-
@ds.join_table(:natural_right_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT OUTER JOIN `nodes`'
|
314
|
-
end
|
315
|
-
deprecated "should support natural inner joins" do
|
316
|
-
@ds.join_table(:natural_inner, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
|
317
|
-
end
|
318
|
-
it "should support cross joins" do
|
319
|
-
@ds.join_table(:cross, :nodes).sql.must_equal 'SELECT * FROM `nodes` CROSS JOIN `nodes`'
|
320
|
-
end
|
321
|
-
deprecated "should support cross joins as inner joins if conditions are used" do
|
322
|
-
@ds.join_table(:cross, :nodes, :id=>:id).sql.must_equal 'SELECT * FROM `nodes` INNER JOIN `nodes` ON (`nodes`.`id` = `nodes`.`id`)'
|
230
|
+
after(:all) do
|
231
|
+
DB.drop_table?(:n2, :n1, :nodes)
|
323
232
|
end
|
233
|
+
|
324
234
|
it "should support straight joins (force left table to be read before right)" do
|
325
|
-
@ds.join_table(:straight, :
|
235
|
+
@ds.join_table(:straight, :n1).all.must_equal [{:id=>1, :y=>2}]
|
326
236
|
end
|
327
237
|
it "should support natural joins on multiple tables." do
|
328
|
-
@ds.join_table(:natural_left_outer, [:
|
238
|
+
@ds.join_table(:natural_left_outer, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
|
329
239
|
end
|
330
240
|
it "should support straight joins on multiple tables." do
|
331
|
-
@ds.join_table(:straight, [:
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
|
-
describe "Joined MySQL dataset" do
|
336
|
-
before do
|
337
|
-
@ds = DB[:nodes]
|
338
|
-
end
|
339
|
-
|
340
|
-
it "should quote fields correctly" do
|
341
|
-
@ds.with_quote_identifiers(true).join(:attributes, :node_id => :id).sql.must_equal "SELECT * FROM `nodes` INNER JOIN `attributes` ON (`attributes`.`node_id` = `nodes`.`id`)"
|
342
|
-
end
|
343
|
-
|
344
|
-
it "should put a having clause before an order by clause" do
|
345
|
-
@ds.order(:aaa).having(:bbb => :ccc).sql.must_equal "SELECT * FROM `nodes` HAVING (`bbb` = `ccc`) ORDER BY `aaa`"
|
241
|
+
@ds.join_table(:straight, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
|
346
242
|
end
|
347
243
|
end
|
348
244
|
|
@@ -377,14 +273,6 @@ describe "A MySQL database" do
|
|
377
273
|
@db.server_version.must_be :>=, 40000
|
378
274
|
end
|
379
275
|
|
380
|
-
it "should cache the server version" do
|
381
|
-
# warm cache:
|
382
|
-
@db.server_version
|
383
|
-
@db.sqls.clear
|
384
|
-
3.times{@db.server_version}
|
385
|
-
@db.sqls.must_be :empty?
|
386
|
-
end
|
387
|
-
|
388
276
|
it "should support for_share" do
|
389
277
|
@db[:test2].delete
|
390
278
|
@db.transaction{@db[:test2].for_share.all.must_equal []}
|
@@ -440,54 +328,6 @@ describe "A MySQL database" do
|
|
440
328
|
end
|
441
329
|
end
|
442
330
|
|
443
|
-
# SEQUEL5: Remove
|
444
|
-
describe "A MySQL database with table options" do
|
445
|
-
before do
|
446
|
-
@options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
|
447
|
-
|
448
|
-
deprecated do
|
449
|
-
Sequel::MySQL.default_engine = 'InnoDB'
|
450
|
-
Sequel::MySQL.default_charset = 'utf8'
|
451
|
-
Sequel::MySQL.default_collate = 'utf8_general_ci'
|
452
|
-
end
|
453
|
-
|
454
|
-
@db = DB
|
455
|
-
@db.drop_table?(:items)
|
456
|
-
|
457
|
-
DB.sqls.clear
|
458
|
-
end
|
459
|
-
after do
|
460
|
-
@db.drop_table?(:items)
|
461
|
-
|
462
|
-
deprecated do
|
463
|
-
Sequel::MySQL.default_engine = nil
|
464
|
-
Sequel::MySQL.default_charset = nil
|
465
|
-
Sequel::MySQL.default_collate = nil
|
466
|
-
end
|
467
|
-
end
|
468
|
-
|
469
|
-
it "should allow to pass custom options (engine, charset, collate) for table creation" do
|
470
|
-
@db.create_table(:items, @options){Integer :size; text :name}
|
471
|
-
check_sqls do
|
472
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
|
473
|
-
end
|
474
|
-
end
|
475
|
-
|
476
|
-
it "should use default options if specified (engine, charset, collate) for table creation" do
|
477
|
-
@db.create_table(:items){Integer :size; text :name}
|
478
|
-
check_sqls do
|
479
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
it "should not use default if option has a nil value" do
|
484
|
-
@db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
|
485
|
-
check_sqls do
|
486
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
|
487
|
-
end
|
488
|
-
end
|
489
|
-
end
|
490
|
-
|
491
331
|
describe "A MySQL database with table options" do
|
492
332
|
before do
|
493
333
|
@options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
|
@@ -497,8 +337,6 @@ describe "A MySQL database with table options" do
|
|
497
337
|
@db.default_charset = 'utf8'
|
498
338
|
@db.default_collate = 'utf8_general_ci'
|
499
339
|
@db.drop_table?(:items)
|
500
|
-
|
501
|
-
DB.sqls.clear
|
502
340
|
end
|
503
341
|
after do
|
504
342
|
@db.drop_table?(:items)
|
@@ -510,23 +348,23 @@ describe "A MySQL database with table options" do
|
|
510
348
|
|
511
349
|
it "should allow to pass custom options (engine, charset, collate) for table creation" do
|
512
350
|
@db.create_table(:items, @options){Integer :size; text :name}
|
513
|
-
|
514
|
-
@db
|
351
|
+
@db.transaction(:rollback=>:always) do
|
352
|
+
@db[:items].insert(:size=>1)
|
515
353
|
end
|
354
|
+
@db[:items].all.must_equal [{:size=>1, :name=>nil}]
|
516
355
|
end
|
517
356
|
|
518
357
|
it "should use default options if specified (engine, charset, collate) for table creation" do
|
519
358
|
@db.create_table(:items){Integer :size; text :name}
|
520
|
-
|
521
|
-
@db
|
359
|
+
@db.transaction(:rollback=>:always) do
|
360
|
+
@db[:items].insert(:size=>1)
|
522
361
|
end
|
362
|
+
@db[:items].all.must_equal []
|
523
363
|
end
|
524
364
|
|
525
365
|
it "should not use default if option has a nil value" do
|
366
|
+
@db.default_engine = 'non_existent_engine'
|
526
367
|
@db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
|
527
|
-
check_sqls do
|
528
|
-
@db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
|
529
|
-
end
|
530
368
|
end
|
531
369
|
end
|
532
370
|
|
@@ -534,7 +372,6 @@ describe "A MySQL database" do
|
|
534
372
|
before do
|
535
373
|
@db = DB
|
536
374
|
@db.drop_table?(:items)
|
537
|
-
DB.sqls.clear
|
538
375
|
end
|
539
376
|
after do
|
540
377
|
@db.drop_table?(:items, :users)
|
@@ -542,45 +379,45 @@ describe "A MySQL database" do
|
|
542
379
|
|
543
380
|
it "should support defaults for boolean columns" do
|
544
381
|
@db.create_table(:items){TrueClass :active1, :default=>true; FalseClass :active2, :default => false}
|
545
|
-
|
546
|
-
|
547
|
-
|
382
|
+
@db[:items].insert
|
383
|
+
@db[:items].get([:active1, :active2]).must_equal [true, false]
|
384
|
+
@db[:items].get([Sequel.cast(:active1, Integer).as(:v1), Sequel.cast(:active2, Integer).as(:v2)]).must_equal [1, 0]
|
548
385
|
end
|
549
386
|
|
550
|
-
it "should correctly
|
387
|
+
it "should correctly handle CREATE TABLE statements with foreign keys" do
|
551
388
|
@db.create_table(:items){primary_key :id; foreign_key :p_id, :items, :key => :id, :null => false, :on_delete => :cascade}
|
552
|
-
|
553
|
-
|
554
|
-
|
389
|
+
@db[:items].insert(:id=>1, :p_id=>1)
|
390
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
391
|
+
@db[:items].where(:id=>1).delete
|
392
|
+
@db[:items].count.must_equal 0
|
555
393
|
end
|
556
394
|
|
557
|
-
it "should correctly
|
395
|
+
it "should correctly handle CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
|
558
396
|
@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}
|
559
|
-
|
560
|
-
|
561
|
-
|
397
|
+
@db[:items].insert(:id=>1, :other_than_id=>2, :p_id=>2)
|
398
|
+
@db[:items].insert(:id=>2, :other_than_id=>3, :p_id=>2)
|
399
|
+
@db[:items].where(:id=>1).delete
|
400
|
+
@db[:items].count.must_equal 0
|
562
401
|
end
|
563
402
|
|
564
|
-
it "should correctly
|
403
|
+
it "should correctly handle ALTER TABLE statements with foreign keys" do
|
565
404
|
@db.create_table(:items){Integer :id}
|
566
405
|
@db.create_table(:users){primary_key :id}
|
567
406
|
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade}
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
end
|
407
|
+
@db[:users].insert(:id=>1)
|
408
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
409
|
+
@db[:users].where(:id=>1).delete
|
410
|
+
@db[:items].count.must_equal 0
|
573
411
|
end
|
574
412
|
|
575
413
|
it "should correctly format ALTER TABLE statements with named foreign keys" do
|
576
414
|
@db.create_table(:items){Integer :id}
|
577
415
|
@db.create_table(:users){primary_key :id}
|
578
416
|
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade, :foreign_key_constraint_name => :pk_items__users }
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
end
|
417
|
+
@db[:users].insert(:id=>1)
|
418
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
419
|
+
@db[:users].where(:id=>1).delete
|
420
|
+
@db[:items].count.must_equal 0
|
584
421
|
end
|
585
422
|
|
586
423
|
it "should correctly handle add_column :after option" do
|
@@ -604,9 +441,6 @@ describe "A MySQL database" do
|
|
604
441
|
it "should have rename_column support keep existing options" do
|
605
442
|
@db.create_table(:items){String :id, :null=>false, :default=>'blah'}
|
606
443
|
@db.alter_table(:items){rename_column :id, :nid}
|
607
|
-
check_sqls do
|
608
|
-
@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'"]
|
609
|
-
end
|
610
444
|
@db[:items].insert
|
611
445
|
@db[:items].all.must_equal [{:nid=>'blah'}]
|
612
446
|
proc{@db[:items].insert(:nid=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
@@ -615,9 +449,6 @@ describe "A MySQL database" do
|
|
615
449
|
it "should have set_column_type support keep existing options" do
|
616
450
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
617
451
|
@db.alter_table(:items){set_column_type :id, :Bignum}
|
618
|
-
check_sqls do
|
619
|
-
@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"]
|
620
|
-
end
|
621
452
|
@db[:items].insert
|
622
453
|
@db[:items].all.must_equal [{:id=>5}]
|
623
454
|
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
@@ -629,17 +460,12 @@ describe "A MySQL database" do
|
|
629
460
|
it "should have set_column_type pass through options" do
|
630
461
|
@db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
|
631
462
|
@db.alter_table(:items){set_column_type :id, :int, :unsigned=>true, :size=>8; set_column_type :list, :enum, :elements=>%w[two]}
|
632
|
-
|
633
|
-
@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"]
|
634
|
-
end
|
463
|
+
@db.schema(:items)[1][1][:db_type].must_equal "enum('two')"
|
635
464
|
end
|
636
465
|
|
637
466
|
it "should have set_column_default support keep existing options" do
|
638
467
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
639
468
|
@db.alter_table(:items){set_column_default :id, 6}
|
640
|
-
check_sqls do
|
641
|
-
@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"]
|
642
|
-
end
|
643
469
|
@db[:items].insert
|
644
470
|
@db[:items].all.must_equal [{:id=>6}]
|
645
471
|
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
@@ -648,9 +474,6 @@ describe "A MySQL database" do
|
|
648
474
|
it "should have set_column_allow_null support keep existing options" do
|
649
475
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
650
476
|
@db.alter_table(:items){set_column_allow_null :id, true}
|
651
|
-
check_sqls do
|
652
|
-
@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"]
|
653
|
-
end
|
654
477
|
@db[:items].insert
|
655
478
|
@db[:items].all.must_equal [{:id=>5}]
|
656
479
|
@db[:items].insert(:id=>nil)
|
@@ -670,21 +493,20 @@ describe "A MySQL database" do
|
|
670
493
|
end
|
671
494
|
|
672
495
|
# Socket tests should only be run if the MySQL server is on localhost
|
673
|
-
if %w'localhost 127.0.0.1 ::1'.include?(
|
496
|
+
if DB.adapter_scheme == :mysql && %w'localhost 127.0.0.1 ::1'.include?(URI.parse(DB.uri).host)
|
674
497
|
describe "A MySQL database" do
|
498
|
+
socket_file = defined?(MYSQL_SOCKET_FILE) ? MYSQL_SOCKET_FILE : '/tmp/mysql.sock'
|
499
|
+
|
675
500
|
it "should accept a socket option" do
|
676
|
-
|
677
|
-
db.test_connection
|
501
|
+
Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
|
678
502
|
end
|
679
503
|
|
680
504
|
it "should accept a socket option without host option" do
|
681
|
-
|
682
|
-
db.test_connection
|
505
|
+
Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
|
683
506
|
end
|
684
507
|
|
685
508
|
it "should fail to connect with invalid socket" do
|
686
|
-
|
687
|
-
proc{db.test_connection}.must_raise Sequel::DatabaseConnectionError
|
509
|
+
proc{Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah', :keep_reference=>false)}.must_raise Sequel::DatabaseConnectionError
|
688
510
|
end
|
689
511
|
end
|
690
512
|
end
|
@@ -783,7 +605,6 @@ describe "A MySQL database" do
|
|
783
605
|
before do
|
784
606
|
@db = DB
|
785
607
|
@db.drop_table?(:posts)
|
786
|
-
@db.sqls.clear
|
787
608
|
end
|
788
609
|
after do
|
789
610
|
@db.drop_table?(:posts)
|
@@ -791,28 +612,14 @@ describe "A MySQL database" do
|
|
791
612
|
|
792
613
|
it "should support fulltext indexes and full_text_search" do
|
793
614
|
@db.create_table(:posts, :engine=>:MyISAM){text :title; text :body; full_text_index :title; full_text_index [:title, :body]}
|
794
|
-
check_sqls do
|
795
|
-
@db.sqls.must_equal [
|
796
|
-
"CREATE TABLE `posts` (`title` text, `body` text) ENGINE=MyISAM",
|
797
|
-
"CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)",
|
798
|
-
"CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)"
|
799
|
-
]
|
800
|
-
end
|
801
615
|
|
802
616
|
@db[:posts].insert(:title=>'ruby rails', :body=>'y')
|
803
617
|
@db[:posts].insert(:title=>'sequel', :body=>'ruby')
|
804
618
|
@db[:posts].insert(:title=>'ruby scooby', :body=>'x')
|
805
|
-
@db.sqls.clear
|
806
619
|
|
807
620
|
@db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
|
808
621
|
@db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
|
809
622
|
@db[:posts].full_text_search(:title, '+ruby -rails', :boolean => true).all.must_equal [{:title=>'ruby scooby', :body=>'x'}]
|
810
|
-
check_sqls do
|
811
|
-
@db.sqls.must_equal [
|
812
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('rails'))",
|
813
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`, `body`) AGAINST ('sequel ruby'))",
|
814
|
-
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('+ruby -rails' IN BOOLEAN MODE))"]
|
815
|
-
end
|
816
623
|
|
817
624
|
@db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
818
625
|
@db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
@@ -820,32 +627,18 @@ describe "A MySQL database" do
|
|
820
627
|
|
821
628
|
it "should support spatial indexes" do
|
822
629
|
@db.create_table(:posts, :engine=>:MyISAM){point :geom, :null=>false; spatial_index [:geom]}
|
823
|
-
check_sqls do
|
824
|
-
@db.sqls.must_equal [
|
825
|
-
"CREATE TABLE `posts` (`geom` point NOT NULL) ENGINE=MyISAM",
|
826
|
-
"CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)"
|
827
|
-
]
|
828
|
-
end
|
829
630
|
end
|
830
631
|
|
831
632
|
it "should support indexes with index type" do
|
832
633
|
@db.create_table(:posts){Integer :id; index :id, :type => :btree}
|
833
|
-
|
834
|
-
|
835
|
-
"CREATE TABLE `posts` (`id` integer)",
|
836
|
-
"CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
837
|
-
]
|
838
|
-
end
|
634
|
+
@db[:posts].insert(1)
|
635
|
+
@db[:posts].where(:id=>1).count.must_equal 1
|
839
636
|
end
|
840
637
|
|
841
638
|
it "should support unique indexes with index type" do
|
842
639
|
@db.create_table(:posts){Integer :id; index :id, :type => :btree, :unique => true}
|
843
|
-
|
844
|
-
|
845
|
-
"CREATE TABLE `posts` (`id` integer)",
|
846
|
-
"CREATE UNIQUE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
847
|
-
]
|
848
|
-
end
|
640
|
+
@db[:posts].insert(1)
|
641
|
+
proc{@db[:posts].insert(1)}.must_raise Sequel::UniqueConstraintViolation
|
849
642
|
end
|
850
643
|
|
851
644
|
it "should not dump partial indexes" do
|
@@ -863,9 +656,8 @@ end
|
|
863
656
|
|
864
657
|
describe "MySQL::Dataset#insert and related methods" do
|
865
658
|
before do
|
866
|
-
DB.create_table(:items){String :name; Integer :value}
|
867
|
-
@d = DB[:items]
|
868
|
-
DB.sqls.clear
|
659
|
+
DB.create_table(:items){String :name, :unique=>true; Integer :value}
|
660
|
+
@d = DB[:items].order(:name)
|
869
661
|
end
|
870
662
|
after do
|
871
663
|
DB.drop_table?(:items)
|
@@ -873,245 +665,93 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
873
665
|
|
874
666
|
it "#insert should insert record with default values when no arguments given" do
|
875
667
|
@d.insert
|
876
|
-
check_sqls do
|
877
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
878
|
-
end
|
879
668
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
880
669
|
end
|
881
670
|
|
882
671
|
it "#insert should insert record with default values when empty hash given" do
|
883
672
|
@d.insert({})
|
884
|
-
check_sqls do
|
885
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
886
|
-
end
|
887
673
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
888
674
|
end
|
889
675
|
|
890
676
|
it "#insert should insert record with default values when empty array given" do
|
891
677
|
@d.insert []
|
892
|
-
check_sqls do
|
893
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
894
|
-
end
|
895
678
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
896
679
|
end
|
897
680
|
|
898
681
|
it "#on_duplicate_key_update should work with regular inserts" do
|
899
682
|
DB.add_index :items, :name, :unique=>true
|
900
|
-
DB.sqls.clear
|
901
683
|
@d.insert(:name => 'abc', :value => 1)
|
902
684
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
903
685
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
|
904
|
-
|
905
|
-
check_sqls do
|
906
|
-
DB.sqls.length.must_equal 3
|
907
|
-
DB.sqls[0].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/)
|
908
|
-
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/)
|
909
|
-
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/)
|
910
|
-
end
|
911
|
-
|
912
686
|
@d.all.must_equal [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
913
687
|
end
|
914
688
|
|
915
|
-
it "#multi_replace should
|
689
|
+
it "#multi_replace should replace multiple records in a single statement" do
|
916
690
|
@d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
SQL_BEGIN,
|
921
|
-
"REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
922
|
-
SQL_COMMIT
|
923
|
-
]
|
924
|
-
end
|
925
|
-
|
926
|
-
@d.all.must_equal [
|
927
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
928
|
-
]
|
691
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
692
|
+
@d.multi_replace([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
|
693
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
|
929
694
|
end
|
930
695
|
|
931
|
-
it "#multi_replace should
|
932
|
-
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
933
|
-
|
934
|
-
|
935
|
-
check_sqls do
|
936
|
-
DB.sqls.must_equal [
|
937
|
-
SQL_BEGIN,
|
938
|
-
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
939
|
-
SQL_COMMIT,
|
940
|
-
SQL_BEGIN,
|
941
|
-
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
942
|
-
SQL_COMMIT
|
943
|
-
]
|
944
|
-
end
|
945
|
-
|
946
|
-
@d.all.must_equal [
|
947
|
-
{:name => nil, :value => 1},
|
948
|
-
{:name => nil, :value => 2},
|
949
|
-
{:name => nil, :value => 3},
|
950
|
-
{:name => nil, :value => 4}
|
951
|
-
]
|
952
|
-
end
|
953
|
-
|
954
|
-
it "#multi_replace should split the list of records into batches if :slice option is given" do
|
955
|
-
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
956
|
-
:slice => 2)
|
957
|
-
|
958
|
-
check_sqls do
|
959
|
-
DB.sqls.must_equal [
|
960
|
-
SQL_BEGIN,
|
961
|
-
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
962
|
-
SQL_COMMIT,
|
963
|
-
SQL_BEGIN,
|
964
|
-
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
965
|
-
SQL_COMMIT
|
966
|
-
]
|
967
|
-
end
|
696
|
+
it "#multi_replace should support :commit_every option" do
|
697
|
+
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
|
698
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
699
|
+
end
|
968
700
|
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
{:name => nil, :value => 3},
|
973
|
-
{:name => nil, :value => 4}
|
974
|
-
]
|
701
|
+
it "#multi_replace should support :slice option" do
|
702
|
+
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
|
703
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
975
704
|
end
|
976
705
|
|
977
706
|
it "#multi_insert should insert multiple records in a single statement" do
|
978
707
|
@d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
979
|
-
|
980
|
-
check_sqls do
|
981
|
-
DB.sqls.must_equal [
|
982
|
-
SQL_BEGIN,
|
983
|
-
"INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
|
984
|
-
SQL_COMMIT
|
985
|
-
]
|
986
|
-
end
|
987
|
-
|
988
|
-
@d.all.must_equal [
|
989
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
990
|
-
]
|
708
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
991
709
|
end
|
992
710
|
|
993
|
-
it "#multi_insert should
|
994
|
-
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
995
|
-
|
996
|
-
|
997
|
-
check_sqls do
|
998
|
-
DB.sqls.must_equal [
|
999
|
-
SQL_BEGIN,
|
1000
|
-
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
1001
|
-
SQL_COMMIT,
|
1002
|
-
SQL_BEGIN,
|
1003
|
-
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
1004
|
-
SQL_COMMIT
|
1005
|
-
]
|
1006
|
-
end
|
1007
|
-
|
1008
|
-
@d.all.must_equal [
|
1009
|
-
{:name => nil, :value => 1},
|
1010
|
-
{:name => nil, :value => 2},
|
1011
|
-
{:name => nil, :value => 3},
|
1012
|
-
{:name => nil, :value => 4}
|
1013
|
-
]
|
1014
|
-
end
|
1015
|
-
|
1016
|
-
it "#multi_insert should split the list of records into batches if :slice option is given" do
|
1017
|
-
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
1018
|
-
:slice => 2)
|
1019
|
-
|
1020
|
-
check_sqls do
|
1021
|
-
DB.sqls.must_equal [
|
1022
|
-
SQL_BEGIN,
|
1023
|
-
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
1024
|
-
SQL_COMMIT,
|
1025
|
-
SQL_BEGIN,
|
1026
|
-
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
1027
|
-
SQL_COMMIT
|
1028
|
-
]
|
1029
|
-
end
|
711
|
+
it "#multi_insert should support :commit_every option" do
|
712
|
+
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
|
713
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
714
|
+
end
|
1030
715
|
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
{:name => nil, :value => 3},
|
1035
|
-
{:name => nil, :value => 4}
|
1036
|
-
]
|
716
|
+
it "#multi_insert should support :slice option" do
|
717
|
+
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
|
718
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
1037
719
|
end
|
1038
720
|
|
1039
721
|
it "#import should support inserting using columns and values arrays" do
|
1040
722
|
@d.import([:name, :value], [['abc', 1], ['def', 2]])
|
1041
|
-
|
1042
|
-
check_sqls do
|
1043
|
-
DB.sqls.must_equal [
|
1044
|
-
SQL_BEGIN,
|
1045
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
|
1046
|
-
SQL_COMMIT
|
1047
|
-
]
|
1048
|
-
end
|
1049
|
-
|
1050
|
-
@d.all.must_equal [
|
1051
|
-
{:name => 'abc', :value => 1},
|
1052
|
-
{:name => 'def', :value => 2}
|
1053
|
-
]
|
723
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
1054
724
|
end
|
1055
725
|
|
1056
|
-
it "#insert_ignore should
|
726
|
+
it "#insert_ignore should ignore existing records when used with multi_insert" do
|
1057
727
|
@d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
SQL_BEGIN,
|
1062
|
-
"INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
1063
|
-
SQL_COMMIT
|
1064
|
-
]
|
1065
|
-
end
|
1066
|
-
|
1067
|
-
@d.all.must_equal [
|
1068
|
-
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
1069
|
-
]
|
728
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
729
|
+
@d.insert_ignore.multi_insert([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
|
730
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
|
1070
731
|
end
|
1071
732
|
|
1072
|
-
it "#insert_ignore should
|
733
|
+
it "#insert_ignore should ignore single records when used with insert" do
|
1073
734
|
@d.insert_ignore.insert(:name => 'ghi')
|
1074
|
-
|
1075
|
-
|
1076
|
-
end
|
735
|
+
@d.all.must_equal [{:name => 'ghi', :value => nil}]
|
736
|
+
@d.insert_ignore.insert(:name => 'ghi', :value=>2)
|
1077
737
|
@d.all.must_equal [{:name => 'ghi', :value => nil}]
|
1078
738
|
end
|
1079
739
|
|
1080
|
-
it "#on_duplicate_key_update should
|
740
|
+
it "#on_duplicate_key_update should handle inserts with duplicate keys" do
|
1081
741
|
@d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
"SELECT * FROM `items` LIMIT 1",
|
1086
|
-
SQL_BEGIN,
|
1087
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
|
1088
|
-
SQL_COMMIT
|
1089
|
-
]
|
1090
|
-
end
|
1091
|
-
|
1092
|
-
@d.all.must_equal [
|
1093
|
-
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
1094
|
-
]
|
742
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
743
|
+
@d.on_duplicate_key_update.import([:name,:value], [['abc', 2], ['ghi',3]])
|
744
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
1095
745
|
end
|
1096
746
|
|
1097
747
|
it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and columns specified when args are given" do
|
1098
|
-
@d.on_duplicate_key_update(:value).import([:name,:value],
|
1099
|
-
|
1100
|
-
)
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
SQL_BEGIN,
|
1105
|
-
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
|
1106
|
-
SQL_COMMIT
|
1107
|
-
]
|
1108
|
-
end
|
1109
|
-
|
1110
|
-
@d.all.must_equal [
|
1111
|
-
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
1112
|
-
]
|
748
|
+
@d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 1], ['def',2]])
|
749
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
750
|
+
@d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 2], ['ghi',3]])
|
751
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
752
|
+
@d.on_duplicate_key_update(:name).import([:name,:value], [['abc', 5], ['ghi',6]])
|
753
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
1113
754
|
end
|
1114
|
-
|
1115
755
|
end
|
1116
756
|
|
1117
757
|
describe "MySQL::Dataset#update and related methods" do
|
@@ -1127,11 +767,7 @@ describe "MySQL::Dataset#update and related methods" do
|
|
1127
767
|
@d.insert(:name => 'cow', :value => 0)
|
1128
768
|
@d.insert(:name => 'cat', :value => 1)
|
1129
769
|
proc{@d.where(:value => 1).update(:name => 'cow')}.must_raise(Sequel::UniqueConstraintViolation)
|
1130
|
-
DB.sqls.clear
|
1131
770
|
@d.update_ignore.where(:value => 1).update(:name => 'cow')
|
1132
|
-
check_sqls do
|
1133
|
-
DB.sqls.must_equal ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
|
1134
|
-
end
|
1135
771
|
@d.order(:name).all.must_equal [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
1136
772
|
end
|
1137
773
|
end
|
@@ -1140,7 +776,6 @@ describe "MySQL::Dataset#replace" do
|
|
1140
776
|
before do
|
1141
777
|
DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
|
1142
778
|
@d = DB[:items]
|
1143
|
-
DB.sqls.clear
|
1144
779
|
end
|
1145
780
|
after do
|
1146
781
|
DB.drop_table?(:items)
|
@@ -1182,26 +817,13 @@ describe "MySQL::Dataset#calc_found_rows" do
|
|
1182
817
|
DB.drop_table?(:items)
|
1183
818
|
end
|
1184
819
|
|
1185
|
-
it "should add the SQL_CALC_FOUND_ROWS keyword when selecting" do
|
1186
|
-
DB[:items].select(:a).calc_found_rows.limit(1).sql.must_equal \
|
1187
|
-
'SELECT SQL_CALC_FOUND_ROWS `a` FROM `items` LIMIT 1'
|
1188
|
-
end
|
1189
|
-
|
1190
820
|
it "should count matching rows disregarding LIMIT clause" do
|
1191
821
|
DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
1192
|
-
DB.sqls.clear
|
1193
822
|
|
1194
823
|
DB.synchronize do
|
1195
824
|
DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.must_equal [{:a => 1}]
|
1196
825
|
DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.must_equal [{:rows => 2 }]
|
1197
826
|
end
|
1198
|
-
|
1199
|
-
check_sqls do
|
1200
|
-
DB.sqls.must_equal [
|
1201
|
-
'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
|
1202
|
-
'SELECT FOUND_ROWS() AS `rows`',
|
1203
|
-
]
|
1204
|
-
end
|
1205
827
|
end
|
1206
828
|
end
|
1207
829
|
|
@@ -1210,7 +832,6 @@ if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_schem
|
|
1210
832
|
before do
|
1211
833
|
DB.create_table(:items){Integer :id; Integer :value}
|
1212
834
|
@d = DB[:items]
|
1213
|
-
DB.sqls.clear
|
1214
835
|
end
|
1215
836
|
after do
|
1216
837
|
DB.drop_table?(:items)
|