sequel 4.36.0 → 5.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
@@ -1,1247 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
2
|
-
|
3
|
-
describe "Blockless Ruby Filters" do
|
4
|
-
before do
|
5
|
-
db = Sequel::Database.new
|
6
|
-
@d = db[:items]
|
7
|
-
def @d.l(*args, &block)
|
8
|
-
literal(filter_expr(*args, &block))
|
9
|
-
end
|
10
|
-
def @d.lit(*args)
|
11
|
-
literal(*args)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should support boolean columns directly" do
|
16
|
-
@d.l(:x).must_equal 'x'
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should support qualified columns" do
|
20
|
-
@d.l(:x__y).must_equal 'x.y'
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should support NOT with SQL functions" do
|
24
|
-
@d.l(~Sequel.function(:is_blah)).must_equal 'NOT is_blah()'
|
25
|
-
@d.l(~Sequel.function(:is_blah, :x)).must_equal 'NOT is_blah(x)'
|
26
|
-
@d.l(~Sequel.function(:is_blah, :x__y)).must_equal 'NOT is_blah(x.y)'
|
27
|
-
@d.l(~Sequel.function(:is_blah, :x, :x__y)).must_equal 'NOT is_blah(x, x.y)'
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should handle multiple ~" do
|
31
|
-
@d.l(~Sequel.~(:x)).must_equal 'x'
|
32
|
-
@d.l(~~Sequel.~(:x)).must_equal 'NOT x'
|
33
|
-
@d.l(~~Sequel.&(:x, :y)).must_equal '(x AND y)'
|
34
|
-
@d.l(~~Sequel.|(:x, :y)).must_equal '(x OR y)'
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should support = via Hash" do
|
38
|
-
@d.l(:x => 100).must_equal '(x = 100)'
|
39
|
-
@d.l(:x => 'a').must_equal '(x = \'a\')'
|
40
|
-
@d.l(:x => true).must_equal '(x IS TRUE)'
|
41
|
-
@d.l(:x => false).must_equal '(x IS FALSE)'
|
42
|
-
@d.l(:x => nil).must_equal '(x IS NULL)'
|
43
|
-
@d.l(:x => [1,2,3]).must_equal '(x IN (1, 2, 3))'
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should use = 't' and != 't' OR IS NULL if IS TRUE is not supported" do
|
47
|
-
meta_def(@d, :supports_is_true?){false}
|
48
|
-
@d.l(:x => true).must_equal "(x = 't')"
|
49
|
-
@d.l(~Sequel.expr(:x => true)).must_equal "((x != 't') OR (x IS NULL))"
|
50
|
-
@d.l(:x => false).must_equal "(x = 'f')"
|
51
|
-
@d.l(~Sequel.expr(:x => false)).must_equal "((x != 'f') OR (x IS NULL))"
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should support != via inverted Hash" do
|
55
|
-
@d.l(~Sequel.expr(:x => 100)).must_equal '(x != 100)'
|
56
|
-
@d.l(~Sequel.expr(:x => 'a')).must_equal '(x != \'a\')'
|
57
|
-
@d.l(~Sequel.expr(:x => true)).must_equal '(x IS NOT TRUE)'
|
58
|
-
@d.l(~Sequel.expr(:x => false)).must_equal '(x IS NOT FALSE)'
|
59
|
-
@d.l(~Sequel.expr(:x => nil)).must_equal '(x IS NOT NULL)'
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should support = and similar operations via =~ method" do
|
63
|
-
@d.l{x =~ 100}.must_equal '(x = 100)'
|
64
|
-
@d.l{x =~ 'a'}.must_equal '(x = \'a\')'
|
65
|
-
@d.l{x =~ true}.must_equal '(x IS TRUE)'
|
66
|
-
@d.l{x =~ false}.must_equal '(x IS FALSE)'
|
67
|
-
@d.l{x =~ nil}.must_equal '(x IS NULL)'
|
68
|
-
@d.l{x =~ (1...5)}.must_equal '((x >= 1) AND (x < 5))'
|
69
|
-
@d.l{x =~ [1,2,3]}.must_equal '(x IN (1, 2, 3))'
|
70
|
-
|
71
|
-
@d.l{(x + y) =~ 100}.must_equal '((x + y) = 100)'
|
72
|
-
@d.l{(x + y) =~ 'a'}.must_equal '((x + y) = \'a\')'
|
73
|
-
@d.l{(x + y) =~ true}.must_equal '((x + y) IS TRUE)'
|
74
|
-
@d.l{(x + y) =~ false}.must_equal '((x + y) IS FALSE)'
|
75
|
-
@d.l{(x + y) =~ nil}.must_equal '((x + y) IS NULL)'
|
76
|
-
@d.l{(x + y) =~ (1...5)}.must_equal '(((x + y) >= 1) AND ((x + y) < 5))'
|
77
|
-
@d.l{(x + y) =~ [1,2,3]}.must_equal '((x + y) IN (1, 2, 3))'
|
78
|
-
|
79
|
-
def @d.supports_regexp?; true end
|
80
|
-
@d.l{x =~ /blah/}.must_equal '(x ~ \'blah\')'
|
81
|
-
@d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
|
82
|
-
end
|
83
|
-
|
84
|
-
if RUBY_VERSION >= '1.9'
|
85
|
-
it "should support != and similar inversions via !~ method" do
|
86
|
-
@d.l{x !~ 100}.must_equal '(x != 100)'
|
87
|
-
@d.l{x !~ 'a'}.must_equal '(x != \'a\')'
|
88
|
-
@d.l{x !~ true}.must_equal '(x IS NOT TRUE)'
|
89
|
-
@d.l{x !~ false}.must_equal '(x IS NOT FALSE)'
|
90
|
-
@d.l{x !~ nil}.must_equal '(x IS NOT NULL)'
|
91
|
-
@d.l{x !~ (1...5)}.must_equal '((x < 1) OR (x >= 5))'
|
92
|
-
@d.l{x !~ [1,2,3]}.must_equal '(x NOT IN (1, 2, 3))'
|
93
|
-
|
94
|
-
@d.l{(x + y) !~ 100}.must_equal '((x + y) != 100)'
|
95
|
-
@d.l{(x + y) !~ 'a'}.must_equal '((x + y) != \'a\')'
|
96
|
-
@d.l{(x + y) !~ true}.must_equal '((x + y) IS NOT TRUE)'
|
97
|
-
@d.l{(x + y) !~ false}.must_equal '((x + y) IS NOT FALSE)'
|
98
|
-
@d.l{(x + y) !~ nil}.must_equal '((x + y) IS NOT NULL)'
|
99
|
-
@d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
|
100
|
-
@d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
|
101
|
-
|
102
|
-
def @d.supports_regexp?; true end
|
103
|
-
@d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
|
104
|
-
@d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should support ~ via Hash and Regexp (if supported by database)" do
|
109
|
-
def @d.supports_regexp?; true end
|
110
|
-
@d.l(:x => /blah/).must_equal '(x ~ \'blah\')'
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should support !~ via inverted Hash and Regexp" do
|
114
|
-
def @d.supports_regexp?; true end
|
115
|
-
@d.l(~Sequel.expr(:x => /blah/)).must_equal '(x !~ \'blah\')'
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should support negating ranges" do
|
119
|
-
@d.l(~Sequel.expr(:x => 1..5)).must_equal '((x < 1) OR (x > 5))'
|
120
|
-
@d.l(~Sequel.expr(:x => 1...5)).must_equal '((x < 1) OR (x >= 5))'
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should support negating IN with Dataset or Array" do
|
124
|
-
@d.l(~Sequel.expr(:x => @d.select(:i))).must_equal '(x NOT IN (SELECT i FROM items))'
|
125
|
-
@d.l(~Sequel.expr(:x => [1,2,3])).must_equal '(x NOT IN (1, 2, 3))'
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should not add ~ method to string expressions" do
|
129
|
-
proc{~Sequel.expr(:x).sql_string}.must_raise(NoMethodError)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "should allow mathematical or string operations on true, false, or nil" do
|
133
|
-
@d.lit(Sequel.expr(:x) + 1).must_equal '(x + 1)'
|
134
|
-
@d.lit(Sequel.expr(:x) - true).must_equal "(x - 't')"
|
135
|
-
@d.lit(Sequel.expr(:x) / false).must_equal "(x / 'f')"
|
136
|
-
@d.lit(Sequel.expr(:x) * nil).must_equal '(x * NULL)'
|
137
|
-
@d.lit(Sequel.join([:x, nil])).must_equal '(x || NULL)'
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should allow mathematical or string operations on boolean complex expressions" do
|
141
|
-
@d.lit(Sequel.expr(:x) + (Sequel.expr(:y) + 1)).must_equal '(x + y + 1)'
|
142
|
-
@d.lit(Sequel.expr(:x) - ~Sequel.expr(:y)).must_equal '(x - NOT y)'
|
143
|
-
@d.lit(Sequel.expr(:x) / (Sequel.expr(:y) & :z)).must_equal '(x / (y AND z))'
|
144
|
-
@d.lit(Sequel.expr(:x) * (Sequel.expr(:y) | :z)).must_equal '(x * (y OR z))'
|
145
|
-
@d.lit(Sequel.expr(:x) + Sequel.expr(:y).like('a')).must_equal "(x + (y LIKE 'a' ESCAPE '\\'))"
|
146
|
-
@d.lit(Sequel.expr(:x) - ~Sequel.expr(:y).like('a')).must_equal "(x - (y NOT LIKE 'a' ESCAPE '\\'))"
|
147
|
-
@d.lit(Sequel.join([:x, ~Sequel.expr(:y).like('a')])).must_equal "(x || (y NOT LIKE 'a' ESCAPE '\\'))"
|
148
|
-
end
|
149
|
-
|
150
|
-
it "should support AND conditions via &" do
|
151
|
-
@d.l(Sequel.expr(:x) & :y).must_equal '(x AND y)'
|
152
|
-
@d.l(Sequel.expr(:x).sql_boolean & :y).must_equal '(x AND y)'
|
153
|
-
@d.l(Sequel.expr(:x) & :y & :z).must_equal '(x AND y AND z)'
|
154
|
-
@d.l(Sequel.expr(:x) & {:y => :z}).must_equal '(x AND (y = z))'
|
155
|
-
@d.l((Sequel.expr(:x) + 200 < 0) & (Sequel.expr(:y) - 200 < 0)).must_equal '(((x + 200) < 0) AND ((y - 200) < 0))'
|
156
|
-
@d.l(Sequel.expr(:x) & ~Sequel.expr(:y)).must_equal '(x AND NOT y)'
|
157
|
-
@d.l(~Sequel.expr(:x) & :y).must_equal '(NOT x AND y)'
|
158
|
-
@d.l(~Sequel.expr(:x) & ~Sequel.expr(:y)).must_equal '(NOT x AND NOT y)'
|
159
|
-
end
|
160
|
-
|
161
|
-
it "should support OR conditions via |" do
|
162
|
-
@d.l(Sequel.expr(:x) | :y).must_equal '(x OR y)'
|
163
|
-
@d.l(Sequel.expr(:x).sql_boolean | :y).must_equal '(x OR y)'
|
164
|
-
@d.l(Sequel.expr(:x) | :y | :z).must_equal '(x OR y OR z)'
|
165
|
-
@d.l(Sequel.expr(:x) | {:y => :z}).must_equal '(x OR (y = z))'
|
166
|
-
@d.l((Sequel.expr(:x).sql_number > 200) | (Sequel.expr(:y).sql_number < 200)).must_equal '((x > 200) OR (y < 200))'
|
167
|
-
end
|
168
|
-
|
169
|
-
it "should support & | combinations" do
|
170
|
-
@d.l((Sequel.expr(:x) | :y) & :z).must_equal '((x OR y) AND z)'
|
171
|
-
@d.l(Sequel.expr(:x) | (Sequel.expr(:y) & :z)).must_equal '(x OR (y AND z))'
|
172
|
-
@d.l((Sequel.expr(:x) & :w) | (Sequel.expr(:y) & :z)).must_equal '((x AND w) OR (y AND z))'
|
173
|
-
end
|
174
|
-
|
175
|
-
it "should support & | with ~" do
|
176
|
-
@d.l(~((Sequel.expr(:x) | :y) & :z)).must_equal '((NOT x AND NOT y) OR NOT z)'
|
177
|
-
@d.l(~(Sequel.expr(:x) | (Sequel.expr(:y) & :z))).must_equal '(NOT x AND (NOT y OR NOT z))'
|
178
|
-
@d.l(~((Sequel.expr(:x) & :w) | (Sequel.expr(:y) & :z))).must_equal '((NOT x OR NOT w) AND (NOT y OR NOT z))'
|
179
|
-
@d.l(~((Sequel.expr(:x).sql_number > 200) | (Sequel.expr(:y) & :z))).must_equal '((x <= 200) AND (NOT y OR NOT z))'
|
180
|
-
end
|
181
|
-
|
182
|
-
it "should support LiteralString" do
|
183
|
-
@d.l(Sequel.lit('x')).must_equal '(x)'
|
184
|
-
@d.l(~Sequel.lit('x')).must_equal 'NOT x'
|
185
|
-
@d.l(~~Sequel.lit('x')).must_equal 'x'
|
186
|
-
@d.l(~((Sequel.lit('x') | :y) & :z)).must_equal '((NOT x AND NOT y) OR NOT z)'
|
187
|
-
@d.l(~(Sequel.expr(:x) | Sequel.lit('y'))).must_equal '(NOT x AND NOT y)'
|
188
|
-
@d.l(~(Sequel.lit('x') & Sequel.lit('y'))).must_equal '(NOT x OR NOT y)'
|
189
|
-
@d.l(Sequel.expr(Sequel.lit('y') => Sequel.lit('z')) & Sequel.lit('x')).must_equal '((y = z) AND x)'
|
190
|
-
@d.l((Sequel.lit('x') > 200) & (Sequel.lit('y') < 200)).must_equal '((x > 200) AND (y < 200))'
|
191
|
-
@d.l(~(Sequel.lit('x') + 1 > 100)).must_equal '((x + 1) <= 100)'
|
192
|
-
@d.l(Sequel.lit('x').like('a')).must_equal '(x LIKE \'a\' ESCAPE \'\\\')'
|
193
|
-
@d.l(Sequel.lit('x') + 1 > 100).must_equal '((x + 1) > 100)'
|
194
|
-
@d.l((Sequel.lit('x') * :y) < 100.01).must_equal '((x * y) < 100.01)'
|
195
|
-
@d.l((Sequel.lit('x') - Sequel.expr(:y)/2) >= 100000000000000000000000000000000000).must_equal '((x - (y / 2)) >= 100000000000000000000000000000000000)'
|
196
|
-
@d.l((Sequel.lit('z') * ((Sequel.lit('x') / :y)/(Sequel.expr(:x) + :y))) <= 100).must_equal '((z * (x / y / (x + y))) <= 100)'
|
197
|
-
@d.l(~((((Sequel.lit('x') - :y)/(Sequel.expr(:x) + :y))*:z) <= 100)).must_equal '((((x - y) / (x + y)) * z) > 100)'
|
198
|
-
end
|
199
|
-
|
200
|
-
it "should support hashes by ANDing the conditions" do
|
201
|
-
@d.l(:x => 100, :y => 'a')[1...-1].split(' AND ').sort.must_equal ['(x = 100)', '(y = \'a\')']
|
202
|
-
@d.l(:x => true, :y => false)[1...-1].split(' AND ').sort.must_equal ['(x IS TRUE)', '(y IS FALSE)']
|
203
|
-
@d.l(:x => nil, :y => [1,2,3])[1...-1].split(' AND ').sort.must_equal ['(x IS NULL)', '(y IN (1, 2, 3))']
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should support arrays with all two pairs the same as hashes" do
|
207
|
-
@d.l([[:x, 100],[:y, 'a']]).must_equal '((x = 100) AND (y = \'a\'))'
|
208
|
-
@d.l([[:x, true], [:y, false]]).must_equal '((x IS TRUE) AND (y IS FALSE))'
|
209
|
-
@d.l([[:x, nil], [:y, [1,2,3]]]).must_equal '((x IS NULL) AND (y IN (1, 2, 3)))'
|
210
|
-
end
|
211
|
-
|
212
|
-
it "should emulate columns for array values" do
|
213
|
-
@d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '((x, y) IN ((1, 2), (3, 4)))'
|
214
|
-
@d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '((x, y, z) IN ((1, 2, 5), (3, 4, 6)))'
|
215
|
-
end
|
216
|
-
|
217
|
-
it "should emulate multiple column in if not supported" do
|
218
|
-
meta_def(@d, :supports_multiple_column_in?){false}
|
219
|
-
@d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '(((x = 1) AND (y = 2)) OR ((x = 3) AND (y = 4)))'
|
220
|
-
@d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '(((x = 1) AND (y = 2) AND (z = 5)) OR ((x = 3) AND (y = 4) AND (z = 6)))'
|
221
|
-
end
|
222
|
-
|
223
|
-
it "should support StringExpression#+ for concatenation of SQL strings" do
|
224
|
-
@d.lit(Sequel.expr(:x).sql_string + :y).must_equal '(x || y)'
|
225
|
-
@d.lit(Sequel.join([:x]) + :y).must_equal '(x || y)'
|
226
|
-
@d.lit(Sequel.join([:x, :z], ' ') + :y).must_equal "(x || ' ' || z || y)"
|
227
|
-
end
|
228
|
-
|
229
|
-
it "should be supported inside blocks" do
|
230
|
-
@d.l{Sequel.or([[:x, nil], [:y, [1,2,3]]])}.must_equal '((x IS NULL) OR (y IN (1, 2, 3)))'
|
231
|
-
@d.l{Sequel.~([[:x, nil], [:y, [1,2,3]]])}.must_equal '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
|
232
|
-
@d.l{~((((Sequel.lit('x') - :y)/(Sequel.expr(:x) + :y))*:z) <= 100)}.must_equal '((((x - y) / (x + y)) * z) > 100)'
|
233
|
-
@d.l{Sequel.&({:x => :a}, {:y => :z})}.must_equal '((x = a) AND (y = z))'
|
234
|
-
end
|
235
|
-
|
236
|
-
it "should support &, |, ^, ~, <<, and >> for NumericExpressions" do
|
237
|
-
@d.l(Sequel.expr(:x).sql_number & 1 > 100).must_equal '((x & 1) > 100)'
|
238
|
-
@d.l(Sequel.expr(:x).sql_number | 1 > 100).must_equal '((x | 1) > 100)'
|
239
|
-
@d.l(Sequel.expr(:x).sql_number ^ 1 > 100).must_equal '((x ^ 1) > 100)'
|
240
|
-
@d.l(~Sequel.expr(:x).sql_number > 100).must_equal '(~x > 100)'
|
241
|
-
@d.l(Sequel.expr(:x).sql_number << 1 > 100).must_equal '((x << 1) > 100)'
|
242
|
-
@d.l(Sequel.expr(:x).sql_number >> 1 > 100).must_equal '((x >> 1) > 100)'
|
243
|
-
@d.l((Sequel.expr(:x) + 1) & 1 > 100).must_equal '(((x + 1) & 1) > 100)'
|
244
|
-
@d.l((Sequel.expr(:x) + 1) | 1 > 100).must_equal '(((x + 1) | 1) > 100)'
|
245
|
-
@d.l((Sequel.expr(:x) + 1) ^ 1 > 100).must_equal '(((x + 1) ^ 1) > 100)'
|
246
|
-
@d.l(~(Sequel.expr(:x) + 1) > 100).must_equal '(~(x + 1) > 100)'
|
247
|
-
@d.l((Sequel.expr(:x) + 1) << 1 > 100).must_equal '(((x + 1) << 1) > 100)'
|
248
|
-
@d.l((Sequel.expr(:x) + 1) >> 1 > 100).must_equal '(((x + 1) >> 1) > 100)'
|
249
|
-
@d.l((Sequel.expr(:x) + 1) & (Sequel.expr(:x) + 2) > 100).must_equal '(((x + 1) & (x + 2)) > 100)'
|
250
|
-
end
|
251
|
-
|
252
|
-
it "should allow using a Bitwise method on a ComplexExpression that isn't a NumericExpression" do
|
253
|
-
@d.lit((Sequel.expr(:x) + 1) & (Sequel.expr(:x) + '2')).must_equal "((x + 1) & (x || '2'))"
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should allow using a Boolean method on a ComplexExpression that isn't a BooleanExpression" do
|
257
|
-
@d.l(Sequel.expr(:x) & (Sequel.expr(:x) + '2')).must_equal "(x AND (x || '2'))"
|
258
|
-
end
|
259
|
-
|
260
|
-
it "should raise an error if attempting to invert a ComplexExpression that isn't a BooleanExpression" do
|
261
|
-
proc{Sequel::SQL::BooleanExpression.invert(Sequel.expr(:x) + 2)}.must_raise(Sequel::Error)
|
262
|
-
end
|
263
|
-
|
264
|
-
it "should return self on .lit" do
|
265
|
-
y = Sequel.expr(:x) + 1
|
266
|
-
y.lit.must_equal y
|
267
|
-
end
|
268
|
-
|
269
|
-
it "should return have .sql_literal return the literal SQL for the expression" do
|
270
|
-
y = Sequel.expr(:x) + 1
|
271
|
-
y.sql_literal(@d).must_equal '(x + 1)'
|
272
|
-
y.sql_literal(@d).must_equal @d.literal(y)
|
273
|
-
end
|
274
|
-
|
275
|
-
it "should support SQL::Constants" do
|
276
|
-
@d.l({:x => Sequel::NULL}).must_equal '(x IS NULL)'
|
277
|
-
@d.l({:x => Sequel::NOTNULL}).must_equal '(x IS NOT NULL)'
|
278
|
-
@d.l({:x => Sequel::TRUE}).must_equal '(x IS TRUE)'
|
279
|
-
@d.l({:x => Sequel::FALSE}).must_equal '(x IS FALSE)'
|
280
|
-
@d.l({:x => Sequel::SQLTRUE}).must_equal '(x IS TRUE)'
|
281
|
-
@d.l({:x => Sequel::SQLFALSE}).must_equal '(x IS FALSE)'
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should support negation of SQL::Constants" do
|
285
|
-
@d.l(Sequel.~(:x => Sequel::NULL)).must_equal '(x IS NOT NULL)'
|
286
|
-
@d.l(Sequel.~(:x => Sequel::NOTNULL)).must_equal '(x IS NULL)'
|
287
|
-
@d.l(Sequel.~(:x => Sequel::TRUE)).must_equal '(x IS NOT TRUE)'
|
288
|
-
@d.l(Sequel.~(:x => Sequel::FALSE)).must_equal '(x IS NOT FALSE)'
|
289
|
-
@d.l(Sequel.~(:x => Sequel::SQLTRUE)).must_equal '(x IS NOT TRUE)'
|
290
|
-
@d.l(Sequel.~(:x => Sequel::SQLFALSE)).must_equal '(x IS NOT FALSE)'
|
291
|
-
end
|
292
|
-
|
293
|
-
it "should support direct negation of SQL::Constants" do
|
294
|
-
@d.l({:x => ~Sequel::NULL}).must_equal '(x IS NOT NULL)'
|
295
|
-
@d.l({:x => ~Sequel::NOTNULL}).must_equal '(x IS NULL)'
|
296
|
-
@d.l({:x => ~Sequel::TRUE}).must_equal '(x IS FALSE)'
|
297
|
-
@d.l({:x => ~Sequel::FALSE}).must_equal '(x IS TRUE)'
|
298
|
-
@d.l({:x => ~Sequel::SQLTRUE}).must_equal '(x IS FALSE)'
|
299
|
-
@d.l({:x => ~Sequel::SQLFALSE}).must_equal '(x IS TRUE)'
|
300
|
-
end
|
301
|
-
|
302
|
-
it "should raise an error if trying to invert an invalid SQL::Constant" do
|
303
|
-
proc{~Sequel::CURRENT_DATE}.must_raise(Sequel::Error)
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should raise an error if trying to create an invalid complex expression" do
|
307
|
-
proc{Sequel::SQL::ComplexExpression.new(:BANG, 1, 2)}.must_raise(Sequel::Error)
|
308
|
-
end
|
309
|
-
|
310
|
-
it "should use a string concatentation for + if given a string" do
|
311
|
-
@d.lit(Sequel.expr(:x) + '1').must_equal "(x || '1')"
|
312
|
-
@d.lit(Sequel.expr(:x) + '1' + '1').must_equal "(x || '1' || '1')"
|
313
|
-
end
|
314
|
-
|
315
|
-
it "should use an addition for + if given a literal string" do
|
316
|
-
@d.lit(Sequel.expr(:x) + Sequel.lit('1')).must_equal "(x + 1)"
|
317
|
-
@d.lit(Sequel.expr(:x) + Sequel.lit('1') + Sequel.lit('1')).must_equal "(x + 1 + 1)"
|
318
|
-
end
|
319
|
-
|
320
|
-
it "should use a bitwise operator for & and | if given an integer" do
|
321
|
-
@d.lit(Sequel.expr(:x) & 1).must_equal "(x & 1)"
|
322
|
-
@d.lit(Sequel.expr(:x) | 1).must_equal "(x | 1)"
|
323
|
-
@d.lit(Sequel.expr(:x) & 1 & 1).must_equal "(x & 1 & 1)"
|
324
|
-
@d.lit(Sequel.expr(:x) | 1 | 1).must_equal "(x | 1 | 1)"
|
325
|
-
end
|
326
|
-
|
327
|
-
it "should allow adding a string to an integer expression" do
|
328
|
-
@d.lit(Sequel.expr(:x) + 1 + 'a').must_equal "(x + 1 + 'a')"
|
329
|
-
end
|
330
|
-
|
331
|
-
it "should allow adding an integer to an string expression" do
|
332
|
-
@d.lit(Sequel.expr(:x) + 'a' + 1).must_equal "(x || 'a' || 1)"
|
333
|
-
end
|
334
|
-
|
335
|
-
it "should allow adding a boolean to an integer expression" do
|
336
|
-
@d.lit(Sequel.expr(:x) + 1 + true).must_equal "(x + 1 + 't')"
|
337
|
-
end
|
338
|
-
|
339
|
-
it "should allow adding a boolean to an string expression" do
|
340
|
-
@d.lit(Sequel.expr(:x) + 'a' + true).must_equal "(x || 'a' || 't')"
|
341
|
-
end
|
342
|
-
|
343
|
-
it "should allow using a boolean operation with an integer on an boolean expression" do
|
344
|
-
@d.lit(Sequel.expr(:x) & :a & 1).must_equal "(x AND a AND 1)"
|
345
|
-
end
|
346
|
-
|
347
|
-
it "should allow using a boolean operation with a string on an boolean expression" do
|
348
|
-
@d.lit(Sequel.expr(:x) & :a & 'a').must_equal "(x AND a AND 'a')"
|
349
|
-
end
|
350
|
-
|
351
|
-
it "should allowing AND of boolean expression and literal string" do
|
352
|
-
@d.lit(Sequel.expr(:x) & :a & Sequel.lit('a')).must_equal "(x AND a AND a)"
|
353
|
-
end
|
354
|
-
|
355
|
-
it "should allowing + of integer expression and literal string" do
|
356
|
-
@d.lit(Sequel.expr(:x) + :a + Sequel.lit('a')).must_equal "(x + a + a)"
|
357
|
-
end
|
358
|
-
|
359
|
-
it "should allowing + of string expression and literal string" do
|
360
|
-
@d.lit(Sequel.expr(:x) + 'a' + Sequel.lit('a')).must_equal "(x || 'a' || a)"
|
361
|
-
end
|
362
|
-
|
363
|
-
it "should allow sql_{string,boolean,number} methods on numeric expressions" do
|
364
|
-
@d.lit((Sequel.expr(:x) + 1).sql_string + 'a').must_equal "((x + 1) || 'a')"
|
365
|
-
@d.lit((Sequel.expr(:x) + 1).sql_boolean & 1).must_equal "((x + 1) AND 1)"
|
366
|
-
@d.lit((Sequel.expr(:x) + 1).sql_number + 'a').must_equal "(x + 1 + 'a')"
|
367
|
-
end
|
368
|
-
|
369
|
-
it "should allow sql_{string,boolean,number} methods on string expressions" do
|
370
|
-
@d.lit((Sequel.expr(:x) + 'a').sql_string + 'a').must_equal "(x || 'a' || 'a')"
|
371
|
-
@d.lit((Sequel.expr(:x) + 'a').sql_boolean & 1).must_equal "((x || 'a') AND 1)"
|
372
|
-
@d.lit((Sequel.expr(:x) + 'a').sql_number + 'a').must_equal "((x || 'a') + 'a')"
|
373
|
-
end
|
374
|
-
|
375
|
-
it "should allow sql_{string,boolean,number} methods on boolean expressions" do
|
376
|
-
@d.lit((Sequel.expr(:x) & :y).sql_string + 'a').must_equal "((x AND y) || 'a')"
|
377
|
-
@d.lit((Sequel.expr(:x) & :y).sql_boolean & 1).must_equal "(x AND y AND 1)"
|
378
|
-
@d.lit((Sequel.expr(:x) & :y).sql_number + 'a').must_equal "((x AND y) + 'a')"
|
379
|
-
end
|
380
|
-
|
381
|
-
it "should raise an error if trying to literalize an invalid complex expression" do
|
382
|
-
ce = Sequel.+(:x, 1)
|
383
|
-
ce.instance_variable_set(:@op, :BANG)
|
384
|
-
proc{@d.lit(ce)}.must_raise(Sequel::InvalidOperation)
|
385
|
-
end
|
386
|
-
|
387
|
-
it "should support equality comparison of two expressions" do
|
388
|
-
e1 = ~Sequel.like(:comment, '%:hidden:%')
|
389
|
-
e2 = ~Sequel.like(:comment, '%:hidden:%')
|
390
|
-
e1.must_equal e2
|
391
|
-
end
|
392
|
-
|
393
|
-
it "should support expression filter methods on Datasets" do
|
394
|
-
d = @d.select(:a)
|
395
|
-
|
396
|
-
@d.lit(d + 1).must_equal '((SELECT a FROM items) + 1)'
|
397
|
-
@d.lit(d - 1).must_equal '((SELECT a FROM items) - 1)'
|
398
|
-
@d.lit(d * 1).must_equal '((SELECT a FROM items) * 1)'
|
399
|
-
@d.lit(d / 1).must_equal '((SELECT a FROM items) / 1)'
|
400
|
-
|
401
|
-
@d.lit(d => 1).must_equal '((SELECT a FROM items) = 1)'
|
402
|
-
@d.lit(Sequel.~(d => 1)).must_equal '((SELECT a FROM items) != 1)'
|
403
|
-
@d.lit(d > 1).must_equal '((SELECT a FROM items) > 1)'
|
404
|
-
@d.lit(d < 1).must_equal '((SELECT a FROM items) < 1)'
|
405
|
-
@d.lit(d >= 1).must_equal '((SELECT a FROM items) >= 1)'
|
406
|
-
@d.lit(d <= 1).must_equal '((SELECT a FROM items) <= 1)'
|
407
|
-
|
408
|
-
@d.lit(d.as(:b)).must_equal '(SELECT a FROM items) AS b'
|
409
|
-
|
410
|
-
@d.lit(d & :b).must_equal '((SELECT a FROM items) AND b)'
|
411
|
-
@d.lit(d | :b).must_equal '((SELECT a FROM items) OR b)'
|
412
|
-
@d.lit(~d).must_equal 'NOT (SELECT a FROM items)'
|
413
|
-
|
414
|
-
@d.lit(d.cast(Integer)).must_equal 'CAST((SELECT a FROM items) AS integer)'
|
415
|
-
@d.lit(d.cast_numeric).must_equal 'CAST((SELECT a FROM items) AS integer)'
|
416
|
-
@d.lit(d.cast_string).must_equal 'CAST((SELECT a FROM items) AS varchar(255))'
|
417
|
-
@d.lit(d.cast_numeric << :b).must_equal '(CAST((SELECT a FROM items) AS integer) << b)'
|
418
|
-
@d.lit(d.cast_string + :b).must_equal '(CAST((SELECT a FROM items) AS varchar(255)) || b)'
|
419
|
-
|
420
|
-
@d.lit(d.extract(:year)).must_equal 'extract(year FROM (SELECT a FROM items))'
|
421
|
-
@d.lit(d.sql_boolean & :b).must_equal '((SELECT a FROM items) AND b)'
|
422
|
-
@d.lit(d.sql_number << :b).must_equal '((SELECT a FROM items) << b)'
|
423
|
-
@d.lit(d.sql_string + :b).must_equal '((SELECT a FROM items) || b)'
|
424
|
-
|
425
|
-
@d.lit(d.asc).must_equal '(SELECT a FROM items) ASC'
|
426
|
-
@d.lit(d.desc).must_equal '(SELECT a FROM items) DESC'
|
427
|
-
|
428
|
-
@d.lit(d.like(:b)).must_equal '((SELECT a FROM items) LIKE b ESCAPE \'\\\')'
|
429
|
-
@d.lit(d.ilike(:b)).must_equal '(UPPER((SELECT a FROM items)) LIKE UPPER(b) ESCAPE \'\\\')'
|
430
|
-
end
|
431
|
-
|
432
|
-
it "should handled emulated char_length function" do
|
433
|
-
@d.lit(Sequel.char_length(:a)).must_equal 'char_length(a)'
|
434
|
-
end
|
435
|
-
|
436
|
-
it "should handled emulated trim function" do
|
437
|
-
@d.lit(Sequel.trim(:a)).must_equal 'trim(a)'
|
438
|
-
end
|
439
|
-
|
440
|
-
it "should handled emulated function where only name is emulated" do
|
441
|
-
dsc = Class.new(Sequel::Dataset)
|
442
|
-
efm = dsc::EMULATED_FUNCTION_MAP.dup
|
443
|
-
dsc::EMULATED_FUNCTION_MAP[:trim] = :foo
|
444
|
-
dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'foo(a)'
|
445
|
-
dsc::EMULATED_FUNCTION_MAP.replace(efm)
|
446
|
-
end
|
447
|
-
|
448
|
-
it "should handled emulated function needing full emulation" do
|
449
|
-
dsc = Class.new(Sequel::Dataset) do
|
450
|
-
def emulate_function?(n) n == :trim end
|
451
|
-
def emulate_function_sql_append(sql, f)
|
452
|
-
sql << "#{f.name}FOO(lower(#{f.args.first}))"
|
453
|
-
end
|
454
|
-
end
|
455
|
-
dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'trimFOO(lower(a))'
|
456
|
-
end
|
457
|
-
end
|
458
|
-
|
459
|
-
describe Sequel::SQL::VirtualRow do
|
460
|
-
before do
|
461
|
-
db = Sequel::Database.new
|
462
|
-
db.quote_identifiers = true
|
463
|
-
@d = db[:items]
|
464
|
-
meta_def(@d, :supports_window_functions?){true}
|
465
|
-
def @d.l(*args, &block)
|
466
|
-
literal(filter_expr(*args, &block))
|
467
|
-
end
|
468
|
-
end
|
469
|
-
|
470
|
-
it "should treat methods without arguments as identifiers" do
|
471
|
-
@d.l{column}.must_equal '"column"'
|
472
|
-
end
|
473
|
-
|
474
|
-
it "should treat methods without arguments that have embedded double underscores as qualified identifiers" do
|
475
|
-
@d.l{table__column}.must_equal '"table"."column"'
|
476
|
-
end
|
477
|
-
|
478
|
-
it "should treat methods with arguments as functions with the arguments" do
|
479
|
-
@d.l{function(arg1, 10, 'arg3')}.must_equal 'function("arg1", 10, \'arg3\')'
|
480
|
-
end
|
481
|
-
|
482
|
-
it "should treat methods with a block and no arguments as a function call with no arguments" do
|
483
|
-
@d.l{version{}}.must_equal 'version()'
|
484
|
-
end
|
485
|
-
|
486
|
-
it "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
|
487
|
-
@d.l{count(:*){}}.must_equal 'count(*)'
|
488
|
-
end
|
489
|
-
|
490
|
-
it "should support * method on functions to raise error if function already has an argument" do
|
491
|
-
proc{@d.l{count(1).*}}.must_raise(Sequel::Error)
|
492
|
-
end
|
493
|
-
|
494
|
-
it "should support * method on functions to use * as the argument" do
|
495
|
-
@d.l{count{}.*}.must_equal 'count(*)'
|
496
|
-
@d.literal(Sequel.expr{sum(1) * 2}).must_equal '(sum(1) * 2)'
|
497
|
-
end
|
498
|
-
|
499
|
-
it "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
|
500
|
-
@d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
|
501
|
-
@d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
|
502
|
-
end
|
503
|
-
|
504
|
-
it "should support distinct methods on functions to use DISTINCT before the arguments" do
|
505
|
-
@d.l{count(column1).distinct}.must_equal 'count(DISTINCT "column1")'
|
506
|
-
@d.l{count(column1, column2).distinct}.must_equal 'count(DISTINCT "column1", "column2")'
|
507
|
-
end
|
508
|
-
|
509
|
-
it "should raise an error if an unsupported argument is used with a block" do
|
510
|
-
proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
|
511
|
-
end
|
512
|
-
|
513
|
-
it "should treat methods with a block and a leading argument :over as a window function call" do
|
514
|
-
@d.l{rank(:over){}}.must_equal 'rank() OVER ()'
|
515
|
-
end
|
516
|
-
|
517
|
-
it "should support :partition options for window function calls" do
|
518
|
-
@d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
|
519
|
-
@d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
|
520
|
-
end
|
521
|
-
|
522
|
-
it "should support :args options for window function calls" do
|
523
|
-
@d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
|
524
|
-
@d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
|
525
|
-
end
|
526
|
-
|
527
|
-
it "should support :order option for window function calls" do
|
528
|
-
@d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
|
529
|
-
@d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
|
530
|
-
end
|
531
|
-
|
532
|
-
it "should support :window option for window function calls" do
|
533
|
-
@d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
|
534
|
-
end
|
535
|
-
|
536
|
-
it "should support :*=>true option for window function calls" do
|
537
|
-
@d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
|
538
|
-
end
|
539
|
-
|
540
|
-
it "should support :frame=>:all option for window function calls" do
|
541
|
-
@d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
|
542
|
-
end
|
543
|
-
|
544
|
-
it "should support :frame=>:rows option for window function calls" do
|
545
|
-
@d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
546
|
-
end
|
547
|
-
|
548
|
-
it "should support :frame=>'some string' option for window function calls" do
|
549
|
-
@d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
|
550
|
-
end
|
551
|
-
|
552
|
-
it "should raise an error if an invalid :frame option is used" do
|
553
|
-
proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
|
554
|
-
end
|
555
|
-
|
556
|
-
it "should support all these options together" do
|
557
|
-
@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)'
|
558
|
-
end
|
559
|
-
|
560
|
-
it "should support order method on functions to specify orders for aggregate functions" do
|
561
|
-
@d.l{rank(:c).order(:a, :b)}.must_equal 'rank("c" ORDER BY "a", "b")'
|
562
|
-
end
|
563
|
-
|
564
|
-
it "should support over method on functions to create window functions" do
|
565
|
-
@d.l{rank{}.over}.must_equal 'rank() OVER ()'
|
566
|
-
@d.l{sum(c).over(:partition=>a, :order=>b, :window=>:win, :frame=>:rows)}.must_equal 'sum("c") OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
567
|
-
end
|
568
|
-
|
569
|
-
it "should support over method with a Window argument" do
|
570
|
-
@d.l{sum(c).over(Sequel::SQL::Window.new(:partition=>a, :order=>b, :window=>:win, :frame=>:rows))}.must_equal 'sum("c") OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
571
|
-
end
|
572
|
-
|
573
|
-
it "should raise error if over is called on a function that already has a window " do
|
574
|
-
proc{@d.l{rank{}.over.over}}.must_raise(Sequel::Error)
|
575
|
-
end
|
576
|
-
|
577
|
-
it "should raise an error if window functions are not supported" do
|
578
|
-
class << @d; remove_method :supports_window_functions? end
|
579
|
-
meta_def(@d, :supports_window_functions?){false}
|
580
|
-
proc{@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
|
581
|
-
proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
|
582
|
-
end
|
583
|
-
|
584
|
-
it "should handle lateral function calls" do
|
585
|
-
@d.l{rank{}.lateral}.must_equal 'LATERAL rank()'
|
586
|
-
end
|
587
|
-
|
588
|
-
it "should handle ordered-set and hypothetical-set function calls" do
|
589
|
-
@d.l{mode{}.within_group(:a)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a")'
|
590
|
-
@d.l{mode{}.within_group(:a, :b)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a", "b")'
|
591
|
-
end
|
592
|
-
|
593
|
-
it "should handle filtered aggregate function calls" do
|
594
|
-
@d.l{count{}.*.filter(:a, :b)}.must_equal 'count(*) FILTER (WHERE ("a" AND "b"))'
|
595
|
-
@d.l{count{}.*.filter(:a=>1)}.must_equal 'count(*) FILTER (WHERE ("a" = 1))'
|
596
|
-
@d.l{count{}.*.filter{b > 1}}.must_equal 'count(*) FILTER (WHERE ("b" > 1))'
|
597
|
-
@d.l{count{}.*.filter(:a=>1){b > 1}}.must_equal 'count(*) FILTER (WHERE (("a" = 1) AND ("b" > 1)))'
|
598
|
-
end
|
599
|
-
|
600
|
-
it "should handle fitlered ordered-set and hypothetical-set function calls" do
|
601
|
-
@d.l{mode{}.within_group(:a).filter(:a=>1)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a") FILTER (WHERE ("a" = 1))'
|
602
|
-
end
|
603
|
-
|
604
|
-
it "should handle function calls with ordinality" do
|
605
|
-
@d.l{foo{}.with_ordinality}.must_equal 'foo() WITH ORDINALITY'
|
606
|
-
end
|
607
|
-
|
608
|
-
it "should support function method on identifiers to create functions" do
|
609
|
-
@d.l{rank.function}.must_equal 'rank()'
|
610
|
-
@d.l{sum.function(c)}.must_equal 'sum("c")'
|
611
|
-
@d.l{sum.function(c, 1)}.must_equal 'sum("c", 1)'
|
612
|
-
end
|
613
|
-
|
614
|
-
it "should support function method on qualified identifiers to create functions" do
|
615
|
-
@d.l{sch__rank.function}.must_equal 'sch.rank()'
|
616
|
-
@d.l{sch__sum.function(c)}.must_equal 'sch.sum("c")'
|
617
|
-
@d.l{sch__sum.function(c, 1)}.must_equal 'sch.sum("c", 1)'
|
618
|
-
@d.l{Sequel.qualify(sch__sum, :x__y).function(c, 1)}.must_equal 'sch.sum.x.y("c", 1)'
|
619
|
-
end
|
620
|
-
|
621
|
-
it "should handle quoted function names" do
|
622
|
-
def @d.supports_quoted_function_names?; true; end
|
623
|
-
@d.l{rank.function}.must_equal '"rank"()'
|
624
|
-
@d.l{sch__rank.function}.must_equal '"sch"."rank"()'
|
625
|
-
end
|
626
|
-
|
627
|
-
it "should quote function names if a quoted function is used and database supports quoted function names" do
|
628
|
-
def @d.supports_quoted_function_names?; true; end
|
629
|
-
@d.l{rank{}.quoted}.must_equal '"rank"()'
|
630
|
-
@d.l{sch__rank{}.quoted}.must_equal '"sch__rank"()'
|
631
|
-
end
|
632
|
-
|
633
|
-
it "should not quote function names if an unquoted function is used" do
|
634
|
-
def @d.supports_quoted_function_names?; true; end
|
635
|
-
@d.l{rank.function.unquoted}.must_equal 'rank()'
|
636
|
-
@d.l{sch__rank.function.unquoted}.must_equal 'sch.rank()'
|
637
|
-
end
|
638
|
-
|
639
|
-
it "should deal with classes without requiring :: prefix" do
|
640
|
-
@d.l{date < Date.today}.must_equal "(\"date\" < '#{Date.today}')"
|
641
|
-
@d.l{date < Sequel::CURRENT_DATE}.must_equal "(\"date\" < CURRENT_DATE)"
|
642
|
-
@d.l{num < Math::PI.to_i}.must_equal "(\"num\" < 3)"
|
643
|
-
end
|
644
|
-
|
645
|
-
it "should deal with methods added to Object after requiring Sequel" do
|
646
|
-
class Object
|
647
|
-
def adsoiwemlsdaf; 42; end
|
648
|
-
end
|
649
|
-
Sequel::BasicObject.remove_methods!
|
650
|
-
@d.l{a > adsoiwemlsdaf}.must_equal '("a" > "adsoiwemlsdaf")'
|
651
|
-
end
|
652
|
-
|
653
|
-
it "should deal with private methods added to Kernel after requiring Sequel" do
|
654
|
-
module Kernel
|
655
|
-
private
|
656
|
-
def adsoiwemlsdaf2; 42; end
|
657
|
-
end
|
658
|
-
Sequel::BasicObject.remove_methods!
|
659
|
-
@d.l{a > adsoiwemlsdaf2}.must_equal '("a" > "adsoiwemlsdaf2")'
|
660
|
-
end
|
661
|
-
|
662
|
-
it "should have operator methods defined that produce Sequel expression objects" do
|
663
|
-
@d.l{|o| o.&({:a=>1}, :b)}.must_equal '(("a" = 1) AND "b")'
|
664
|
-
@d.l{|o| o.|({:a=>1}, :b)}.must_equal '(("a" = 1) OR "b")'
|
665
|
-
@d.l{|o| o.+(1, :b) > 2}.must_equal '((1 + "b") > 2)'
|
666
|
-
@d.l{|o| o.-(1, :b) < 2}.must_equal '((1 - "b") < 2)'
|
667
|
-
@d.l{|o| o.*(1, :b) >= 2}.must_equal '((1 * "b") >= 2)'
|
668
|
-
@d.l{|o| o./(1, :b) <= 2}.must_equal '((1 / "b") <= 2)'
|
669
|
-
@d.l{|o| o.~(:a=>1)}.must_equal '("a" != 1)'
|
670
|
-
@d.l{|o| o.~([[:a, 1], [:b, 2]])}.must_equal '(("a" != 1) OR ("b" != 2))'
|
671
|
-
@d.l{|o| o.<(1, :b)}.must_equal '(1 < "b")'
|
672
|
-
@d.l{|o| o.>(1, :b)}.must_equal '(1 > "b")'
|
673
|
-
@d.l{|o| o.<=(1, :b)}.must_equal '(1 <= "b")'
|
674
|
-
@d.l{|o| o.>=(1, :b)}.must_equal '(1 >= "b")'
|
675
|
-
end
|
676
|
-
|
677
|
-
it "should have have ` produce literal strings" do
|
678
|
-
@d.l{a > `some SQL`}.must_equal '("a" > some SQL)'
|
679
|
-
@d.l{|o| o.a > o.`('some SQL')}.must_equal '("a" > some SQL)' #`
|
680
|
-
end
|
681
|
-
end
|
682
|
-
|
683
|
-
describe "Sequel core extension replacements" do
|
684
|
-
before do
|
685
|
-
@db = Sequel::Database.new
|
686
|
-
@ds = @db.dataset
|
687
|
-
def @ds.supports_regexp?; true end
|
688
|
-
@o = Object.new
|
689
|
-
def @o.sql_literal(ds) 'foo' end
|
690
|
-
end
|
691
|
-
|
692
|
-
def l(arg, should)
|
693
|
-
@ds.literal(arg).must_equal should
|
694
|
-
end
|
695
|
-
|
696
|
-
it "Sequel.expr should return items wrapped in Sequel objects" do
|
697
|
-
Sequel.expr(1).must_be_kind_of(Sequel::SQL::NumericExpression)
|
698
|
-
Sequel.expr('a').must_be_kind_of(Sequel::SQL::StringExpression)
|
699
|
-
Sequel.expr(true).must_be_kind_of(Sequel::SQL::BooleanExpression)
|
700
|
-
Sequel.expr(nil).must_be_kind_of(Sequel::SQL::Wrapper)
|
701
|
-
Sequel.expr({1=>2}).must_be_kind_of(Sequel::SQL::BooleanExpression)
|
702
|
-
Sequel.expr([[1, 2]]).must_be_kind_of(Sequel::SQL::BooleanExpression)
|
703
|
-
Sequel.expr([1]).must_be_kind_of(Sequel::SQL::Wrapper)
|
704
|
-
Sequel.expr{|o| o.a}.must_be_kind_of(Sequel::SQL::Identifier)
|
705
|
-
Sequel.expr{a}.must_be_kind_of(Sequel::SQL::Identifier)
|
706
|
-
Sequel.expr(:a).must_be_kind_of(Sequel::SQL::Identifier)
|
707
|
-
Sequel.expr(:a__b).must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
|
708
|
-
Sequel.expr(:a___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
|
709
|
-
Sequel.expr(:a___c).expression.must_be_kind_of(Sequel::SQL::Identifier)
|
710
|
-
Sequel.expr(:a__b___c).must_be_kind_of(Sequel::SQL::AliasedExpression)
|
711
|
-
Sequel.expr(:a__b___c).expression.must_be_kind_of(Sequel::SQL::QualifiedIdentifier)
|
712
|
-
end
|
713
|
-
|
714
|
-
it "Sequel.expr should return an appropriate wrapped object" do
|
715
|
-
l(Sequel.expr(1) + 1, "(1 + 1)")
|
716
|
-
l(Sequel.expr('a') + 'b', "('a' || 'b')")
|
717
|
-
l(Sequel.expr(:b) & nil, "(b AND NULL)")
|
718
|
-
l(Sequel.expr(nil) & true, "(NULL AND 't')")
|
719
|
-
l(Sequel.expr(false) & true, "('f' AND 't')")
|
720
|
-
l(Sequel.expr(true) | false, "('t' OR 'f')")
|
721
|
-
l(Sequel.expr(@o) + 1, "(foo + 1)")
|
722
|
-
end
|
723
|
-
|
724
|
-
it "Sequel.expr should handle condition specifiers" do
|
725
|
-
l(Sequel.expr(:a=>1) & nil, "((a = 1) AND NULL)")
|
726
|
-
l(Sequel.expr([[:a, 1]]) & nil, "((a = 1) AND NULL)")
|
727
|
-
l(Sequel.expr([[:a, 1], [:b, 2]]) & nil, "((a = 1) AND (b = 2) AND NULL)")
|
728
|
-
end
|
729
|
-
|
730
|
-
it "Sequel.expr should handle arrays that are not condition specifiers" do
|
731
|
-
l(Sequel.expr([1]), "(1)")
|
732
|
-
l(Sequel.expr([1, 2]), "(1, 2)")
|
733
|
-
end
|
734
|
-
|
735
|
-
it "Sequel.expr should treat blocks/procs as virtual rows and wrap the output" do
|
736
|
-
l(Sequel.expr{1} + 1, "(1 + 1)")
|
737
|
-
l(Sequel.expr{o__a} + 1, "(o.a + 1)")
|
738
|
-
l(Sequel.expr{[[:a, 1]]} & nil, "((a = 1) AND NULL)")
|
739
|
-
l(Sequel.expr{|v| @o} + 1, "(foo + 1)")
|
740
|
-
|
741
|
-
l(Sequel.expr(proc{1}) + 1, "(1 + 1)")
|
742
|
-
l(Sequel.expr(proc{o__a}) + 1, "(o.a + 1)")
|
743
|
-
l(Sequel.expr(proc{[[:a, 1]]}) & nil, "((a = 1) AND NULL)")
|
744
|
-
l(Sequel.expr(proc{|v| @o}) + 1, "(foo + 1)")
|
745
|
-
end
|
746
|
-
|
747
|
-
it "Sequel.expr should handle lambda proc virtual rows" do
|
748
|
-
l(Sequel.expr(&lambda{1}), "1")
|
749
|
-
l(Sequel.expr(&lambda{|| 1}), "1")
|
750
|
-
end
|
751
|
-
|
752
|
-
it "Sequel.expr should raise an error if given an argument and a block" do
|
753
|
-
proc{Sequel.expr(nil){}}.must_raise(Sequel::Error)
|
754
|
-
end
|
755
|
-
|
756
|
-
it "Sequel.expr should raise an error if given neither an argument nor a block" do
|
757
|
-
proc{Sequel.expr}.must_raise(Sequel::Error)
|
758
|
-
end
|
759
|
-
|
760
|
-
it "Sequel.expr should return existing Sequel expressions directly" do
|
761
|
-
o = Sequel.expr(1)
|
762
|
-
Sequel.expr(o).must_be_same_as(o)
|
763
|
-
o = Sequel.lit('1')
|
764
|
-
Sequel.expr(o).must_be_same_as(o)
|
765
|
-
end
|
766
|
-
|
767
|
-
it "Sequel.~ should invert the given object" do
|
768
|
-
l(Sequel.~(nil), 'NOT NULL')
|
769
|
-
l(Sequel.~(:a=>1), "(a != 1)")
|
770
|
-
l(Sequel.~([[:a, 1]]), "(a != 1)")
|
771
|
-
l(Sequel.~([[:a, 1], [:b, 2]]), "((a != 1) OR (b != 2))")
|
772
|
-
l(Sequel.~(Sequel.expr([[:a, 1], [:b, 2]]) & nil), "((a != 1) OR (b != 2) OR NOT NULL)")
|
773
|
-
end
|
774
|
-
|
775
|
-
it "Sequel.case should use a CASE expression" do
|
776
|
-
l(Sequel.case({:a=>1}, 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
|
777
|
-
l(Sequel.case({:a=>1}, 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
|
778
|
-
l(Sequel.case([[:a, 1]], 2), "(CASE WHEN a THEN 1 ELSE 2 END)")
|
779
|
-
l(Sequel.case([[:a, 1]], 2, :b), "(CASE b WHEN a THEN 1 ELSE 2 END)")
|
780
|
-
l(Sequel.case([[:a, 1], [:c, 3]], 2), "(CASE WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
|
781
|
-
l(Sequel.case([[:a, 1], [:c, 3]], 2, :b), "(CASE b WHEN a THEN 1 WHEN c THEN 3 ELSE 2 END)")
|
782
|
-
end
|
783
|
-
|
784
|
-
it "Sequel.case should raise an error if not given a condition specifier" do
|
785
|
-
proc{Sequel.case(1, 2)}.must_raise(Sequel::Error)
|
786
|
-
end
|
787
|
-
|
788
|
-
it "Sequel.value_list should use an SQL value list" do
|
789
|
-
l(Sequel.value_list([[1, 2]]), "((1, 2))")
|
790
|
-
end
|
791
|
-
|
792
|
-
it "Sequel.value_list raise an error if not given an array" do
|
793
|
-
proc{Sequel.value_list(1)}.must_raise(Sequel::Error)
|
794
|
-
end
|
795
|
-
|
796
|
-
it "Sequel.negate should negate all entries in conditions specifier and join with AND" do
|
797
|
-
l(Sequel.negate(:a=>1), "(a != 1)")
|
798
|
-
l(Sequel.negate([[:a, 1]]), "(a != 1)")
|
799
|
-
l(Sequel.negate([[:a, 1], [:b, 2]]), "((a != 1) AND (b != 2))")
|
800
|
-
end
|
801
|
-
|
802
|
-
it "Sequel.negate should raise an error if not given a conditions specifier" do
|
803
|
-
proc{Sequel.negate(1)}.must_raise(Sequel::Error)
|
804
|
-
end
|
805
|
-
|
806
|
-
it "Sequel.or should join all entries in conditions specifier with OR" do
|
807
|
-
l(Sequel.or(:a=>1), "(a = 1)")
|
808
|
-
l(Sequel.or([[:a, 1]]), "(a = 1)")
|
809
|
-
l(Sequel.or([[:a, 1], [:b, 2]]), "((a = 1) OR (b = 2))")
|
810
|
-
end
|
811
|
-
|
812
|
-
it "Sequel.or should raise an error if not given a conditions specifier" do
|
813
|
-
proc{Sequel.or(1)}.must_raise(Sequel::Error)
|
814
|
-
end
|
815
|
-
|
816
|
-
it "Sequel.join should should use SQL string concatenation to join array" do
|
817
|
-
l(Sequel.join([]), "''")
|
818
|
-
l(Sequel.join(['a']), "('a')")
|
819
|
-
l(Sequel.join(['a', 'b']), "('a' || 'b')")
|
820
|
-
l(Sequel.join(['a', 'b'], 'c'), "('a' || 'c' || 'b')")
|
821
|
-
l(Sequel.join([true, :b], :c), "('t' || c || b)")
|
822
|
-
l(Sequel.join([false, nil], Sequel.lit('c')), "('f' || c || NULL)")
|
823
|
-
l(Sequel.join([Sequel.expr('a'), Sequel.lit('d')], 'c'), "('a' || 'c' || d)")
|
824
|
-
end
|
825
|
-
|
826
|
-
it "Sequel.join should raise an error if not given an array" do
|
827
|
-
proc{Sequel.join(1)}.must_raise(Sequel::Error)
|
828
|
-
end
|
829
|
-
|
830
|
-
it "Sequel.& should join all arguments given with AND" do
|
831
|
-
l(Sequel.&(:a), "a")
|
832
|
-
l(Sequel.&(:a, :b=>:c), "(a AND (b = c))")
|
833
|
-
l(Sequel.&(:a, {:b=>:c}, Sequel.lit('d')), "(a AND (b = c) AND d)")
|
834
|
-
end
|
835
|
-
|
836
|
-
it "Sequel.& should raise an error if given no arguments" do
|
837
|
-
proc{Sequel.&}.must_raise(Sequel::Error)
|
838
|
-
end
|
839
|
-
|
840
|
-
it "Sequel.| should join all arguments given with OR" do
|
841
|
-
l(Sequel.|(:a), "a")
|
842
|
-
l(Sequel.|(:a, :b=>:c), "(a OR (b = c))")
|
843
|
-
l(Sequel.|(:a, {:b=>:c}, Sequel.lit('d')), "(a OR (b = c) OR d)")
|
844
|
-
end
|
845
|
-
|
846
|
-
it "Sequel.| should raise an error if given no arguments" do
|
847
|
-
proc{Sequel.|}.must_raise(Sequel::Error)
|
848
|
-
end
|
849
|
-
|
850
|
-
it "Sequel.as should return an aliased expression" do
|
851
|
-
l(Sequel.as(:a, :b), "a AS b")
|
852
|
-
end
|
853
|
-
|
854
|
-
it "Sequel.cast should return a CAST expression" do
|
855
|
-
l(Sequel.cast(:a, :int), "CAST(a AS int)")
|
856
|
-
l(Sequel.cast(:a, Integer), "CAST(a AS integer)")
|
857
|
-
end
|
858
|
-
|
859
|
-
it "Sequel.cast_numeric should return a CAST expression treated as a number" do
|
860
|
-
l(Sequel.cast_numeric(:a), "CAST(a AS integer)")
|
861
|
-
l(Sequel.cast_numeric(:a, :int), "CAST(a AS int)")
|
862
|
-
l(Sequel.cast_numeric(:a) << 2, "(CAST(a AS integer) << 2)")
|
863
|
-
end
|
864
|
-
|
865
|
-
it "Sequel.cast_string should return a CAST expression treated as a string" do
|
866
|
-
l(Sequel.cast_string(:a), "CAST(a AS varchar(255))")
|
867
|
-
l(Sequel.cast_string(:a, :text), "CAST(a AS text)")
|
868
|
-
l(Sequel.cast_string(:a) + 'a', "(CAST(a AS varchar(255)) || 'a')")
|
869
|
-
end
|
870
|
-
|
871
|
-
it "Sequel.lit should return a literal string" do
|
872
|
-
l(Sequel.lit('a'), "a")
|
873
|
-
end
|
874
|
-
|
875
|
-
it "Sequel.lit should return the argument if given a single literal string" do
|
876
|
-
o = Sequel.lit('a')
|
877
|
-
Sequel.lit(o).must_be_same_as(o)
|
878
|
-
end
|
879
|
-
|
880
|
-
it "Sequel.lit should accept multiple arguments for a placeholder literal string" do
|
881
|
-
l(Sequel.lit('a = ?', 1), "a = 1")
|
882
|
-
l(Sequel.lit('? = ?', :a, 1), "a = 1")
|
883
|
-
l(Sequel.lit('a = :a', :a=>1), "a = 1")
|
884
|
-
end
|
885
|
-
|
886
|
-
it "Sequel.lit should work with an array for the placeholder string" do
|
887
|
-
l(Sequel.lit(['a = '], 1), "a = 1")
|
888
|
-
l(Sequel.lit(['', ' = '], :a, 1), "a = 1")
|
889
|
-
end
|
890
|
-
|
891
|
-
it "Sequel.blob should return an SQL::Blob" do
|
892
|
-
l(Sequel.blob('a'), "'a'")
|
893
|
-
Sequel.blob('a').must_be_kind_of(Sequel::SQL::Blob)
|
894
|
-
end
|
895
|
-
|
896
|
-
it "Sequel.blob should return the given argument if given a blob" do
|
897
|
-
o = Sequel.blob('a')
|
898
|
-
Sequel.blob(o).must_be_same_as(o)
|
899
|
-
end
|
900
|
-
|
901
|
-
it "Sequel.deep_qualify should do a deep qualification into nested structors" do
|
902
|
-
l(Sequel.deep_qualify(:t, Sequel.+(:c, 1)), "(t.c + 1)")
|
903
|
-
end
|
904
|
-
|
905
|
-
it "Sequel.qualify should return a qualified identifier" do
|
906
|
-
l(Sequel.qualify(:t, :c), "t.c")
|
907
|
-
end
|
908
|
-
|
909
|
-
it "Sequel.identifier should return an identifier" do
|
910
|
-
l(Sequel.identifier(:t__c), "t__c")
|
911
|
-
end
|
912
|
-
|
913
|
-
it "Sequel.asc should return an ASC ordered expression" do
|
914
|
-
l(Sequel.asc(:a), "a ASC")
|
915
|
-
l(Sequel.asc(:a, :nulls=>:first), "a ASC NULLS FIRST")
|
916
|
-
end
|
917
|
-
|
918
|
-
it "Sequel.desc should return a DESC ordered expression " do
|
919
|
-
l(Sequel.desc(:a), "a DESC")
|
920
|
-
l(Sequel.desc(:a, :nulls=>:last), "a DESC NULLS LAST")
|
921
|
-
end
|
922
|
-
|
923
|
-
it "Sequel.{+,-,*,/} should accept arguments and use the appropriate operator" do
|
924
|
-
%w'+ - * /'.each do |op|
|
925
|
-
l(Sequel.send(op, 1), '1')
|
926
|
-
l(Sequel.send(op, 1, 2), "(1 #{op} 2)")
|
927
|
-
l(Sequel.send(op, 1, 2, 3), "(1 #{op} 2 #{op} 3)")
|
928
|
-
end
|
929
|
-
end
|
930
|
-
|
931
|
-
it "Sequel.{+,-,*,/} should raise if given no arguments" do
|
932
|
-
%w'+ - * /'.each do |op|
|
933
|
-
proc{Sequel.send(op)}.must_raise(Sequel::Error)
|
934
|
-
end
|
935
|
-
end
|
936
|
-
|
937
|
-
it "Sequel.like should use a LIKE expression" do
|
938
|
-
l(Sequel.like('a', 'b'), "('a' LIKE 'b' ESCAPE '\\')")
|
939
|
-
l(Sequel.like(:a, :b), "(a LIKE b ESCAPE '\\')")
|
940
|
-
l(Sequel.like(:a, /b/), "(a ~ 'b')")
|
941
|
-
l(Sequel.like(:a, 'c', /b/), "((a LIKE 'c' ESCAPE '\\') OR (a ~ 'b'))")
|
942
|
-
end
|
943
|
-
|
944
|
-
it "Sequel.ilike should use an ILIKE expression" do
|
945
|
-
l(Sequel.ilike('a', 'b'), "(UPPER('a') LIKE UPPER('b') ESCAPE '\\')")
|
946
|
-
l(Sequel.ilike(:a, :b), "(UPPER(a) LIKE UPPER(b) ESCAPE '\\')")
|
947
|
-
l(Sequel.ilike(:a, /b/), "(a ~* 'b')")
|
948
|
-
l(Sequel.ilike(:a, 'c', /b/), "((UPPER(a) LIKE UPPER('c') ESCAPE '\\') OR (a ~* 'b'))")
|
949
|
-
end
|
950
|
-
|
951
|
-
it "Sequel.subscript should use an SQL subscript" do
|
952
|
-
l(Sequel.subscript(:a, 1), 'a[1]')
|
953
|
-
l(Sequel.subscript(:a, 1, 2), 'a[1, 2]')
|
954
|
-
l(Sequel.subscript(:a, [1, 2]), 'a[1, 2]')
|
955
|
-
l(Sequel.subscript(:a, 1..2), 'a[1:2]')
|
956
|
-
l(Sequel.subscript(:a, 1...3), 'a[1:2]')
|
957
|
-
end
|
958
|
-
|
959
|
-
it "Sequel.function should return an SQL function" do
|
960
|
-
l(Sequel.function(:a), 'a()')
|
961
|
-
l(Sequel.function(:a, 1), 'a(1)')
|
962
|
-
l(Sequel.function(:a, :b, 2), 'a(b, 2)')
|
963
|
-
end
|
964
|
-
|
965
|
-
it "Sequel.extract should use a date/time extraction" do
|
966
|
-
l(Sequel.extract(:year, :a), 'extract(year FROM a)')
|
967
|
-
end
|
968
|
-
|
969
|
-
it "#* with no arguments should use a ColumnAll for Identifier and QualifiedIdentifier" do
|
970
|
-
l(Sequel.expr(:a).*, 'a.*')
|
971
|
-
l(Sequel.expr(:a__b).*, 'a.b.*')
|
972
|
-
end
|
973
|
-
|
974
|
-
it "SQL::Blob should be aliasable and castable by default" do
|
975
|
-
b = Sequel.blob('a')
|
976
|
-
l(b.as(:a), "'a' AS a")
|
977
|
-
l(b.cast(Integer), "CAST('a' AS integer)")
|
978
|
-
end
|
979
|
-
|
980
|
-
it "SQL::Blob should be convertable to a literal string by default" do
|
981
|
-
b = Sequel.blob('a ?')
|
982
|
-
l(b.lit, "a ?")
|
983
|
-
l(b.lit(1), "a 1")
|
984
|
-
end
|
985
|
-
end
|
986
|
-
|
987
|
-
describe "Sequel::SQL::Function#==" do
|
988
|
-
it "should be true for functions with the same name and arguments, false otherwise" do
|
989
|
-
a = Sequel.function(:date, :t)
|
990
|
-
b = Sequel.function(:date, :t)
|
991
|
-
a.must_equal b
|
992
|
-
(a == b).must_equal true
|
993
|
-
c = Sequel.function(:date, :c)
|
994
|
-
a.wont_equal c
|
995
|
-
(a == c).must_equal false
|
996
|
-
d = Sequel.function(:time, :c)
|
997
|
-
a.wont_equal d
|
998
|
-
c.wont_equal d
|
999
|
-
(a == d).must_equal false
|
1000
|
-
(c == d).must_equal false
|
1001
|
-
end
|
1002
|
-
end
|
1003
|
-
|
1004
|
-
describe "Sequel::SQL::OrderedExpression" do
|
1005
|
-
it "should #desc" do
|
1006
|
-
@oe = Sequel.asc(:column)
|
1007
|
-
@oe.descending.must_equal false
|
1008
|
-
@oe.desc.descending.must_equal true
|
1009
|
-
end
|
1010
|
-
|
1011
|
-
it "should #asc" do
|
1012
|
-
@oe = Sequel.desc(:column)
|
1013
|
-
@oe.descending.must_equal true
|
1014
|
-
@oe.asc.descending.must_equal false
|
1015
|
-
end
|
1016
|
-
|
1017
|
-
it "should #invert" do
|
1018
|
-
@oe = Sequel.desc(:column)
|
1019
|
-
@oe.invert.descending.must_equal false
|
1020
|
-
@oe.invert.invert.descending.must_equal true
|
1021
|
-
end
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
describe "Expression" do
|
1025
|
-
it "should consider objects == only if they have the same attributes" do
|
1026
|
-
Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
|
1027
|
-
Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
|
1028
|
-
|
1029
|
-
Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.must_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
|
1030
|
-
Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.wont_equal(Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc)
|
1031
|
-
end
|
1032
|
-
|
1033
|
-
it "should use the same hash value for objects that have the same attributes" do
|
1034
|
-
Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash.must_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
|
1035
|
-
Sequel.qualify(:table, :other_column).cast(:type).*(:numeric_column).asc.hash.wont_equal Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc.hash
|
1036
|
-
|
1037
|
-
h = {}
|
1038
|
-
a = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
|
1039
|
-
b = Sequel.qualify(:table, :column).cast(:type).*(:numeric_column).asc
|
1040
|
-
h[a] = 1
|
1041
|
-
h[b] = 2
|
1042
|
-
h[a].must_equal 2
|
1043
|
-
h[b].must_equal 2
|
1044
|
-
end
|
1045
|
-
end
|
1046
|
-
|
1047
|
-
describe "Sequel::SQLTime" do
|
1048
|
-
before do
|
1049
|
-
@db = Sequel.mock
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
it ".create should create from hour, minutes, seconds and optional microseconds" do
|
1053
|
-
@db.literal(Sequel::SQLTime.create(1, 2, 3)).must_equal "'01:02:03.000000'"
|
1054
|
-
@db.literal(Sequel::SQLTime.create(1, 2, 3, 500000)).must_equal "'01:02:03.500000'"
|
1055
|
-
end
|
1056
|
-
|
1057
|
-
it "#to_s should include hour, minute, and second by default" do
|
1058
|
-
Sequel::SQLTime.create(1, 2, 3).to_s.must_equal "01:02:03"
|
1059
|
-
Sequel::SQLTime.create(1, 2, 3, 500000).to_s.must_equal "01:02:03"
|
1060
|
-
end
|
1061
|
-
|
1062
|
-
it "#to_s should handle arguments with super" do
|
1063
|
-
t = Sequel::SQLTime.create(1, 2, 3)
|
1064
|
-
begin
|
1065
|
-
Time.now.to_s('%F')
|
1066
|
-
rescue
|
1067
|
-
proc{t.to_s('%F')}.must_raise ArgumentError
|
1068
|
-
else
|
1069
|
-
t.to_s('%F')
|
1070
|
-
end
|
1071
|
-
end
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
describe "Sequel::SQL::Wrapper" do
|
1075
|
-
before do
|
1076
|
-
@ds = Sequel.mock.dataset
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
it "should wrap objects so they can be used by the Sequel DSL" do
|
1080
|
-
o = Object.new
|
1081
|
-
def o.sql_literal(ds) 'foo' end
|
1082
|
-
s = Sequel::SQL::Wrapper.new(o)
|
1083
|
-
@ds.literal(s).must_equal "foo"
|
1084
|
-
@ds.literal(s+1).must_equal "(foo + 1)"
|
1085
|
-
@ds.literal(s & true).must_equal "(foo AND 't')"
|
1086
|
-
@ds.literal(s < 1).must_equal "(foo < 1)"
|
1087
|
-
@ds.literal(s.sql_subscript(1)).must_equal "foo[1]"
|
1088
|
-
@ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
|
1089
|
-
@ds.literal(s.as(:a)).must_equal "foo AS a"
|
1090
|
-
@ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
|
1091
|
-
@ds.literal(s.desc).must_equal "foo DESC"
|
1092
|
-
@ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
|
1093
|
-
end
|
1094
|
-
end
|
1095
|
-
|
1096
|
-
describe "Sequel::SQL::Blob#to_sequel_blob" do
|
1097
|
-
it "should return self" do
|
1098
|
-
c = Sequel::SQL::Blob.new('a')
|
1099
|
-
c.to_sequel_blob.must_be_same_as(c)
|
1100
|
-
end
|
1101
|
-
end
|
1102
|
-
|
1103
|
-
describe Sequel::SQL::Subscript do
|
1104
|
-
before do
|
1105
|
-
@s = Sequel::SQL::Subscript.new(:a, [1])
|
1106
|
-
@ds = Sequel.mock.dataset
|
1107
|
-
end
|
1108
|
-
|
1109
|
-
it "should have | return a new non-nested subscript" do
|
1110
|
-
s = (@s | 2)
|
1111
|
-
@ds.literal(s).must_equal 'a[1, 2]'
|
1112
|
-
end
|
1113
|
-
|
1114
|
-
it "should have [] return a new nested subscript" do
|
1115
|
-
s = @s[2]
|
1116
|
-
@ds.literal(s).must_equal 'a[1][2]'
|
1117
|
-
end
|
1118
|
-
end
|
1119
|
-
|
1120
|
-
describe Sequel::SQL::CaseExpression, "#with_merged_expression" do
|
1121
|
-
it "should return self if it has no expression" do
|
1122
|
-
c = Sequel.case({1=>0}, 3)
|
1123
|
-
c.with_merged_expression.must_be_same_as(c)
|
1124
|
-
end
|
1125
|
-
|
1126
|
-
it "should merge expression into conditions if it has an expression" do
|
1127
|
-
db = Sequel::Database.new
|
1128
|
-
c = Sequel.case({1=>0}, 3, 4)
|
1129
|
-
db.literal(c.with_merged_expression).must_equal db.literal(Sequel.case({{4=>1}=>0}, 3))
|
1130
|
-
end
|
1131
|
-
end
|
1132
|
-
|
1133
|
-
describe "Sequel.recursive_map" do
|
1134
|
-
it "should recursively convert an array using a callable" do
|
1135
|
-
Sequel.recursive_map(['1'], proc{|s| s.to_i}).must_equal [1]
|
1136
|
-
Sequel.recursive_map([['1']], proc{|s| s.to_i}).must_equal [[1]]
|
1137
|
-
end
|
1138
|
-
|
1139
|
-
it "should not call callable if value is nil" do
|
1140
|
-
Sequel.recursive_map([nil], proc{|s| s.to_i}).must_equal [nil]
|
1141
|
-
Sequel.recursive_map([[nil]], proc{|s| s.to_i}).must_equal [[nil]]
|
1142
|
-
end
|
1143
|
-
end
|
1144
|
-
|
1145
|
-
describe "Sequel.delay" do
|
1146
|
-
before do
|
1147
|
-
@o = Class.new do
|
1148
|
-
def a
|
1149
|
-
@a ||= 0
|
1150
|
-
@a += 1
|
1151
|
-
end
|
1152
|
-
def _a
|
1153
|
-
@a if defined?(@a)
|
1154
|
-
end
|
1155
|
-
|
1156
|
-
attr_accessor :b
|
1157
|
-
end.new
|
1158
|
-
end
|
1159
|
-
|
1160
|
-
it "should delay calling the block until literalization" do
|
1161
|
-
ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.a})
|
1162
|
-
@o._a.must_equal nil
|
1163
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
|
1164
|
-
@o._a.must_equal 1
|
1165
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a = 2)"
|
1166
|
-
@o._a.must_equal 2
|
1167
|
-
end
|
1168
|
-
|
1169
|
-
it "should call the block with the current dataset if it accepts one argument" do
|
1170
|
-
ds = Sequel.mock[:b].where(Sequel.delay{|x| x.first_source})
|
1171
|
-
ds.sql.must_equal "SELECT * FROM b WHERE b"
|
1172
|
-
ds.from(:c).sql.must_equal "SELECT * FROM c WHERE c"
|
1173
|
-
end
|
1174
|
-
|
1175
|
-
it "should have the condition specifier handling respect delayed evaluations" do
|
1176
|
-
ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.b})
|
1177
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a IS NULL)"
|
1178
|
-
@o.b = 1
|
1179
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
|
1180
|
-
@o.b = [1, 2]
|
1181
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a IN (1, 2))"
|
1182
|
-
end
|
1183
|
-
|
1184
|
-
it "should have the condition specifier handling call block with the current dataset if it accepts one argument" do
|
1185
|
-
ds = Sequel.mock[:b].where(:a=>Sequel.delay{|x| x.first_source})
|
1186
|
-
ds.sql.must_equal "SELECT * FROM b WHERE (a = b)"
|
1187
|
-
ds.from(:c).sql.must_equal "SELECT * FROM c WHERE (a = c)"
|
1188
|
-
end
|
1189
|
-
|
1190
|
-
it "should raise if called without a block" do
|
1191
|
-
proc{Sequel.delay}.must_raise(Sequel::Error)
|
1192
|
-
end
|
1193
|
-
end
|
1194
|
-
|
1195
|
-
describe Sequel do
|
1196
|
-
before do
|
1197
|
-
Sequel::JSON = Class.new do
|
1198
|
-
self::ParserError = Sequel
|
1199
|
-
def self.parse(json, opts={})
|
1200
|
-
[json, opts]
|
1201
|
-
end
|
1202
|
-
end
|
1203
|
-
end
|
1204
|
-
after do
|
1205
|
-
Sequel.send(:remove_const, :JSON)
|
1206
|
-
end
|
1207
|
-
|
1208
|
-
it ".parse_json should parse json correctly" do
|
1209
|
-
Sequel.parse_json('[]').must_equal ['[]', {:create_additions=>false}]
|
1210
|
-
end
|
1211
|
-
|
1212
|
-
it ".json_parser_error_class should return the related parser error class" do
|
1213
|
-
Sequel.json_parser_error_class.must_equal Sequel
|
1214
|
-
end
|
1215
|
-
|
1216
|
-
it ".object_to_json should return a json version of the object" do
|
1217
|
-
o = Object.new
|
1218
|
-
def o.to_json(*args); [1, args]; end
|
1219
|
-
Sequel.object_to_json(o, :foo).must_equal [1, [:foo]]
|
1220
|
-
end
|
1221
|
-
end
|
1222
|
-
|
1223
|
-
describe "Sequel::LiteralString" do
|
1224
|
-
before do
|
1225
|
-
@s = Sequel::LiteralString.new("? = ?")
|
1226
|
-
end
|
1227
|
-
|
1228
|
-
it "should have lit return self if no arguments" do
|
1229
|
-
@s.lit.must_be_same_as(@s)
|
1230
|
-
end
|
1231
|
-
|
1232
|
-
it "should have lit return self if return a placeholder literal string if arguments" do
|
1233
|
-
@s.lit(1, 2).must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
1234
|
-
Sequel.mock.literal(@s.lit(1, :a)).must_equal '1 = a'
|
1235
|
-
end
|
1236
|
-
|
1237
|
-
it "should have to_sequel_blob convert to blob" do
|
1238
|
-
@s.to_sequel_blob.must_equal @s
|
1239
|
-
@s.to_sequel_blob.must_be_kind_of(Sequel::SQL::Blob)
|
1240
|
-
end
|
1241
|
-
end
|
1242
|
-
|
1243
|
-
describe "Sequel core extensions" do
|
1244
|
-
it "should have Sequel.core_extensions? be false by default" do
|
1245
|
-
Sequel.core_extensions?.must_equal false
|
1246
|
-
end
|
1247
|
-
end
|