sequel 4.49.0 → 5.0.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 +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)
|