sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- 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/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -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/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- 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 +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- 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 +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- 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/jdbc.rb +18 -74
- 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/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/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- 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 +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -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 +4 -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/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/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- 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 +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -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 +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- 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 +27 -43
- 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_extended_date_support.rb +230 -0
- 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 +3 -16
- 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/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- 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/model.rb +27 -62
- 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 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- 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 +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- 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 +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -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 +88 -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 +30 -92
- 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 +53 -1118
- 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 +8 -30
- 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 +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -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 +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- 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_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- 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 +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- 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 +43 -32
- 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 +5 -17
- 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/synchronize_sql_spec.rb +124 -0
- 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 +5 -7
- 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 +12 -16
- 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 -13
- 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 +8 -13
- 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 +12 -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 +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -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 +43 -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 +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- 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/do.rb +0 -166
- 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/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/swift.rb +0 -169
- 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,36 +137,21 @@ 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
|
|
176
|
-
|
|
177
|
-
@d.
|
|
178
|
-
@d.
|
|
179
|
-
|
|
180
|
-
@d.
|
|
181
|
-
@d.
|
|
182
|
-
|
|
183
|
-
@d.
|
|
184
|
-
@d.
|
|
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'
|
|
145
|
+
it "should handle large unsigned smallint/integer values" do
|
|
146
|
+
DB.alter_table(:items){set_column_type :value, 'smallint unsigned'}
|
|
147
|
+
@d.insert(:value=>(1 << 15) + 1)
|
|
148
|
+
@d.get(:value).must_equal((1 << 15) + 1)
|
|
149
|
+
DB.alter_table(:items){set_column_type :value, 'integer unsigned'}
|
|
150
|
+
@d.update(:value=>(1 << 31) + 1)
|
|
151
|
+
@d.get(:value).must_equal((1 << 31) + 1)
|
|
152
|
+
DB.alter_table(:items){set_column_type :value, 'bigint unsigned'}
|
|
153
|
+
@d.update(:value=>(1 << 63) + 1)
|
|
154
|
+
@d.get(:value).must_equal((1 << 63) + 1)
|
|
199
155
|
end
|
|
200
156
|
|
|
201
157
|
it "should support ORDER clause in UPDATE statements" do
|
|
@@ -217,7 +173,7 @@ describe "A MySQL dataset" do
|
|
|
217
173
|
it "should raise error for updating a dataset with an offset" do
|
|
218
174
|
proc{@d.offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
|
219
175
|
proc{@d.order(:value).offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
|
220
|
-
end
|
|
176
|
+
end
|
|
221
177
|
|
|
222
178
|
it "should support regexps" do
|
|
223
179
|
@d.insert(:name => 'abc', :value => 1)
|
|
@@ -250,22 +206,6 @@ describe "A MySQL dataset" do
|
|
|
250
206
|
end
|
|
251
207
|
end
|
|
252
208
|
|
|
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
209
|
describe "Dataset#distinct" do
|
|
270
210
|
before do
|
|
271
211
|
@db = DB
|
|
@@ -290,59 +230,27 @@ describe "Dataset#distinct" do
|
|
|
290
230
|
end
|
|
291
231
|
|
|
292
232
|
describe "MySQL join expressions" do
|
|
293
|
-
before do
|
|
233
|
+
before(:all) do
|
|
294
234
|
@ds = DB[:nodes]
|
|
235
|
+
DB.create_table!(:nodes){Integer :id; Integer :y}
|
|
236
|
+
DB.create_table!(:n1){Integer :id}
|
|
237
|
+
DB.create_table!(:n2){Integer :y}
|
|
238
|
+
@ds.insert(:id=>1, :y=>2)
|
|
239
|
+
DB[:n1].insert(1)
|
|
240
|
+
DB[:n2].insert(2)
|
|
295
241
|
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`)'
|
|
242
|
+
after(:all) do
|
|
243
|
+
DB.drop_table?(:n2, :n1, :nodes)
|
|
323
244
|
end
|
|
245
|
+
|
|
324
246
|
it "should support straight joins (force left table to be read before right)" do
|
|
325
|
-
@ds.join_table(:straight, :
|
|
247
|
+
@ds.join_table(:straight, :n1).all.must_equal [{:id=>1, :y=>2}]
|
|
326
248
|
end
|
|
327
249
|
it "should support natural joins on multiple tables." do
|
|
328
|
-
@ds.join_table(:natural_left_outer, [:
|
|
250
|
+
@ds.join_table(:natural_left_outer, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
|
|
329
251
|
end
|
|
330
252
|
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`"
|
|
253
|
+
@ds.join_table(:straight, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
|
|
346
254
|
end
|
|
347
255
|
end
|
|
348
256
|
|
|
@@ -377,14 +285,6 @@ describe "A MySQL database" do
|
|
|
377
285
|
@db.server_version.must_be :>=, 40000
|
|
378
286
|
end
|
|
379
287
|
|
|
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
288
|
it "should support for_share" do
|
|
389
289
|
@db[:test2].delete
|
|
390
290
|
@db.transaction{@db[:test2].for_share.all.must_equal []}
|
|
@@ -440,54 +340,6 @@ describe "A MySQL database" do
|
|
|
440
340
|
end
|
|
441
341
|
end
|
|
442
342
|
|
|
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
343
|
describe "A MySQL database with table options" do
|
|
492
344
|
before do
|
|
493
345
|
@options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
|
|
@@ -497,8 +349,6 @@ describe "A MySQL database with table options" do
|
|
|
497
349
|
@db.default_charset = 'utf8'
|
|
498
350
|
@db.default_collate = 'utf8_general_ci'
|
|
499
351
|
@db.drop_table?(:items)
|
|
500
|
-
|
|
501
|
-
DB.sqls.clear
|
|
502
352
|
end
|
|
503
353
|
after do
|
|
504
354
|
@db.drop_table?(:items)
|
|
@@ -510,23 +360,23 @@ describe "A MySQL database with table options" do
|
|
|
510
360
|
|
|
511
361
|
it "should allow to pass custom options (engine, charset, collate) for table creation" do
|
|
512
362
|
@db.create_table(:items, @options){Integer :size; text :name}
|
|
513
|
-
|
|
514
|
-
@db
|
|
363
|
+
@db.transaction(:rollback=>:always) do
|
|
364
|
+
@db[:items].insert(:size=>1)
|
|
515
365
|
end
|
|
366
|
+
@db[:items].all.must_equal [{:size=>1, :name=>nil}]
|
|
516
367
|
end
|
|
517
368
|
|
|
518
369
|
it "should use default options if specified (engine, charset, collate) for table creation" do
|
|
519
370
|
@db.create_table(:items){Integer :size; text :name}
|
|
520
|
-
|
|
521
|
-
@db
|
|
371
|
+
@db.transaction(:rollback=>:always) do
|
|
372
|
+
@db[:items].insert(:size=>1)
|
|
522
373
|
end
|
|
374
|
+
@db[:items].all.must_equal []
|
|
523
375
|
end
|
|
524
376
|
|
|
525
377
|
it "should not use default if option has a nil value" do
|
|
378
|
+
@db.default_engine = 'non_existent_engine'
|
|
526
379
|
@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
380
|
end
|
|
531
381
|
end
|
|
532
382
|
|
|
@@ -534,7 +384,6 @@ describe "A MySQL database" do
|
|
|
534
384
|
before do
|
|
535
385
|
@db = DB
|
|
536
386
|
@db.drop_table?(:items)
|
|
537
|
-
DB.sqls.clear
|
|
538
387
|
end
|
|
539
388
|
after do
|
|
540
389
|
@db.drop_table?(:items, :users)
|
|
@@ -542,45 +391,45 @@ describe "A MySQL database" do
|
|
|
542
391
|
|
|
543
392
|
it "should support defaults for boolean columns" do
|
|
544
393
|
@db.create_table(:items){TrueClass :active1, :default=>true; FalseClass :active2, :default => false}
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
394
|
+
@db[:items].insert
|
|
395
|
+
@db[:items].get([:active1, :active2]).must_equal [true, false]
|
|
396
|
+
@db[:items].get([Sequel.cast(:active1, Integer).as(:v1), Sequel.cast(:active2, Integer).as(:v2)]).must_equal [1, 0]
|
|
548
397
|
end
|
|
549
398
|
|
|
550
|
-
it "should correctly
|
|
399
|
+
it "should correctly handle CREATE TABLE statements with foreign keys" do
|
|
551
400
|
@db.create_table(:items){primary_key :id; foreign_key :p_id, :items, :key => :id, :null => false, :on_delete => :cascade}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
401
|
+
@db[:items].insert(:id=>1, :p_id=>1)
|
|
402
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
|
403
|
+
@db[:items].where(:id=>1).delete
|
|
404
|
+
@db[:items].count.must_equal 0
|
|
555
405
|
end
|
|
556
406
|
|
|
557
|
-
it "should correctly
|
|
407
|
+
it "should correctly handle CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
|
|
558
408
|
@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
|
-
|
|
409
|
+
@db[:items].insert(:id=>1, :other_than_id=>2, :p_id=>2)
|
|
410
|
+
@db[:items].insert(:id=>2, :other_than_id=>3, :p_id=>2)
|
|
411
|
+
@db[:items].where(:id=>1).delete
|
|
412
|
+
@db[:items].count.must_equal 0
|
|
562
413
|
end
|
|
563
414
|
|
|
564
|
-
it "should correctly
|
|
415
|
+
it "should correctly handle ALTER TABLE statements with foreign keys" do
|
|
565
416
|
@db.create_table(:items){Integer :id}
|
|
566
417
|
@db.create_table(:users){primary_key :id}
|
|
567
418
|
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade}
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
end
|
|
419
|
+
@db[:users].insert(:id=>1)
|
|
420
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
|
421
|
+
@db[:users].where(:id=>1).delete
|
|
422
|
+
@db[:items].count.must_equal 0
|
|
573
423
|
end
|
|
574
424
|
|
|
575
425
|
it "should correctly format ALTER TABLE statements with named foreign keys" do
|
|
576
426
|
@db.create_table(:items){Integer :id}
|
|
577
427
|
@db.create_table(:users){primary_key :id}
|
|
578
428
|
@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
|
|
429
|
+
@db[:users].insert(:id=>1)
|
|
430
|
+
@db[:items].insert(:id=>2, :p_id=>1)
|
|
431
|
+
@db[:users].where(:id=>1).delete
|
|
432
|
+
@db[:items].count.must_equal 0
|
|
584
433
|
end
|
|
585
434
|
|
|
586
435
|
it "should correctly handle add_column :after option" do
|
|
@@ -604,9 +453,6 @@ describe "A MySQL database" do
|
|
|
604
453
|
it "should have rename_column support keep existing options" do
|
|
605
454
|
@db.create_table(:items){String :id, :null=>false, :default=>'blah'}
|
|
606
455
|
@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
456
|
@db[:items].insert
|
|
611
457
|
@db[:items].all.must_equal [{:nid=>'blah'}]
|
|
612
458
|
proc{@db[:items].insert(:nid=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
|
@@ -615,9 +461,6 @@ describe "A MySQL database" do
|
|
|
615
461
|
it "should have set_column_type support keep existing options" do
|
|
616
462
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
|
617
463
|
@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
464
|
@db[:items].insert
|
|
622
465
|
@db[:items].all.must_equal [{:id=>5}]
|
|
623
466
|
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
|
@@ -629,17 +472,12 @@ describe "A MySQL database" do
|
|
|
629
472
|
it "should have set_column_type pass through options" do
|
|
630
473
|
@db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
|
|
631
474
|
@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
|
|
475
|
+
@db.schema(:items)[1][1][:db_type].must_equal "enum('two')"
|
|
635
476
|
end
|
|
636
477
|
|
|
637
478
|
it "should have set_column_default support keep existing options" do
|
|
638
479
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
|
639
480
|
@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
481
|
@db[:items].insert
|
|
644
482
|
@db[:items].all.must_equal [{:id=>6}]
|
|
645
483
|
proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
|
|
@@ -648,9 +486,6 @@ describe "A MySQL database" do
|
|
|
648
486
|
it "should have set_column_allow_null support keep existing options" do
|
|
649
487
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
|
650
488
|
@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
489
|
@db[:items].insert
|
|
655
490
|
@db[:items].all.must_equal [{:id=>5}]
|
|
656
491
|
@db[:items].insert(:id=>nil)
|
|
@@ -670,21 +505,20 @@ describe "A MySQL database" do
|
|
|
670
505
|
end
|
|
671
506
|
|
|
672
507
|
# Socket tests should only be run if the MySQL server is on localhost
|
|
673
|
-
if %w'localhost 127.0.0.1 ::1'.include?(
|
|
508
|
+
if DB.adapter_scheme == :mysql && %w'localhost 127.0.0.1 ::1'.include?(URI.parse(DB.uri).host)
|
|
674
509
|
describe "A MySQL database" do
|
|
510
|
+
socket_file = defined?(MYSQL_SOCKET_FILE) ? MYSQL_SOCKET_FILE : '/tmp/mysql.sock'
|
|
511
|
+
|
|
675
512
|
it "should accept a socket option" do
|
|
676
|
-
|
|
677
|
-
db.test_connection
|
|
513
|
+
Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
|
|
678
514
|
end
|
|
679
515
|
|
|
680
516
|
it "should accept a socket option without host option" do
|
|
681
|
-
|
|
682
|
-
db.test_connection
|
|
517
|
+
Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
|
|
683
518
|
end
|
|
684
519
|
|
|
685
520
|
it "should fail to connect with invalid socket" do
|
|
686
|
-
|
|
687
|
-
proc{db.test_connection}.must_raise Sequel::DatabaseConnectionError
|
|
521
|
+
proc{Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah', :keep_reference=>false)}.must_raise Sequel::DatabaseConnectionError
|
|
688
522
|
end
|
|
689
523
|
end
|
|
690
524
|
end
|
|
@@ -783,7 +617,6 @@ describe "A MySQL database" do
|
|
|
783
617
|
before do
|
|
784
618
|
@db = DB
|
|
785
619
|
@db.drop_table?(:posts)
|
|
786
|
-
@db.sqls.clear
|
|
787
620
|
end
|
|
788
621
|
after do
|
|
789
622
|
@db.drop_table?(:posts)
|
|
@@ -791,28 +624,14 @@ describe "A MySQL database" do
|
|
|
791
624
|
|
|
792
625
|
it "should support fulltext indexes and full_text_search" do
|
|
793
626
|
@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
627
|
|
|
802
628
|
@db[:posts].insert(:title=>'ruby rails', :body=>'y')
|
|
803
629
|
@db[:posts].insert(:title=>'sequel', :body=>'ruby')
|
|
804
630
|
@db[:posts].insert(:title=>'ruby scooby', :body=>'x')
|
|
805
|
-
@db.sqls.clear
|
|
806
631
|
|
|
807
632
|
@db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
|
|
808
633
|
@db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
|
|
809
634
|
@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
635
|
|
|
817
636
|
@db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
|
818
637
|
@db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
|
|
@@ -820,32 +639,18 @@ describe "A MySQL database" do
|
|
|
820
639
|
|
|
821
640
|
it "should support spatial indexes" do
|
|
822
641
|
@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
642
|
end
|
|
830
643
|
|
|
831
644
|
it "should support indexes with index type" do
|
|
832
645
|
@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
|
|
646
|
+
@db[:posts].insert(1)
|
|
647
|
+
@db[:posts].where(:id=>1).count.must_equal 1
|
|
839
648
|
end
|
|
840
649
|
|
|
841
650
|
it "should support unique indexes with index type" do
|
|
842
651
|
@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
|
|
652
|
+
@db[:posts].insert(1)
|
|
653
|
+
proc{@db[:posts].insert(1)}.must_raise Sequel::UniqueConstraintViolation
|
|
849
654
|
end
|
|
850
655
|
|
|
851
656
|
it "should not dump partial indexes" do
|
|
@@ -863,9 +668,8 @@ end
|
|
|
863
668
|
|
|
864
669
|
describe "MySQL::Dataset#insert and related methods" do
|
|
865
670
|
before do
|
|
866
|
-
DB.create_table(:items){String :name; Integer :value}
|
|
867
|
-
@d = DB[:items]
|
|
868
|
-
DB.sqls.clear
|
|
671
|
+
DB.create_table(:items){String :name, :unique=>true; Integer :value}
|
|
672
|
+
@d = DB[:items].order(:name)
|
|
869
673
|
end
|
|
870
674
|
after do
|
|
871
675
|
DB.drop_table?(:items)
|
|
@@ -873,245 +677,93 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
|
873
677
|
|
|
874
678
|
it "#insert should insert record with default values when no arguments given" do
|
|
875
679
|
@d.insert
|
|
876
|
-
check_sqls do
|
|
877
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
|
878
|
-
end
|
|
879
680
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
|
880
681
|
end
|
|
881
682
|
|
|
882
683
|
it "#insert should insert record with default values when empty hash given" do
|
|
883
684
|
@d.insert({})
|
|
884
|
-
check_sqls do
|
|
885
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
|
886
|
-
end
|
|
887
685
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
|
888
686
|
end
|
|
889
687
|
|
|
890
688
|
it "#insert should insert record with default values when empty array given" do
|
|
891
689
|
@d.insert []
|
|
892
|
-
check_sqls do
|
|
893
|
-
DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
|
|
894
|
-
end
|
|
895
690
|
@d.all.must_equal [{:name => nil, :value => nil}]
|
|
896
691
|
end
|
|
897
692
|
|
|
898
693
|
it "#on_duplicate_key_update should work with regular inserts" do
|
|
899
694
|
DB.add_index :items, :name, :unique=>true
|
|
900
|
-
DB.sqls.clear
|
|
901
695
|
@d.insert(:name => 'abc', :value => 1)
|
|
902
696
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
|
903
697
|
@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
698
|
@d.all.must_equal [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
|
913
699
|
end
|
|
914
700
|
|
|
915
|
-
it "#multi_replace should
|
|
701
|
+
it "#multi_replace should replace multiple records in a single statement" do
|
|
916
702
|
@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
|
-
]
|
|
703
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
|
704
|
+
@d.multi_replace([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
|
|
705
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
|
|
929
706
|
end
|
|
930
707
|
|
|
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
|
|
708
|
+
it "#multi_replace should support :commit_every option" do
|
|
709
|
+
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
|
|
710
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
|
711
|
+
end
|
|
968
712
|
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
{:name => nil, :value => 3},
|
|
973
|
-
{:name => nil, :value => 4}
|
|
974
|
-
]
|
|
713
|
+
it "#multi_replace should support :slice option" do
|
|
714
|
+
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
|
|
715
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
|
975
716
|
end
|
|
976
717
|
|
|
977
718
|
it "#multi_insert should insert multiple records in a single statement" do
|
|
978
719
|
@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
|
-
]
|
|
720
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
|
991
721
|
end
|
|
992
722
|
|
|
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
|
|
723
|
+
it "#multi_insert should support :commit_every option" do
|
|
724
|
+
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
|
|
725
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
|
726
|
+
end
|
|
1030
727
|
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
{:name => nil, :value => 3},
|
|
1035
|
-
{:name => nil, :value => 4}
|
|
1036
|
-
]
|
|
728
|
+
it "#multi_insert should support :slice option" do
|
|
729
|
+
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
|
|
730
|
+
@d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
|
|
1037
731
|
end
|
|
1038
732
|
|
|
1039
733
|
it "#import should support inserting using columns and values arrays" do
|
|
1040
734
|
@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
|
-
]
|
|
735
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
|
1054
736
|
end
|
|
1055
737
|
|
|
1056
|
-
it "#insert_ignore should
|
|
738
|
+
it "#insert_ignore should ignore existing records when used with multi_insert" do
|
|
1057
739
|
@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
|
-
]
|
|
740
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
|
|
741
|
+
@d.insert_ignore.multi_insert([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
|
|
742
|
+
@d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
|
|
1070
743
|
end
|
|
1071
744
|
|
|
1072
|
-
it "#insert_ignore should
|
|
745
|
+
it "#insert_ignore should ignore single records when used with insert" do
|
|
1073
746
|
@d.insert_ignore.insert(:name => 'ghi')
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
end
|
|
747
|
+
@d.all.must_equal [{:name => 'ghi', :value => nil}]
|
|
748
|
+
@d.insert_ignore.insert(:name => 'ghi', :value=>2)
|
|
1077
749
|
@d.all.must_equal [{:name => 'ghi', :value => nil}]
|
|
1078
750
|
end
|
|
1079
751
|
|
|
1080
|
-
it "#on_duplicate_key_update should
|
|
752
|
+
it "#on_duplicate_key_update should handle inserts with duplicate keys" do
|
|
1081
753
|
@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
|
-
]
|
|
754
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
|
755
|
+
@d.on_duplicate_key_update.import([:name,:value], [['abc', 2], ['ghi',3]])
|
|
756
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
|
1095
757
|
end
|
|
1096
758
|
|
|
1097
759
|
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
|
-
]
|
|
760
|
+
@d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 1], ['def',2]])
|
|
761
|
+
@d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
|
|
762
|
+
@d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 2], ['ghi',3]])
|
|
763
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
|
764
|
+
@d.on_duplicate_key_update(:name).import([:name,:value], [['abc', 5], ['ghi',6]])
|
|
765
|
+
@d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
|
|
1113
766
|
end
|
|
1114
|
-
|
|
1115
767
|
end
|
|
1116
768
|
|
|
1117
769
|
describe "MySQL::Dataset#update and related methods" do
|
|
@@ -1127,11 +779,7 @@ describe "MySQL::Dataset#update and related methods" do
|
|
|
1127
779
|
@d.insert(:name => 'cow', :value => 0)
|
|
1128
780
|
@d.insert(:name => 'cat', :value => 1)
|
|
1129
781
|
proc{@d.where(:value => 1).update(:name => 'cow')}.must_raise(Sequel::UniqueConstraintViolation)
|
|
1130
|
-
DB.sqls.clear
|
|
1131
782
|
@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
783
|
@d.order(:name).all.must_equal [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
|
1136
784
|
end
|
|
1137
785
|
end
|
|
@@ -1140,7 +788,6 @@ describe "MySQL::Dataset#replace" do
|
|
|
1140
788
|
before do
|
|
1141
789
|
DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
|
|
1142
790
|
@d = DB[:items]
|
|
1143
|
-
DB.sqls.clear
|
|
1144
791
|
end
|
|
1145
792
|
after do
|
|
1146
793
|
DB.drop_table?(:items)
|
|
@@ -1182,26 +829,13 @@ describe "MySQL::Dataset#calc_found_rows" do
|
|
|
1182
829
|
DB.drop_table?(:items)
|
|
1183
830
|
end
|
|
1184
831
|
|
|
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
832
|
it "should count matching rows disregarding LIMIT clause" do
|
|
1191
833
|
DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
|
1192
|
-
DB.sqls.clear
|
|
1193
834
|
|
|
1194
835
|
DB.synchronize do
|
|
1195
836
|
DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.must_equal [{:a => 1}]
|
|
1196
837
|
DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.must_equal [{:rows => 2 }]
|
|
1197
838
|
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
839
|
end
|
|
1206
840
|
end
|
|
1207
841
|
|
|
@@ -1210,7 +844,6 @@ if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_schem
|
|
|
1210
844
|
before do
|
|
1211
845
|
DB.create_table(:items){Integer :id; Integer :value}
|
|
1212
846
|
@d = DB[:items]
|
|
1213
|
-
DB.sqls.clear
|
|
1214
847
|
end
|
|
1215
848
|
after do
|
|
1216
849
|
DB.drop_table?(:items)
|