sequel 5.20.0 → 5.49.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 +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -519
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -63
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -1,763 +0,0 @@
|
|
|
1
|
-
require_relative "sequel_warning"
|
|
2
|
-
|
|
3
|
-
if ENV['COVERAGE']
|
|
4
|
-
require_relative "sequel_coverage"
|
|
5
|
-
SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/extensions/core_extensions\.rb\z})
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../lib/"))
|
|
9
|
-
require_relative '../lib/sequel'
|
|
10
|
-
|
|
11
|
-
Regexp.send(:include, Sequel::SQL::StringMethods)
|
|
12
|
-
String.send(:include, Sequel::SQL::StringMethods)
|
|
13
|
-
Sequel.extension :core_extensions
|
|
14
|
-
Sequel.extension :symbol_aref
|
|
15
|
-
Sequel.extension :virtual_row_method_block
|
|
16
|
-
|
|
17
|
-
ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
|
|
18
|
-
gem 'minitest'
|
|
19
|
-
require 'minitest/autorun'
|
|
20
|
-
require 'minitest/hooks/default'
|
|
21
|
-
|
|
22
|
-
require_relative "deprecation_helper.rb"
|
|
23
|
-
|
|
24
|
-
describe "Sequel core extensions" do
|
|
25
|
-
it "should have Sequel.core_extensions? be true if enabled" do
|
|
26
|
-
Sequel.core_extensions?.must_equal true
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
describe "Core extensions" do
|
|
31
|
-
before do
|
|
32
|
-
db = Sequel.mock
|
|
33
|
-
@d = db[:items].with_extend do
|
|
34
|
-
def supports_regexp?; true end
|
|
35
|
-
def l(*args, &block)
|
|
36
|
-
literal(filter_expr(*args, &block))
|
|
37
|
-
end
|
|
38
|
-
def lit(*args)
|
|
39
|
-
literal(*args)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should support NOT via Symbol#~" do
|
|
45
|
-
@d.l(~:x).must_equal 'NOT x'
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
with_symbol_splitting "should support NOT via Symbol#~ for splittable symbols" do
|
|
49
|
-
@d.l(~:x__y).must_equal 'NOT x.y'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should support + - * / power via Symbol#+,-,*,/,**" do
|
|
53
|
-
@d.l(:x + 1 > 100).must_equal '((x + 1) > 100)'
|
|
54
|
-
@d.l((:x * :y) < 100.01).must_equal '((x * y) < 100.01)'
|
|
55
|
-
@d.l((:x - :y/2) >= 100000000000000000000000000000000000).must_equal '((x - (y / 2)) >= 100000000000000000000000000000000000)'
|
|
56
|
-
@d.l((((:x - :y)/(:x + :y))*:z) <= 100).must_equal '((((x - y) / (x + y)) * z) <= 100)'
|
|
57
|
-
@d.l(~((((:x - :y)/(:x + :y))*:z) <= 100)).must_equal '((((x - y) / (x + y)) * z) > 100)'
|
|
58
|
-
@d.l(~((((:x ** :y)/(:x + :y))*:z) <= 100)).must_equal '(((power(x, y) / (x + y)) * z) > 100)'
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "should support coercion for symbols" do
|
|
62
|
-
@d.l(1 + :x > 2).must_equal '((1 + x) > 2)'
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "should support LIKE via Symbol#like" do
|
|
66
|
-
@d.l(:x.like('a')).must_equal '(x LIKE \'a\' ESCAPE \'\\\')'
|
|
67
|
-
@d.l(:x.like(/a/)).must_equal '(x ~ \'a\')'
|
|
68
|
-
@d.l(:x.like('a', 'b')).must_equal '((x LIKE \'a\' ESCAPE \'\\\') OR (x LIKE \'b\' ESCAPE \'\\\'))'
|
|
69
|
-
@d.l(:x.like(/a/, /b/i)).must_equal '((x ~ \'a\') OR (x ~* \'b\'))'
|
|
70
|
-
@d.l(:x.like('a', /b/)).must_equal '((x LIKE \'a\' ESCAPE \'\\\') OR (x ~ \'b\'))'
|
|
71
|
-
|
|
72
|
-
@d.l('a'.like(:x)).must_equal "('a' LIKE x ESCAPE '\\')"
|
|
73
|
-
@d.l('a'.like(:x, 'b')).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' LIKE 'b' ESCAPE '\\'))"
|
|
74
|
-
@d.l('a'.like(:x, /b/)).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' ~ 'b'))"
|
|
75
|
-
@d.l('a'.like(:x, /b/i)).must_equal "(('a' LIKE x ESCAPE '\\') OR ('a' ~* 'b'))"
|
|
76
|
-
|
|
77
|
-
@d.l(/a/.like(:x)).must_equal "('a' ~ x)"
|
|
78
|
-
@d.l(/a/.like(:x, 'b')).must_equal "(('a' ~ x) OR ('a' ~ 'b'))"
|
|
79
|
-
@d.l(/a/.like(:x, /b/)).must_equal "(('a' ~ x) OR ('a' ~ 'b'))"
|
|
80
|
-
@d.l(/a/.like(:x, /b/i)).must_equal "(('a' ~ x) OR ('a' ~* 'b'))"
|
|
81
|
-
|
|
82
|
-
@d.l(/a/i.like(:x)).must_equal "('a' ~* x)"
|
|
83
|
-
@d.l(/a/i.like(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
84
|
-
@d.l(/a/i.like(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
85
|
-
@d.l(/a/i.like(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "should support NOT LIKE via Symbol#like and Symbol#~" do
|
|
89
|
-
@d.l(~:x.like('a')).must_equal '(x NOT LIKE \'a\' ESCAPE \'\\\')'
|
|
90
|
-
@d.l(~:x.like(/a/)).must_equal '(x !~ \'a\')'
|
|
91
|
-
@d.l(~:x.like('a', 'b')).must_equal '((x NOT LIKE \'a\' ESCAPE \'\\\') AND (x NOT LIKE \'b\' ESCAPE \'\\\'))'
|
|
92
|
-
@d.l(~:x.like(/a/, /b/i)).must_equal '((x !~ \'a\') AND (x !~* \'b\'))'
|
|
93
|
-
@d.l(~:x.like('a', /b/)).must_equal '((x NOT LIKE \'a\' ESCAPE \'\\\') AND (x !~ \'b\'))'
|
|
94
|
-
|
|
95
|
-
@d.l(~'a'.like(:x)).must_equal "('a' NOT LIKE x ESCAPE '\\')"
|
|
96
|
-
@d.l(~'a'.like(:x, 'b')).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' NOT LIKE 'b' ESCAPE '\\'))"
|
|
97
|
-
@d.l(~'a'.like(:x, /b/)).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' !~ 'b'))"
|
|
98
|
-
@d.l(~'a'.like(:x, /b/i)).must_equal "(('a' NOT LIKE x ESCAPE '\\') AND ('a' !~* 'b'))"
|
|
99
|
-
|
|
100
|
-
@d.l(~/a/.like(:x)).must_equal "('a' !~ x)"
|
|
101
|
-
@d.l(~/a/.like(:x, 'b')).must_equal "(('a' !~ x) AND ('a' !~ 'b'))"
|
|
102
|
-
@d.l(~/a/.like(:x, /b/)).must_equal "(('a' !~ x) AND ('a' !~ 'b'))"
|
|
103
|
-
@d.l(~/a/.like(:x, /b/i)).must_equal "(('a' !~ x) AND ('a' !~* 'b'))"
|
|
104
|
-
|
|
105
|
-
@d.l(~/a/i.like(:x)).must_equal "('a' !~* x)"
|
|
106
|
-
@d.l(~/a/i.like(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
107
|
-
@d.l(~/a/i.like(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
108
|
-
@d.l(~/a/i.like(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "should support ILIKE via Symbol#ilike" do
|
|
112
|
-
@d.l(:x.ilike('a')).must_equal '(UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\')'
|
|
113
|
-
@d.l(:x.ilike(/a/)).must_equal '(x ~* \'a\')'
|
|
114
|
-
@d.l(:x.ilike('a', 'b')).must_equal '((UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\') OR (UPPER(x) LIKE UPPER(\'b\') ESCAPE \'\\\'))'
|
|
115
|
-
@d.l(:x.ilike(/a/, /b/i)).must_equal '((x ~* \'a\') OR (x ~* \'b\'))'
|
|
116
|
-
@d.l(:x.ilike('a', /b/)).must_equal '((UPPER(x) LIKE UPPER(\'a\') ESCAPE \'\\\') OR (x ~* \'b\'))'
|
|
117
|
-
|
|
118
|
-
@d.l('a'.ilike(:x)).must_equal "(UPPER('a') LIKE UPPER(x) ESCAPE '\\')"
|
|
119
|
-
@d.l('a'.ilike(:x, 'b')).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR (UPPER('a') LIKE UPPER('b') ESCAPE '\\'))"
|
|
120
|
-
@d.l('a'.ilike(:x, /b/)).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR ('a' ~* 'b'))"
|
|
121
|
-
@d.l('a'.ilike(:x, /b/i)).must_equal "((UPPER('a') LIKE UPPER(x) ESCAPE '\\') OR ('a' ~* 'b'))"
|
|
122
|
-
|
|
123
|
-
@d.l(/a/.ilike(:x)).must_equal "('a' ~* x)"
|
|
124
|
-
@d.l(/a/.ilike(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
125
|
-
@d.l(/a/.ilike(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
126
|
-
@d.l(/a/.ilike(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
127
|
-
|
|
128
|
-
@d.l(/a/i.ilike(:x)).must_equal "('a' ~* x)"
|
|
129
|
-
@d.l(/a/i.ilike(:x, 'b')).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
130
|
-
@d.l(/a/i.ilike(:x, /b/)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
131
|
-
@d.l(/a/i.ilike(:x, /b/i)).must_equal "(('a' ~* x) OR ('a' ~* 'b'))"
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
it "should support NOT ILIKE via Symbol#ilike and Symbol#~" do
|
|
135
|
-
@d.l(~:x.ilike('a')).must_equal '(UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\')'
|
|
136
|
-
@d.l(~:x.ilike(/a/)).must_equal '(x !~* \'a\')'
|
|
137
|
-
@d.l(~:x.ilike('a', 'b')).must_equal '((UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\') AND (UPPER(x) NOT LIKE UPPER(\'b\') ESCAPE \'\\\'))'
|
|
138
|
-
@d.l(~:x.ilike(/a/, /b/i)).must_equal '((x !~* \'a\') AND (x !~* \'b\'))'
|
|
139
|
-
@d.l(~:x.ilike('a', /b/)).must_equal '((UPPER(x) NOT LIKE UPPER(\'a\') ESCAPE \'\\\') AND (x !~* \'b\'))'
|
|
140
|
-
|
|
141
|
-
@d.l(~'a'.ilike(:x)).must_equal "(UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\')"
|
|
142
|
-
@d.l(~'a'.ilike(:x, 'b')).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND (UPPER('a') NOT LIKE UPPER('b') ESCAPE '\\'))"
|
|
143
|
-
@d.l(~'a'.ilike(:x, /b/)).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND ('a' !~* 'b'))"
|
|
144
|
-
@d.l(~'a'.ilike(:x, /b/i)).must_equal "((UPPER('a') NOT LIKE UPPER(x) ESCAPE '\\') AND ('a' !~* 'b'))"
|
|
145
|
-
|
|
146
|
-
@d.l(~/a/.ilike(:x)).must_equal "('a' !~* x)"
|
|
147
|
-
@d.l(~/a/.ilike(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
148
|
-
@d.l(~/a/.ilike(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
149
|
-
@d.l(~/a/.ilike(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
150
|
-
|
|
151
|
-
@d.l(~/a/i.ilike(:x)).must_equal "('a' !~* x)"
|
|
152
|
-
@d.l(~/a/i.ilike(:x, 'b')).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
153
|
-
@d.l(~/a/i.ilike(:x, /b/)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
154
|
-
@d.l(~/a/i.ilike(:x, /b/i)).must_equal "(('a' !~* x) AND ('a' !~* 'b'))"
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
it "should support sql_expr on arrays with all two pairs" do
|
|
158
|
-
@d.l([[:x, 100],[:y, 'a']].sql_expr).must_equal '((x = 100) AND (y = \'a\'))'
|
|
159
|
-
@d.l([[:x, true], [:y, false]].sql_expr).must_equal '((x IS TRUE) AND (y IS FALSE))'
|
|
160
|
-
@d.l([[:x, nil], [:y, [1,2,3]]].sql_expr).must_equal '((x IS NULL) AND (y IN (1, 2, 3)))'
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "should support sql_negate on arrays with all two pairs" do
|
|
164
|
-
@d.l([[:x, 100],[:y, 'a']].sql_negate).must_equal '((x != 100) AND (y != \'a\'))'
|
|
165
|
-
@d.l([[:x, true], [:y, false]].sql_negate).must_equal '((x IS NOT TRUE) AND (y IS NOT FALSE))'
|
|
166
|
-
@d.l([[:x, nil], [:y, [1,2,3]]].sql_negate).must_equal '((x IS NOT NULL) AND (y NOT IN (1, 2, 3)))'
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it "should support ~ on arrays with all two pairs" do
|
|
170
|
-
@d.l(~[[:x, 100],[:y, 'a']]).must_equal '((x != 100) OR (y != \'a\'))'
|
|
171
|
-
@d.l(~[[:x, true], [:y, false]]).must_equal '((x IS NOT TRUE) OR (y IS NOT FALSE))'
|
|
172
|
-
@d.l(~[[:x, nil], [:y, [1,2,3]]]).must_equal '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
it "should support sql_or on arrays with all two pairs" do
|
|
176
|
-
@d.l([[:x, 100],[:y, 'a']].sql_or).must_equal '((x = 100) OR (y = \'a\'))'
|
|
177
|
-
@d.l([[:x, true], [:y, false]].sql_or).must_equal '((x IS TRUE) OR (y IS FALSE))'
|
|
178
|
-
@d.l([[:x, nil], [:y, [1,2,3]]].sql_or).must_equal '((x IS NULL) OR (y IN (1, 2, 3)))'
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
it "should support Array#sql_string_join for concatenation of SQL strings" do
|
|
182
|
-
@d.lit([:x].sql_string_join).must_equal '(x)'
|
|
183
|
-
@d.lit([:x].sql_string_join(', ')).must_equal '(x)'
|
|
184
|
-
@d.lit([:x, :y].sql_string_join).must_equal '(x || y)'
|
|
185
|
-
@d.lit([:x, :y].sql_string_join(', ')).must_equal "(x || ', ' || y)"
|
|
186
|
-
@d.lit([:x.sql_function(1), :y.sql_subscript(1)].sql_string_join).must_equal '(x(1) || y[1])'
|
|
187
|
-
@d.lit([:x.sql_function(1), 'y.z'.lit].sql_string_join(', ')).must_equal "(x(1) || ', ' || y.z)"
|
|
188
|
-
@d.lit([:x, 1, :y].sql_string_join).must_equal "(x || '1' || y)"
|
|
189
|
-
@d.lit([:x, 1, :y].sql_string_join(', ')).must_equal "(x || ', ' || '1' || ', ' || y)"
|
|
190
|
-
@d.lit([:x, 1, :y].sql_string_join(Sequel[:y][:z])).must_equal "(x || y.z || '1' || y.z || y)"
|
|
191
|
-
@d.lit([:x, 1, :y].sql_string_join(1)).must_equal "(x || '1' || '1' || '1' || y)"
|
|
192
|
-
@d.lit([:x, :y].sql_string_join('y.x || x.y'.lit)).must_equal "(x || y.x || x.y || y)"
|
|
193
|
-
@d.lit([[:x, :y].sql_string_join, [:a, :b].sql_string_join].sql_string_join).must_equal "(x || y || a || b)"
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
it "should support sql_expr on hashes" do
|
|
197
|
-
@d.l({:x => 100, :y => 'a'}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x = 100)', '(y = \'a\')']
|
|
198
|
-
@d.l({:x => true, :y => false}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
|
|
199
|
-
@d.l({:x => nil, :y => [1,2,3]}.sql_expr)[1...-1].split(' AND ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
it "should support sql_negate on hashes" do
|
|
203
|
-
@d.l({:x => 100, :y => 'a'}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x != 100)', '(y != \'a\')']
|
|
204
|
-
@d.l({:x => true, :y => false}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x IS NOT TRUE)', '(y IS NOT FALSE)']
|
|
205
|
-
@d.l({:x => nil, :y => [1,2,3]}.sql_negate)[1...-1].split(' AND ').sort.must_equal ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
it "should support ~ on hashes" do
|
|
209
|
-
@d.l(~{:x => 100, :y => 'a'})[1...-1].split(' OR ').sort.must_equal ['(x != 100)', '(y != \'a\')']
|
|
210
|
-
@d.l(~{:x => true, :y => false})[1...-1].split(' OR ').sort.must_equal ['(x IS NOT TRUE)', '(y IS NOT FALSE)']
|
|
211
|
-
@d.l(~{:x => nil, :y => [1,2,3]})[1...-1].split(' OR ').sort.must_equal ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
it "should support sql_or on hashes" do
|
|
215
|
-
@d.l({:x => 100, :y => 'a'}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x = 100)', '(y = \'a\')']
|
|
216
|
-
@d.l({:x => true, :y => false}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
|
|
217
|
-
@d.l({:x => nil, :y => [1,2,3]}.sql_or)[1...-1].split(' OR ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
it "should Hash#& and Hash#|" do
|
|
221
|
-
@d.l({:y => :z} & :x).must_equal '((y = z) AND x)'
|
|
222
|
-
@d.l({:x => :a} & {:y => :z}).must_equal '((x = a) AND (y = z))'
|
|
223
|
-
@d.l({:y => :z} | :x).must_equal '((y = z) OR x)'
|
|
224
|
-
@d.l({:x => :a} | {:y => :z}).must_equal '((x = a) OR (y = z))'
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
describe "Array#case and Hash#case" do
|
|
229
|
-
before do
|
|
230
|
-
@d = Sequel.mock.dataset
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
it "should return SQL CASE expression" do
|
|
234
|
-
@d.literal({:x=>:y}.case(:z)).must_equal '(CASE WHEN x THEN y ELSE z END)'
|
|
235
|
-
@d.literal({:x=>:y}.case(:z, :exp)).must_equal '(CASE exp WHEN x THEN y ELSE z END)'
|
|
236
|
-
@d.literal({:x=>:y, :a=>:b}.case(:z)).must_equal '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
237
|
-
@d.literal([[:x, :y]].case(:z)).must_equal '(CASE WHEN x THEN y ELSE z END)'
|
|
238
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z)).must_equal '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
239
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z, :exp)).must_equal '(CASE exp WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
240
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z, Sequel[:exp][:w])).must_equal '(CASE exp.w WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
it "should return SQL CASE expression with expression even if nil" do
|
|
244
|
-
@d.literal({:x=>:y}.case(:z, nil)).must_equal '(CASE NULL WHEN x THEN y ELSE z END)'
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
it "should raise an error if an array that isn't all two pairs is used" do
|
|
248
|
-
proc{[:b].case(:a)}.must_raise(Sequel::Error)
|
|
249
|
-
proc{[:b, :c].case(:a)}.must_raise(Sequel::Error)
|
|
250
|
-
proc{[[:b, :c], :d].case(:a)}.must_raise(Sequel::Error)
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "should raise an error if an empty array/hash is used" do
|
|
254
|
-
proc{[].case(:a)}.must_raise(Sequel::Error)
|
|
255
|
-
proc{{}.case(:a)}.must_raise(Sequel::Error)
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
describe "Array#sql_value_list" do
|
|
260
|
-
before do
|
|
261
|
-
@d = Sequel.mock.dataset
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
it "should treat the array as an SQL value list instead of conditions when used as a placeholder value" do
|
|
265
|
-
@d.filter(Sequel.lit("(a, b) IN ?", [[:x, 1], [:y, 2]])).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x = 1) AND (y = 2)))'
|
|
266
|
-
@d.filter(Sequel.lit("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_value_list)).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "should be no difference when used as a hash value" do
|
|
270
|
-
@d.filter([:a, :b]=>[[:x, 1], [:y, 2]]).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
271
|
-
@d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_value_list).sql.must_equal 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
describe "String#lit" do
|
|
276
|
-
before do
|
|
277
|
-
@ds = Sequel.mock[:t]
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
it "should return an LiteralString object" do
|
|
281
|
-
'xyz'.lit.must_be_kind_of(Sequel::LiteralString)
|
|
282
|
-
'xyz'.lit.to_s.must_equal 'xyz'
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
it "should inhibit string literalization" do
|
|
286
|
-
@ds.update_sql(:stamp => "NOW()".lit).must_equal "UPDATE t SET stamp = NOW()"
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
it "should return a PlaceholderLiteralString object if args are given" do
|
|
290
|
-
a = 'DISTINCT ?'.lit(:a)
|
|
291
|
-
a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
292
|
-
@ds.literal(a).must_equal 'DISTINCT a'
|
|
293
|
-
@ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
it "should handle named placeholders if given a single argument hash" do
|
|
297
|
-
a = 'DISTINCT :b'.lit(:b=>:a)
|
|
298
|
-
a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
299
|
-
@ds.literal(a).must_equal 'DISTINCT a'
|
|
300
|
-
@ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
it "should treat placeholder literal strings as generic expressions" do
|
|
304
|
-
a = ':b'.lit(:b=>:a)
|
|
305
|
-
@ds.literal(a + 1).must_equal "(a + 1)"
|
|
306
|
-
@ds.literal(a & :b).must_equal "(a AND b)"
|
|
307
|
-
@ds.literal(a.sql_string + :b).must_equal "(a || b)"
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
describe "String#to_sequel_blob" do
|
|
312
|
-
it "should return a Blob object" do
|
|
313
|
-
'xyz'.to_sequel_blob.must_be_kind_of(::Sequel::SQL::Blob)
|
|
314
|
-
'xyz'.to_sequel_blob.must_equal 'xyz'
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
it "should retain binary data" do
|
|
318
|
-
"\1\2\3\4".to_sequel_blob.must_equal "\1\2\3\4"
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
describe "String cast methods" do
|
|
323
|
-
before do
|
|
324
|
-
@ds = Sequel.mock.dataset
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
it "should support cast method" do
|
|
328
|
-
@ds.literal('abc'.cast(:integer)).must_equal "CAST('abc' AS integer)"
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
it "should support cast_numeric and cast_string" do
|
|
332
|
-
x = 'abc'.cast_numeric
|
|
333
|
-
x.must_be_kind_of(Sequel::SQL::NumericExpression)
|
|
334
|
-
@ds.literal(x).must_equal "CAST('abc' AS integer)"
|
|
335
|
-
|
|
336
|
-
x = 'abc'.cast_numeric(:real)
|
|
337
|
-
x.must_be_kind_of(Sequel::SQL::NumericExpression)
|
|
338
|
-
@ds.literal(x).must_equal "CAST('abc' AS real)"
|
|
339
|
-
|
|
340
|
-
x = 'abc'.cast_string
|
|
341
|
-
x.must_be_kind_of(Sequel::SQL::StringExpression)
|
|
342
|
-
@ds.literal(x).must_equal "CAST('abc' AS varchar(255))"
|
|
343
|
-
|
|
344
|
-
x = 'abc'.cast_string(:varchar)
|
|
345
|
-
x.must_be_kind_of(Sequel::SQL::StringExpression)
|
|
346
|
-
@ds.literal(x).must_equal "CAST('abc' AS varchar(255))"
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
describe "#desc" do
|
|
351
|
-
before do
|
|
352
|
-
@ds = Sequel.mock.dataset
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
it "should format a DESC clause for a column ref" do
|
|
356
|
-
@ds.literal(:test.desc).must_equal 'test DESC'
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
with_symbol_splitting "should format a DESC clause for a column ref with a splitting symbol" do
|
|
360
|
-
@ds.literal(:items__price.desc).must_equal 'items.price DESC'
|
|
361
|
-
end
|
|
362
|
-
|
|
363
|
-
it "should format a DESC clause for a function" do
|
|
364
|
-
@ds.literal(:avg.sql_function(:test).desc).must_equal 'avg(test) DESC'
|
|
365
|
-
end
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
describe "#asc" do
|
|
369
|
-
before do
|
|
370
|
-
@ds = Sequel.mock.dataset
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
it "should format a ASC clause for a column ref" do
|
|
374
|
-
@ds.literal(:test.asc).must_equal 'test ASC'
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
with_symbol_splitting "should format a ASC clause for a column ref for a splittable symbol" do
|
|
378
|
-
@ds.literal(:items__price.asc).must_equal 'items.price ASC'
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
it "should format a ASC clause for a function" do
|
|
382
|
-
@ds.literal(:avg.sql_function(:test).asc).must_equal 'avg(test) ASC'
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
describe "#as" do
|
|
387
|
-
before do
|
|
388
|
-
@ds = Sequel.mock.dataset
|
|
389
|
-
end
|
|
390
|
-
|
|
391
|
-
it "should format a AS clause for a column ref" do
|
|
392
|
-
@ds.literal(:test.as(:t)).must_equal 'test AS t'
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
with_symbol_splitting "should format a AS clause for a column ref for splittable symbols" do
|
|
396
|
-
@ds.literal(:items__price.as(:p)).must_equal 'items.price AS p'
|
|
397
|
-
end
|
|
398
|
-
|
|
399
|
-
it "should format a AS clause for a function" do
|
|
400
|
-
@ds.literal(:avg.sql_function(:test).as(:avg)).must_equal 'avg(test) AS avg'
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
it "should format a AS clause for a literal value" do
|
|
404
|
-
@ds.literal('abc'.as(:abc)).must_equal "'abc' AS abc"
|
|
405
|
-
end
|
|
406
|
-
end
|
|
407
|
-
|
|
408
|
-
describe "Column references" do
|
|
409
|
-
before do
|
|
410
|
-
@ds = Sequel.mock.dataset.with_quote_identifiers(true).with_extend{def quoted_identifier_append(sql, c) sql << "`#{c}`" end}
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
it "should be quoted properly" do
|
|
414
|
-
@ds.literal(:xyz).must_equal "`xyz`"
|
|
415
|
-
@ds.literal(:xyz.as(:x)).must_equal "`xyz` AS `x`"
|
|
416
|
-
end
|
|
417
|
-
|
|
418
|
-
it "should be quoted properly in SQL functions" do
|
|
419
|
-
@ds.literal(:avg.sql_function(:xyz)).must_equal "avg(`xyz`)"
|
|
420
|
-
@ds.literal(:avg.sql_function(:xyz, 1)).must_equal "avg(`xyz`, 1)"
|
|
421
|
-
@ds.literal(:avg.sql_function(:xyz).as(:a)).must_equal "avg(`xyz`) AS `a`"
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
it "should be quoted properly in ASC/DESC clauses" do
|
|
425
|
-
@ds.literal(:xyz.asc).must_equal "`xyz` ASC"
|
|
426
|
-
@ds.literal(:avg.sql_function(:xyz, 1).desc).must_equal "avg(`xyz`, 1) DESC"
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
it "should be quoted properly in a cast function" do
|
|
430
|
-
@ds.literal(:x.cast(:integer)).must_equal "CAST(`x` AS integer)"
|
|
431
|
-
end
|
|
432
|
-
|
|
433
|
-
with_symbol_splitting "should be quoted properly when using symbol splitting" do
|
|
434
|
-
@ds.literal(:xyz__abc).must_equal "`xyz`.`abc`"
|
|
435
|
-
@ds.literal(:xyz__abc.as(:x)).must_equal "`xyz`.`abc` AS `x`"
|
|
436
|
-
@ds.literal(:xyz___x).must_equal "`xyz` AS `x`"
|
|
437
|
-
@ds.literal(:xyz__abc___x).must_equal "`xyz`.`abc` AS `x`"
|
|
438
|
-
@ds.literal(:x__y.cast('varchar(20)')).must_equal "CAST(`x`.`y` AS varchar(20))"
|
|
439
|
-
end
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
describe "Blob" do
|
|
443
|
-
it "#to_sequel_blob should return self" do
|
|
444
|
-
blob = "x".to_sequel_blob
|
|
445
|
-
blob.to_sequel_blob.object_id.must_equal blob.object_id
|
|
446
|
-
end
|
|
447
|
-
end
|
|
448
|
-
|
|
449
|
-
describe "Symbol#*" do
|
|
450
|
-
before do
|
|
451
|
-
@ds = Sequel.mock.dataset
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
it "should format a qualified wildcard if no argument" do
|
|
455
|
-
@ds.literal(:xyz.*).must_equal 'xyz.*'
|
|
456
|
-
@ds.literal(:abc.*).must_equal 'abc.*'
|
|
457
|
-
end
|
|
458
|
-
|
|
459
|
-
it "should format a filter expression if an argument" do
|
|
460
|
-
@ds.literal(:xyz.*(3)).must_equal '(xyz * 3)'
|
|
461
|
-
@ds.literal(:abc.*(5)).must_equal '(abc * 5)'
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
with_symbol_splitting "should support qualified symbols if no argument" do
|
|
465
|
-
@ds.literal(:xyz__abc.*).must_equal 'xyz.abc.*'
|
|
466
|
-
end
|
|
467
|
-
end
|
|
468
|
-
|
|
469
|
-
describe "Symbol" do
|
|
470
|
-
before do
|
|
471
|
-
@ds = Sequel.mock.dataset.with_quote_identifiers(true)
|
|
472
|
-
end
|
|
473
|
-
|
|
474
|
-
it "#identifier should format an identifier" do
|
|
475
|
-
@ds.literal(:xyz__abc.identifier).must_equal '"xyz__abc"'
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
it "#qualify should format a qualified column" do
|
|
479
|
-
@ds.literal(:xyz.qualify(:abc)).must_equal '"abc"."xyz"'
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
it "#qualify should work on QualifiedIdentifiers" do
|
|
483
|
-
@ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"def"."abc"."xyz"'
|
|
484
|
-
end
|
|
485
|
-
|
|
486
|
-
with_symbol_splitting "should be able to qualify an identifier" do
|
|
487
|
-
@ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"xyz"."abc"."xyz"'
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
it "should be able to specify a schema.table.column" do
|
|
491
|
-
@ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"schema"."table"."column"'
|
|
492
|
-
@ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"schema"."table__name"."column"'
|
|
493
|
-
end
|
|
494
|
-
|
|
495
|
-
it "should be able to specify order" do
|
|
496
|
-
@oe = :xyz.desc
|
|
497
|
-
@oe.class.must_equal Sequel::SQL::OrderedExpression
|
|
498
|
-
@oe.descending.must_equal true
|
|
499
|
-
@oe = :xyz.asc
|
|
500
|
-
@oe.class.must_equal Sequel::SQL::OrderedExpression
|
|
501
|
-
@oe.descending.must_equal false
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
it "should work correctly with objects" do
|
|
505
|
-
o = Object.new
|
|
506
|
-
def o.sql_literal(ds) "(foo)" end
|
|
507
|
-
@ds.literal(:column.qualify(o)).must_equal '(foo)."column"'
|
|
508
|
-
end
|
|
509
|
-
end
|
|
510
|
-
|
|
511
|
-
describe "Symbol" do
|
|
512
|
-
before do
|
|
513
|
-
@ds = Sequel.mock.dataset
|
|
514
|
-
end
|
|
515
|
-
|
|
516
|
-
it "should support sql_function method" do
|
|
517
|
-
@ds.literal(:COUNT.sql_function('1')).must_equal "COUNT('1')"
|
|
518
|
-
@ds.select(:COUNT.sql_function('1')).sql.must_equal "SELECT COUNT('1')"
|
|
519
|
-
end
|
|
520
|
-
|
|
521
|
-
it "should support cast method" do
|
|
522
|
-
@ds.literal(:abc.cast(:integer)).must_equal "CAST(abc AS integer)"
|
|
523
|
-
end
|
|
524
|
-
|
|
525
|
-
it "should support sql array accesses via sql_subscript" do
|
|
526
|
-
@ds.literal(:abc.sql_subscript(1)).must_equal "abc[1]"
|
|
527
|
-
@ds.literal(:abc.sql_subscript(1)|2).must_equal "abc[1, 2]"
|
|
528
|
-
@ds.literal(:abc.sql_subscript(1)[2]).must_equal "abc[1][2]"
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
with_symbol_splitting "should support sql array accesses via sql_subscript for splittable symbols" do
|
|
532
|
-
@ds.literal(:abc__def.sql_subscript(1)).must_equal "abc.def[1]"
|
|
533
|
-
end
|
|
534
|
-
|
|
535
|
-
it "should support cast_numeric and cast_string" do
|
|
536
|
-
x = :abc.cast_numeric
|
|
537
|
-
x.must_be_kind_of(Sequel::SQL::NumericExpression)
|
|
538
|
-
@ds.literal(x).must_equal "CAST(abc AS integer)"
|
|
539
|
-
|
|
540
|
-
x = :abc.cast_numeric(:real)
|
|
541
|
-
x.must_be_kind_of(Sequel::SQL::NumericExpression)
|
|
542
|
-
@ds.literal(x).must_equal "CAST(abc AS real)"
|
|
543
|
-
|
|
544
|
-
x = :abc.cast_string
|
|
545
|
-
x.must_be_kind_of(Sequel::SQL::StringExpression)
|
|
546
|
-
@ds.literal(x).must_equal "CAST(abc AS varchar(255))"
|
|
547
|
-
|
|
548
|
-
x = :abc.cast_string(:varchar)
|
|
549
|
-
x.must_be_kind_of(Sequel::SQL::StringExpression)
|
|
550
|
-
@ds.literal(x).must_equal "CAST(abc AS varchar(255))"
|
|
551
|
-
end
|
|
552
|
-
|
|
553
|
-
it "should support boolean methods" do
|
|
554
|
-
@ds.literal(~:x).must_equal "NOT x"
|
|
555
|
-
@ds.literal(:x & :y).must_equal "(x AND y)"
|
|
556
|
-
@ds.literal(:x | :y).must_equal "(x OR y)"
|
|
557
|
-
end
|
|
558
|
-
|
|
559
|
-
it "should support complex expression methods" do
|
|
560
|
-
@ds.literal(:x.sql_boolean & 1).must_equal "(x AND 1)"
|
|
561
|
-
@ds.literal(:x.sql_number & :y).must_equal "(x & y)"
|
|
562
|
-
@ds.literal(:x.sql_string + :y).must_equal "(x || y)"
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
it "should allow database independent types when casting" do
|
|
566
|
-
db = @ds.db
|
|
567
|
-
def db.cast_type_literal(type)
|
|
568
|
-
return :foo if type == Integer
|
|
569
|
-
return :bar if type == String
|
|
570
|
-
type
|
|
571
|
-
end
|
|
572
|
-
@ds.literal(:abc.cast(String)).must_equal "CAST(abc AS bar)"
|
|
573
|
-
@ds.literal(:abc.cast(String)).must_equal "CAST(abc AS bar)"
|
|
574
|
-
@ds.literal(:abc.cast_string).must_equal "CAST(abc AS bar)"
|
|
575
|
-
@ds.literal(:abc.cast_string(Integer)).must_equal "CAST(abc AS foo)"
|
|
576
|
-
@ds.literal(:abc.cast_numeric).must_equal "CAST(abc AS foo)"
|
|
577
|
-
@ds.literal(:abc.cast_numeric(String)).must_equal "CAST(abc AS bar)"
|
|
578
|
-
end
|
|
579
|
-
|
|
580
|
-
it "should support SQL EXTRACT function via #extract " do
|
|
581
|
-
@ds.literal(:abc.extract(:year)).must_equal "extract(year FROM abc)"
|
|
582
|
-
end
|
|
583
|
-
end
|
|
584
|
-
|
|
585
|
-
describe "Postgres extensions integration" do
|
|
586
|
-
before do
|
|
587
|
-
@db = Sequel.mock
|
|
588
|
-
Sequel.extension(:pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops, :pg_json, :pg_json_ops, :pg_range, :pg_range_ops, :pg_row, :pg_row_ops, :pg_inet_ops)
|
|
589
|
-
end
|
|
590
|
-
|
|
591
|
-
it "Symbol#pg_array should return an ArrayOp" do
|
|
592
|
-
@db.literal(:a.pg_array.unnest).must_equal "unnest(a)"
|
|
593
|
-
end
|
|
594
|
-
|
|
595
|
-
it "Symbol#pg_row should return a PGRowOp" do
|
|
596
|
-
@db.literal(:a.pg_row[:a]).must_equal "(a).a"
|
|
597
|
-
end
|
|
598
|
-
|
|
599
|
-
it "Symbol#hstore should return an HStoreOp" do
|
|
600
|
-
@db.literal(:a.hstore['a']).must_equal "(a -> 'a')"
|
|
601
|
-
end
|
|
602
|
-
|
|
603
|
-
it "Symbol#pg_inet should return an InetOp" do
|
|
604
|
-
@db.literal(:a.pg_inet.contains(:b)).must_equal "(a >> b)"
|
|
605
|
-
end
|
|
606
|
-
|
|
607
|
-
it "Symbol#pg_json should return an JSONOp" do
|
|
608
|
-
@db.literal(:a.pg_json[%w'a b']).must_equal "(a #> ARRAY['a','b'])"
|
|
609
|
-
@db.literal(:a.pg_json.extract('a')).must_equal "json_extract_path(a, 'a')"
|
|
610
|
-
end
|
|
611
|
-
|
|
612
|
-
it "Symbol#pg_jsonb should return an JSONBOp" do
|
|
613
|
-
@db.literal(:a.pg_jsonb[%w'a b']).must_equal "(a #> ARRAY['a','b'])"
|
|
614
|
-
@db.literal(:a.pg_jsonb.extract('a')).must_equal "jsonb_extract_path(a, 'a')"
|
|
615
|
-
end
|
|
616
|
-
|
|
617
|
-
it "Symbol#pg_range should return a RangeOp" do
|
|
618
|
-
@db.literal(:a.pg_range.lower).must_equal "lower(a)"
|
|
619
|
-
end
|
|
620
|
-
|
|
621
|
-
it "Array#pg_array should return a PGArray" do
|
|
622
|
-
@db.literal([1].pg_array.op.unnest).must_equal "unnest(ARRAY[1])"
|
|
623
|
-
@db.literal([1].pg_array(:int4).op.unnest).must_equal "unnest(ARRAY[1]::int4[])"
|
|
624
|
-
end
|
|
625
|
-
|
|
626
|
-
it "Array#pg_json should return a JSONArray" do
|
|
627
|
-
@db.literal([1].pg_json).must_equal "'[1]'::json"
|
|
628
|
-
end
|
|
629
|
-
|
|
630
|
-
it "Array#pg_jsonb should return a JSONBArray" do
|
|
631
|
-
@db.literal([1].pg_jsonb).must_equal "'[1]'::jsonb"
|
|
632
|
-
end
|
|
633
|
-
|
|
634
|
-
it "Array#pg_row should return a ArrayRow" do
|
|
635
|
-
@db.literal([1].pg_row).must_equal "ROW(1)"
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
it "Hash#hstore should return an HStore" do
|
|
639
|
-
@db.literal({'a'=>1}.hstore.op['a']).must_equal '(\'"a"=>"1"\'::hstore -> \'a\')'
|
|
640
|
-
end
|
|
641
|
-
|
|
642
|
-
it "Hash#pg_json should return an JSONHash" do
|
|
643
|
-
@db.literal({'a'=>'b'}.pg_json).must_equal "'{\"a\":\"b\"}'::json"
|
|
644
|
-
end
|
|
645
|
-
|
|
646
|
-
it "Hash#pg_jsonb should return an JSONBHash" do
|
|
647
|
-
@db.literal({'a'=>'b'}.pg_jsonb).must_equal "'{\"a\":\"b\"}'::jsonb"
|
|
648
|
-
end
|
|
649
|
-
|
|
650
|
-
it "Range#pg_range should return an PGRange" do
|
|
651
|
-
@db.literal((1..2).pg_range).must_equal "'[1,2]'"
|
|
652
|
-
@db.literal((1..2).pg_range(:int4range)).must_equal "int4range(1,2,'[]')"
|
|
653
|
-
end
|
|
654
|
-
end
|
|
655
|
-
|
|
656
|
-
describe "symbol_aref extensions" do
|
|
657
|
-
before do
|
|
658
|
-
@db = Sequel.mock
|
|
659
|
-
end
|
|
660
|
-
|
|
661
|
-
it "Symbol#[] should create qualified identifier if given a symbol" do
|
|
662
|
-
@db.literal(:x[:y]).must_equal "x.y"
|
|
663
|
-
end
|
|
664
|
-
|
|
665
|
-
it "Symbol#[] should create qualified identifier if given an identifier" do
|
|
666
|
-
@db.literal(:x[Sequel[:y]]).must_equal "x.y"
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
it "Symbol#[] should create qualified identifier if given a qualified identifier" do
|
|
670
|
-
@db.literal(:x[:y[:z]]).must_equal "x.y.z"
|
|
671
|
-
end
|
|
672
|
-
|
|
673
|
-
it "should not affect other arguments to Symbol#[]" do
|
|
674
|
-
:x[0].must_equal "x"
|
|
675
|
-
end
|
|
676
|
-
end
|
|
677
|
-
|
|
678
|
-
describe Sequel::SQL::VirtualRow do
|
|
679
|
-
before do
|
|
680
|
-
@d = Sequel.mock[:items].with_quote_identifiers(true).with_extend do
|
|
681
|
-
def supports_window_functions?; true end
|
|
682
|
-
def l(*args, &block)
|
|
683
|
-
literal(filter_expr(*args, &block))
|
|
684
|
-
end
|
|
685
|
-
end
|
|
686
|
-
end
|
|
687
|
-
|
|
688
|
-
it "should treat methods without blocks normally" do
|
|
689
|
-
@d.l{column}.must_equal '"column"'
|
|
690
|
-
@d.l{foo(a)}.must_equal 'foo("a")'
|
|
691
|
-
end
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
it "should treat methods with a block and no arguments as a function call with no arguments" do
|
|
695
|
-
@d.l{version{}}.must_equal 'version()'
|
|
696
|
-
end
|
|
697
|
-
|
|
698
|
-
it "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
|
|
699
|
-
@d.l{count(:*){}}.must_equal 'count(*)'
|
|
700
|
-
end
|
|
701
|
-
|
|
702
|
-
it "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
|
|
703
|
-
@d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
|
|
704
|
-
@d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
|
|
705
|
-
end
|
|
706
|
-
|
|
707
|
-
it "should raise an error if an unsupported argument is used with a block" do
|
|
708
|
-
proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
|
|
709
|
-
end
|
|
710
|
-
|
|
711
|
-
it "should treat methods with a block and a leading argument :over as a window function call" do
|
|
712
|
-
@d.l{rank(:over){}}.must_equal 'rank() OVER ()'
|
|
713
|
-
end
|
|
714
|
-
|
|
715
|
-
it "should support :partition options for window function calls" do
|
|
716
|
-
@d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
|
|
717
|
-
@d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
|
|
718
|
-
end
|
|
719
|
-
|
|
720
|
-
it "should support :args options for window function calls" do
|
|
721
|
-
@d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
|
|
722
|
-
@d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
|
|
723
|
-
end
|
|
724
|
-
|
|
725
|
-
it "should support :order option for window function calls" do
|
|
726
|
-
@d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
|
|
727
|
-
@d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
|
|
728
|
-
end
|
|
729
|
-
|
|
730
|
-
it "should support :window option for window function calls" do
|
|
731
|
-
@d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
|
|
732
|
-
end
|
|
733
|
-
|
|
734
|
-
it "should support :*=>true option for window function calls" do
|
|
735
|
-
@d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
|
|
736
|
-
end
|
|
737
|
-
|
|
738
|
-
it "should support :frame=>:all option for window function calls" do
|
|
739
|
-
@d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
|
|
740
|
-
end
|
|
741
|
-
|
|
742
|
-
it "should support :frame=>:rows option for window function calls" do
|
|
743
|
-
@d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
|
744
|
-
end
|
|
745
|
-
|
|
746
|
-
it "should support :frame=>'some string' option for window function calls" do
|
|
747
|
-
@d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
|
|
748
|
-
end
|
|
749
|
-
|
|
750
|
-
it "should raise an error if an invalid :frame option is used" do
|
|
751
|
-
proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
|
|
752
|
-
end
|
|
753
|
-
|
|
754
|
-
it "should support all these options together" do
|
|
755
|
-
@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.must_equal 'count(*) OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
|
756
|
-
end
|
|
757
|
-
|
|
758
|
-
it "should raise an error if window functions are not supported" do
|
|
759
|
-
proc{@d.with_extend{def supports_window_functions?; false end}.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
|
|
760
|
-
proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
|
|
761
|
-
end
|
|
762
|
-
end
|
|
763
|
-
|