sequel 4.49.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
|
@@ -1,105 +1,37 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../utils/replace'
|
|
4
|
+
require_relative '../utils/split_alter_table'
|
|
5
|
+
require_relative '../utils/unmodified_identifiers'
|
|
4
6
|
|
|
5
7
|
module Sequel
|
|
6
8
|
module MySQL
|
|
7
9
|
Sequel::Database.set_shared_adapter_scheme(:mysql, self)
|
|
8
10
|
|
|
9
11
|
def self.mock_adapter_setup(db)
|
|
10
|
-
db.
|
|
12
|
+
db.instance_exec do
|
|
11
13
|
@server_version = 50617
|
|
12
14
|
end
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
# SEQUEL5: Remove
|
|
16
|
-
@convert_tinyint_to_bool = true
|
|
17
|
-
@default_charset = nil
|
|
18
|
-
@default_collate = nil
|
|
19
|
-
@default_engine = nil
|
|
20
|
-
class << self
|
|
21
|
-
def convert_tinyint_to_bool
|
|
22
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool", "Call this method on the Database instance")
|
|
23
|
-
@convert_tinyint_to_bool
|
|
24
|
-
end
|
|
25
|
-
def convert_tinyint_to_bool=(v)
|
|
26
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool=", "Call this method on the Database instance")
|
|
27
|
-
@convert_tinyint_to_bool = v
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def default_charset
|
|
31
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset", "Call this method on the Database instance")
|
|
32
|
-
@default_charset
|
|
33
|
-
end
|
|
34
|
-
def default_charset=(v)
|
|
35
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset=", "Call this method on the Database instance")
|
|
36
|
-
@default_charset = v
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def default_collate
|
|
40
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate", "Call this method on the Database instance")
|
|
41
|
-
@default_collate
|
|
42
|
-
end
|
|
43
|
-
def default_collate=(v)
|
|
44
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate=", "Call this method on the Database instance")
|
|
45
|
-
@default_collate = v
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def default_engine
|
|
49
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine", "Call this method on the Database instance")
|
|
50
|
-
@default_engine
|
|
51
|
-
end
|
|
52
|
-
def default_engine=(v)
|
|
53
|
-
Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine=", "Call this method on the Database instance")
|
|
54
|
-
@default_engine = v
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Methods shared by Database instances that connect to MySQL,
|
|
59
|
-
# currently supported by the native and JDBC adapters.
|
|
60
17
|
module DatabaseMethods
|
|
61
18
|
include UnmodifiedIdentifiers::DatabaseMethods
|
|
62
19
|
include Sequel::Database::SplitAlterTable
|
|
63
20
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
PRIMARY = 'PRIMARY'.freeze
|
|
67
|
-
Sequel::Deprecation.deprecate_constant(self, :PRIMARY)
|
|
68
|
-
MYSQL_TIMESTAMP_RE = /\ACURRENT_(?:DATE|TIMESTAMP)?\z/
|
|
69
|
-
Sequel::Deprecation.deprecate_constant(self, :MYSQL_TIMESTAMP_RE)
|
|
70
|
-
|
|
71
|
-
CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}#.freeze # SEQUEL5
|
|
72
|
-
COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]#.freeze # SEQUEL5
|
|
73
|
-
|
|
21
|
+
CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}.freeze
|
|
22
|
+
COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references].freeze
|
|
74
23
|
|
|
75
24
|
# Set the default charset used for CREATE TABLE. You can pass the
|
|
76
25
|
# :charset option to create_table to override this setting.
|
|
77
|
-
|
|
26
|
+
attr_accessor :default_charset
|
|
78
27
|
|
|
79
28
|
# Set the default collation used for CREATE TABLE. You can pass the
|
|
80
29
|
# :collate option to create_table to override this setting.
|
|
81
|
-
|
|
30
|
+
attr_accessor :default_collate
|
|
82
31
|
|
|
83
32
|
# Set the default engine used for CREATE TABLE. You can pass the
|
|
84
33
|
# :engine option to create_table to override this setting.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
# SEQUEL5: Remove
|
|
88
|
-
attr_writer :default_charset
|
|
89
|
-
def default_charset
|
|
90
|
-
v = @default_charset
|
|
91
|
-
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_charset) : v
|
|
92
|
-
end
|
|
93
|
-
attr_writer :default_collate
|
|
94
|
-
def default_collate
|
|
95
|
-
v = @default_collate
|
|
96
|
-
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_collate) : v
|
|
97
|
-
end
|
|
98
|
-
attr_writer :default_engine
|
|
99
|
-
def default_engine
|
|
100
|
-
v = @default_engine
|
|
101
|
-
v.nil? ? Sequel::MySQL.instance_variable_get(:@default_engine) : v
|
|
102
|
-
end
|
|
34
|
+
attr_accessor :default_engine
|
|
103
35
|
|
|
104
36
|
# MySQL's cast rules are restrictive in that you can't just cast to any possible
|
|
105
37
|
# database type.
|
|
@@ -107,13 +39,10 @@ module Sequel
|
|
|
107
39
|
CAST_TYPES[type] || super
|
|
108
40
|
end
|
|
109
41
|
|
|
110
|
-
# Commit an existing prepared transaction with the given transaction
|
|
111
|
-
# identifier string.
|
|
112
42
|
def commit_prepared_transaction(transaction_id, opts=OPTS)
|
|
113
43
|
run("XA COMMIT #{literal(transaction_id)}", opts)
|
|
114
44
|
end
|
|
115
45
|
|
|
116
|
-
# MySQL uses the :mysql database type
|
|
117
46
|
def database_type
|
|
118
47
|
:mysql
|
|
119
48
|
end
|
|
@@ -145,6 +74,7 @@ module Sequel
|
|
|
145
74
|
|
|
146
75
|
def freeze
|
|
147
76
|
server_version
|
|
77
|
+
mariadb?
|
|
148
78
|
supports_timestamp_usecs?
|
|
149
79
|
super
|
|
150
80
|
end
|
|
@@ -163,7 +93,6 @@ module Sequel
|
|
|
163
93
|
indexes = {}
|
|
164
94
|
remove_indexes = []
|
|
165
95
|
m = output_identifier_meth
|
|
166
|
-
im = input_identifier_meth
|
|
167
96
|
schema, table = schema_and_table(table)
|
|
168
97
|
|
|
169
98
|
table = Sequel::SQL::Identifier.new(table)
|
|
@@ -184,16 +113,20 @@ module Sequel
|
|
|
184
113
|
indexes.reject{|k,v| remove_indexes.include?(k)}
|
|
185
114
|
end
|
|
186
115
|
|
|
187
|
-
# Rollback an existing prepared transaction with the given transaction
|
|
188
|
-
# identifier string.
|
|
189
116
|
def rollback_prepared_transaction(transaction_id, opts=OPTS)
|
|
190
117
|
run("XA ROLLBACK #{literal(transaction_id)}", opts)
|
|
191
118
|
end
|
|
192
119
|
|
|
120
|
+
# Whether the database is MariaDB and not MySQL
|
|
121
|
+
def mariadb?
|
|
122
|
+
return @is_mariadb if defined?(@is_mariadb)
|
|
123
|
+
@is_mariadb = !(fetch('SELECT version()').single_value! !~ /mariadb/i)
|
|
124
|
+
end
|
|
125
|
+
|
|
193
126
|
# Get version of MySQL server, used for determined capabilities.
|
|
194
127
|
def server_version
|
|
195
128
|
@server_version ||= begin
|
|
196
|
-
m = /(\d+)\.(\d+)\.(\d+)/.match(
|
|
129
|
+
m = /(\d+)\.(\d+)\.(\d+)/.match(fetch('SELECT version()').single_value!)
|
|
197
130
|
(m[1].to_i * 10000) + (m[2].to_i * 100) + m[3].to_i
|
|
198
131
|
end
|
|
199
132
|
end
|
|
@@ -241,16 +174,6 @@ module Sequel
|
|
|
241
174
|
full_tables('BASE TABLE', opts)
|
|
242
175
|
end
|
|
243
176
|
|
|
244
|
-
# Changes the database in use by issuing a USE statement. I would be
|
|
245
|
-
# very careful if I used this.
|
|
246
|
-
def use(db_name)
|
|
247
|
-
Sequel::Deprecation.deprecate("Database#use", "Create a new Sequel::Database instance instead of using Database#use")
|
|
248
|
-
disconnect
|
|
249
|
-
@opts[:database] = db_name if self << "USE #{db_name}"
|
|
250
|
-
@schemas = {}
|
|
251
|
-
self
|
|
252
|
-
end
|
|
253
|
-
|
|
254
177
|
# Return an array of symbols specifying view names in the current database.
|
|
255
178
|
#
|
|
256
179
|
# Options:
|
|
@@ -321,10 +244,13 @@ module Sequel
|
|
|
321
244
|
"DROP FOREIGN KEY #{quote_identifier(name)}"
|
|
322
245
|
when :unique
|
|
323
246
|
"DROP INDEX #{quote_identifier(op[:name])}"
|
|
247
|
+
when :check, nil
|
|
248
|
+
if supports_check_constraints?
|
|
249
|
+
"DROP CONSTRAINT #{quote_identifier(op[:name])}"
|
|
250
|
+
end
|
|
324
251
|
end
|
|
325
252
|
end
|
|
326
253
|
|
|
327
|
-
# MySQL server requires table names when dropping indexes.
|
|
328
254
|
def alter_table_sql(table, op)
|
|
329
255
|
case op[:op]
|
|
330
256
|
when :drop_index
|
|
@@ -350,6 +276,11 @@ module Sequel
|
|
|
350
276
|
super(default, type)
|
|
351
277
|
end
|
|
352
278
|
|
|
279
|
+
def column_schema_to_ruby_default(default, type)
|
|
280
|
+
return Sequel::CURRENT_DATE if mariadb? && server_version >= 100200 && default == 'curdate()'
|
|
281
|
+
super
|
|
282
|
+
end
|
|
283
|
+
|
|
353
284
|
# Don't allow combining adding foreign key operations with other
|
|
354
285
|
# operations, since in some cases adding a foreign key constraint in
|
|
355
286
|
# the same query as other operations results in MySQL error 150.
|
|
@@ -379,7 +310,6 @@ module Sequel
|
|
|
379
310
|
sqls
|
|
380
311
|
end
|
|
381
312
|
|
|
382
|
-
# Use MySQL specific AUTO_INCREMENT text.
|
|
383
313
|
def auto_increment_sql
|
|
384
314
|
'AUTO_INCREMENT'
|
|
385
315
|
end
|
|
@@ -400,7 +330,6 @@ module Sequel
|
|
|
400
330
|
end
|
|
401
331
|
end
|
|
402
332
|
|
|
403
|
-
# The order of the column definition, as an array of symbols.
|
|
404
333
|
def column_definition_order
|
|
405
334
|
COLUMN_DEFINITION_ORDER
|
|
406
335
|
end
|
|
@@ -477,6 +406,7 @@ module Sequel
|
|
|
477
406
|
/foreign key constraint fails/ => ForeignKeyConstraintViolation,
|
|
478
407
|
/cannot be null/ => NotNullConstraintViolation,
|
|
479
408
|
/Deadlock found when trying to get lock; try restarting transaction/ => SerializationFailure,
|
|
409
|
+
/CONSTRAINT .+ failed for/ => CheckConstraintViolation,
|
|
480
410
|
}.freeze
|
|
481
411
|
def database_error_regexps
|
|
482
412
|
DATABASE_ERROR_REGEXPS
|
|
@@ -488,7 +418,6 @@ module Sequel
|
|
|
488
418
|
metadata_dataset.with_sql('SHOW FULL TABLES').server(opts[:server]).map{|r| m.call(r.values.first) if r.delete(:Table_type) == type}.compact
|
|
489
419
|
end
|
|
490
420
|
|
|
491
|
-
# Handle MySQL specific index SQL syntax
|
|
492
421
|
def index_definition_sql(table_name, index)
|
|
493
422
|
index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
|
|
494
423
|
raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
|
|
@@ -520,7 +449,6 @@ module Sequel
|
|
|
520
449
|
end
|
|
521
450
|
end
|
|
522
451
|
|
|
523
|
-
# Recognize MySQL set type.
|
|
524
452
|
def schema_column_type(db_type)
|
|
525
453
|
case db_type
|
|
526
454
|
when /\Aset/io
|
|
@@ -559,6 +487,11 @@ module Sequel
|
|
|
559
487
|
server_version >= 50600 && (op[:op] == :drop_index || (op[:op] == :drop_constraint && op[:type] == :unique))
|
|
560
488
|
end
|
|
561
489
|
|
|
490
|
+
# Whether the database supports CHECK constraints
|
|
491
|
+
def supports_check_constraints?
|
|
492
|
+
mariadb? && server_version >= 100200
|
|
493
|
+
end
|
|
494
|
+
|
|
562
495
|
# MySQL can combine multiple alter table ops into a single query.
|
|
563
496
|
def supports_combining_alter_table_ops?
|
|
564
497
|
true
|
|
@@ -629,112 +562,17 @@ module Sequel
|
|
|
629
562
|
|
|
630
563
|
# Dataset methods shared by datasets that use MySQL databases.
|
|
631
564
|
module DatasetMethods
|
|
632
|
-
BOOL_TRUE = '1'.freeze
|
|
633
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
|
|
634
|
-
BOOL_FALSE = '0'.freeze
|
|
635
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
|
|
636
|
-
COMMA_SEPARATOR = ', '.freeze
|
|
637
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA_SEPARATOR)
|
|
638
|
-
FOR_SHARE = ' LOCK IN SHARE MODE'.freeze
|
|
639
|
-
Sequel::Deprecation.deprecate_constant(self, :FOR_SHARE)
|
|
640
|
-
SQL_CALC_FOUND_ROWS = ' SQL_CALC_FOUND_ROWS'.freeze
|
|
641
|
-
Sequel::Deprecation.deprecate_constant(self, :SQL_CALC_FOUND_ROWS)
|
|
642
|
-
APOS = "'".freeze
|
|
643
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
|
644
|
-
APOS_RE = /'/.freeze
|
|
645
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
|
|
646
|
-
DOUBLE_APOS = "''".freeze
|
|
647
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
|
|
648
|
-
SPACE = ' '.freeze
|
|
649
|
-
Sequel::Deprecation.deprecate_constant(self, :SPACE)
|
|
650
|
-
PAREN_CLOSE = ')'.freeze
|
|
651
|
-
Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
|
|
652
|
-
PAREN_OPEN = '('.freeze
|
|
653
|
-
Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
|
|
654
|
-
NOT_SPACE = 'NOT '.freeze
|
|
655
|
-
Sequel::Deprecation.deprecate_constant(self, :NOT_SPACE)
|
|
656
|
-
FROM = ' FROM '.freeze
|
|
657
|
-
Sequel::Deprecation.deprecate_constant(self, :FROM)
|
|
658
|
-
COMMA = ', '.freeze
|
|
659
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
660
|
-
LIMIT = " LIMIT ".freeze
|
|
661
|
-
Sequel::Deprecation.deprecate_constant(self, :LIMIT)
|
|
662
|
-
GROUP_BY = " GROUP BY ".freeze
|
|
663
|
-
Sequel::Deprecation.deprecate_constant(self, :GROUP_BY)
|
|
664
|
-
ESCAPE = " ESCAPE ".freeze
|
|
665
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE)
|
|
666
|
-
BACKSLASH = "\\".freeze
|
|
667
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
|
|
668
|
-
REGEXP = 'REGEXP'.freeze
|
|
669
|
-
Sequel::Deprecation.deprecate_constant(self, :REGEXP)
|
|
670
|
-
LIKE = 'LIKE'.freeze
|
|
671
|
-
Sequel::Deprecation.deprecate_constant(self, :LIKE)
|
|
672
|
-
BINARY = 'BINARY '.freeze
|
|
673
|
-
Sequel::Deprecation.deprecate_constant(self, :BINARY)
|
|
674
|
-
CONCAT = "CONCAT".freeze
|
|
675
|
-
Sequel::Deprecation.deprecate_constant(self, :CONCAT)
|
|
676
|
-
CAST_BITCOMP_OPEN = "CAST(~".freeze
|
|
677
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_OPEN)
|
|
678
|
-
CAST_BITCOMP_CLOSE = " AS SIGNED INTEGER)".freeze
|
|
679
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_CLOSE)
|
|
680
|
-
STRAIGHT_JOIN = 'STRAIGHT_JOIN'.freeze
|
|
681
|
-
Sequel::Deprecation.deprecate_constant(self, :STRAIGHT_JOIN)
|
|
682
|
-
NATURAL_LEFT_JOIN = 'NATURAL LEFT JOIN'.freeze
|
|
683
|
-
Sequel::Deprecation.deprecate_constant(self, :NATURAL_LEFT_JOIN)
|
|
684
|
-
BACKTICK = '`'.freeze
|
|
685
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKTICK)
|
|
686
|
-
BACKTICK_RE = /`/.freeze
|
|
687
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKTICK_RE)
|
|
688
|
-
DOUBLE_BACKTICK = '``'.freeze
|
|
689
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_BACKTICK)
|
|
690
|
-
EMPTY_COLUMNS = " ()".freeze
|
|
691
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_COLUMNS)
|
|
692
|
-
EMPTY_VALUES = " VALUES ()".freeze
|
|
693
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_VALUES)
|
|
694
|
-
IGNORE = " IGNORE".freeze
|
|
695
|
-
Sequel::Deprecation.deprecate_constant(self, :IGNORE)
|
|
696
|
-
ON_DUPLICATE_KEY_UPDATE = " ON DUPLICATE KEY UPDATE ".freeze
|
|
697
|
-
Sequel::Deprecation.deprecate_constant(self, :ON_DUPLICATE_KEY_UPDATE)
|
|
698
|
-
EQ_VALUES = '=VALUES('.freeze
|
|
699
|
-
Sequel::Deprecation.deprecate_constant(self, :EQ_VALUES)
|
|
700
|
-
EQ = '='.freeze
|
|
701
|
-
Sequel::Deprecation.deprecate_constant(self, :EQ)
|
|
702
|
-
WITH_ROLLUP = ' WITH ROLLUP'.freeze
|
|
703
|
-
Sequel::Deprecation.deprecate_constant(self, :WITH_ROLLUP)
|
|
704
|
-
EXPLAIN = 'EXPLAIN '.freeze
|
|
705
|
-
Sequel::Deprecation.deprecate_constant(self, :EXPLAIN)
|
|
706
|
-
EXPLAIN_EXTENDED = 'EXPLAIN EXTENDED '.freeze
|
|
707
|
-
Sequel::Deprecation.deprecate_constant(self, :EXPLAIN_EXTENDED)
|
|
708
|
-
BACKSLASH_RE = /\\/.freeze
|
|
709
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKSLASH_RE)
|
|
710
|
-
QUAD_BACKSLASH = "\\\\\\\\".freeze
|
|
711
|
-
Sequel::Deprecation.deprecate_constant(self, :QUAD_BACKSLASH)
|
|
712
|
-
BLOB_START = "0x".freeze
|
|
713
|
-
Sequel::Deprecation.deprecate_constant(self, :BLOB_START)
|
|
714
|
-
EMPTY_BLOB = "''".freeze
|
|
715
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_BLOB)
|
|
716
|
-
HSTAR = "H*".freeze
|
|
717
|
-
Sequel::Deprecation.deprecate_constant(self, :HSTAR)
|
|
718
|
-
CURRENT_TIMESTAMP_56 = 'CURRENT_TIMESTAMP(6)'.freeze
|
|
719
|
-
Sequel::Deprecation.deprecate_constant(self, :CURRENT_TIMESTAMP_56)
|
|
720
|
-
ONLY_OFFSET = ",18446744073709551615".freeze
|
|
721
|
-
Sequel::Deprecation.deprecate_constant(self, :ONLY_OFFSET)
|
|
722
|
-
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:insert_ignore, :update_ignore, :on_duplicate_key_update]).freeze
|
|
723
|
-
Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
|
|
724
|
-
|
|
725
565
|
MATCH_AGAINST = ["MATCH ".freeze, " AGAINST (".freeze, ")".freeze].freeze
|
|
726
566
|
MATCH_AGAINST_BOOLEAN = ["MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE)".freeze].freeze
|
|
727
567
|
|
|
728
568
|
Dataset.def_sql_method(self, :delete, %w'delete from where order limit')
|
|
729
569
|
Dataset.def_sql_method(self, :insert, %w'insert ignore into columns values on_duplicate_key_update')
|
|
730
|
-
Dataset.def_sql_method(self, :select, %w'select distinct calc_found_rows columns from join where group having compounds order limit lock')
|
|
570
|
+
Dataset.def_sql_method(self, :select, %w'with select distinct calc_found_rows columns from join where group having compounds order limit lock')
|
|
731
571
|
Dataset.def_sql_method(self, :update, %w'update ignore table set where order limit')
|
|
732
572
|
|
|
733
573
|
include Sequel::Dataset::Replace
|
|
734
574
|
include UnmodifiedIdentifiers::DatasetMethods
|
|
735
575
|
|
|
736
|
-
# MySQL specific syntax for LIKE/REGEXP searches, as well as
|
|
737
|
-
# string concatenation.
|
|
738
576
|
def complex_expression_sql_append(sql, op, args)
|
|
739
577
|
case op
|
|
740
578
|
when :IN, :"NOT IN"
|
|
@@ -802,10 +640,10 @@ module Sequel
|
|
|
802
640
|
# Sets up the select methods to delete from if deleting from a
|
|
803
641
|
# joined dataset:
|
|
804
642
|
#
|
|
805
|
-
# DB[:a].join(:b, :
|
|
643
|
+
# DB[:a].join(:b, a_id: :id).delete
|
|
806
644
|
# # DELETE a FROM a INNER JOIN b ON (b.a_id = a.id)
|
|
807
645
|
#
|
|
808
|
-
# DB[:a].join(:b, :
|
|
646
|
+
# DB[:a].join(:b, a_id: :id).delete_from(:a, :b).delete
|
|
809
647
|
# # DELETE a, b FROM a INNER JOIN b ON (b.a_id = a.id)
|
|
810
648
|
def delete_from(*tables)
|
|
811
649
|
clone(:delete_from=>tables)
|
|
@@ -838,26 +676,10 @@ module Sequel
|
|
|
838
676
|
SQL::PlaceholderLiteralString.new((opts[:boolean] ? MATCH_AGAINST_BOOLEAN : MATCH_AGAINST), [Array(cols), terms])
|
|
839
677
|
end
|
|
840
678
|
|
|
841
|
-
# Transforms
|
|
842
|
-
# Raises an error on use of :full_outer type, since MySQL doesn't support it.
|
|
843
|
-
def join_table(type, table, expr=nil, opts=OPTS, &block)
|
|
844
|
-
if (type == :cross) && !expr.nil?
|
|
845
|
-
Sequel::Deprecation.deprecate(":cross join type with conditions being converted to INNER JOIN on MySQL", "Use :inner join type instead")
|
|
846
|
-
type = :inner
|
|
847
|
-
end
|
|
848
|
-
raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN or NATURAL FULL JOIN") if type == :full_outer || type == :natural_full
|
|
849
|
-
super(type, table, expr, opts, &block)
|
|
850
|
-
end
|
|
851
|
-
|
|
852
|
-
# Transforms :natural_inner to NATURAL LEFT JOIN and straight to
|
|
853
|
-
# STRAIGHT_JOIN.
|
|
679
|
+
# Transforms :straight to STRAIGHT_JOIN.
|
|
854
680
|
def join_type_sql(join_type)
|
|
855
|
-
|
|
856
|
-
when :straight
|
|
681
|
+
if join_type == :straight
|
|
857
682
|
'STRAIGHT_JOIN'
|
|
858
|
-
when :natural_inner
|
|
859
|
-
Sequel::Deprecation.deprecate(":natural_inner join type being converted to NATURAL LEFT JOIN on MySQL", "Use :natural_left join type for NATURAL LEFT JOIN, or :natural join type for NATURAL JOIN")
|
|
860
|
-
'NATURAL LEFT JOIN'
|
|
861
683
|
else
|
|
862
684
|
super
|
|
863
685
|
end
|
|
@@ -868,7 +690,7 @@ module Sequel
|
|
|
868
690
|
# inserting rows that violate the unique key restriction.
|
|
869
691
|
#
|
|
870
692
|
# dataset.insert_ignore.multi_insert(
|
|
871
|
-
#
|
|
693
|
+
# [{name: 'a', value: 1}, {name: 'b', value: 2}]
|
|
872
694
|
# )
|
|
873
695
|
# # INSERT IGNORE INTO tablename (name, value) VALUES (a, 1), (b, 2)
|
|
874
696
|
def insert_ignore
|
|
@@ -886,21 +708,21 @@ module Sequel
|
|
|
886
708
|
# inserting rows that violate the unique key restriction.
|
|
887
709
|
#
|
|
888
710
|
# dataset.on_duplicate_key_update.multi_insert(
|
|
889
|
-
#
|
|
711
|
+
# [{name: 'a', value: 1}, {name: 'b', value: 2}]
|
|
890
712
|
# )
|
|
891
713
|
# # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
|
|
892
714
|
# # ON DUPLICATE KEY UPDATE name=VALUES(name), value=VALUES(value)
|
|
893
715
|
#
|
|
894
716
|
# dataset.on_duplicate_key_update(:value).multi_insert(
|
|
895
|
-
# [{:
|
|
717
|
+
# [{name: 'a', value: 1}, {name: 'b', value: 2}]
|
|
896
718
|
# )
|
|
897
719
|
# # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
|
|
898
720
|
# # ON DUPLICATE KEY UPDATE value=VALUES(value)
|
|
899
721
|
#
|
|
900
722
|
# dataset.on_duplicate_key_update(
|
|
901
|
-
# :
|
|
723
|
+
# value: Sequel.lit('value + VALUES(value)')
|
|
902
724
|
# ).multi_insert(
|
|
903
|
-
# [{:
|
|
725
|
+
# [{name: 'a', value: 1}, {name: 'b', value: 2}]
|
|
904
726
|
# )
|
|
905
727
|
# # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
|
|
906
728
|
# # ON DUPLICATE KEY UPDATE value=value + VALUES(value)
|
|
@@ -913,6 +735,10 @@ module Sequel
|
|
|
913
735
|
sql << '`' << c.to_s.gsub('`', '``') << '`'
|
|
914
736
|
end
|
|
915
737
|
|
|
738
|
+
def supports_cte?(type=:select)
|
|
739
|
+
type == :select && db.mariadb? && db.server_version >= 100200
|
|
740
|
+
end
|
|
741
|
+
|
|
916
742
|
# MySQL does not support derived column lists
|
|
917
743
|
def supports_derived_column_lists?
|
|
918
744
|
false
|
|
@@ -945,7 +771,7 @@ module Sequel
|
|
|
945
771
|
end
|
|
946
772
|
|
|
947
773
|
# MySQL's DISTINCT ON emulation using GROUP BY does not respect the
|
|
948
|
-
#
|
|
774
|
+
# query's ORDER BY clause.
|
|
949
775
|
def supports_ordered_distinct_on?
|
|
950
776
|
false
|
|
951
777
|
end
|
|
@@ -955,18 +781,21 @@ module Sequel
|
|
|
955
781
|
true
|
|
956
782
|
end
|
|
957
783
|
|
|
958
|
-
#
|
|
959
|
-
#
|
|
960
|
-
# they are ignored anyway, not using them is probably best.
|
|
784
|
+
# Check the database setting for whether fractional timestamps
|
|
785
|
+
# are suppported.
|
|
961
786
|
def supports_timestamp_usecs?
|
|
962
787
|
db.supports_timestamp_usecs?
|
|
963
788
|
end
|
|
964
|
-
|
|
789
|
+
|
|
790
|
+
def supports_window_functions?
|
|
791
|
+
db.mariadb? && db.server_version >= 100200
|
|
792
|
+
end
|
|
793
|
+
|
|
965
794
|
# Sets up the update methods to use UPDATE IGNORE.
|
|
966
795
|
# Useful if you have a unique key and want to just skip
|
|
967
796
|
# updating rows that violate the unique key restriction.
|
|
968
797
|
#
|
|
969
|
-
# dataset.update_ignore.update(
|
|
798
|
+
# dataset.update_ignore.update(name: 'a', value: 1)
|
|
970
799
|
# # UPDATE IGNORE tablename SET name = 'a', value = 1
|
|
971
800
|
def update_ignore
|
|
972
801
|
clone(:update_ignore=>true)
|
|
@@ -1105,7 +934,7 @@ module Sequel
|
|
|
1105
934
|
'1'
|
|
1106
935
|
end
|
|
1107
936
|
|
|
1108
|
-
# MySQL supports multiple rows in INSERT.
|
|
937
|
+
# MySQL supports multiple rows in VALUES in INSERT.
|
|
1109
938
|
def multi_insert_sql_strategy
|
|
1110
939
|
:values
|
|
1111
940
|
end
|
|
@@ -1130,6 +959,11 @@ module Sequel
|
|
|
1130
959
|
sql << ' SQL_CALC_FOUND_ROWS' if opts[:calc_found_rows]
|
|
1131
960
|
end
|
|
1132
961
|
|
|
962
|
+
# Use WITH RECURSIVE instead of WITH if any of the CTEs is recursive
|
|
963
|
+
def select_with_sql_base
|
|
964
|
+
opts[:with].any?{|w| w[:recursive]} ? "WITH RECURSIVE " : super
|
|
965
|
+
end
|
|
966
|
+
|
|
1133
967
|
# MySQL uses WITH ROLLUP syntax.
|
|
1134
968
|
def uses_with_rollup?
|
|
1135
969
|
true
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../utils/emulate_offset_with_row_number'
|
|
4
4
|
|
|
5
5
|
module Sequel
|
|
6
6
|
module Oracle
|
|
7
7
|
Sequel::Database.set_shared_adapter_scheme(:oracle, self)
|
|
8
8
|
|
|
9
9
|
def self.mock_adapter_setup(db)
|
|
10
|
-
db.
|
|
10
|
+
db.instance_exec do
|
|
11
11
|
@server_version = 11000000
|
|
12
12
|
@primary_key_sequences = {}
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
module DatabaseMethods
|
|
17
|
-
TEMPORARY = 'GLOBAL TEMPORARY '.freeze
|
|
18
|
-
Sequel::Deprecation.deprecate_constant(self, :TEMPORARY)
|
|
19
|
-
AUTOINCREMENT = ''.freeze
|
|
20
|
-
Sequel::Deprecation.deprecate_constant(self, :AUTOINCREMENT)
|
|
21
|
-
|
|
22
17
|
attr_accessor :autosequence
|
|
23
18
|
|
|
24
19
|
def create_sequence(name, opts=OPTS)
|
|
@@ -37,7 +32,6 @@ module Sequel
|
|
|
37
32
|
self << drop_sequence_sql(name)
|
|
38
33
|
end
|
|
39
34
|
|
|
40
|
-
# Oracle uses the :oracle database type
|
|
41
35
|
def database_type
|
|
42
36
|
:oracle
|
|
43
37
|
end
|
|
@@ -88,7 +82,7 @@ module Sequel
|
|
|
88
82
|
false
|
|
89
83
|
end
|
|
90
84
|
|
|
91
|
-
IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'
|
|
85
|
+
IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'.freeze
|
|
92
86
|
|
|
93
87
|
def tables(opts=OPTS)
|
|
94
88
|
m = output_identifier_meth
|
|
@@ -146,7 +140,6 @@ module Sequel
|
|
|
146
140
|
|
|
147
141
|
private
|
|
148
142
|
|
|
149
|
-
# Handle Oracle specific ALTER TABLE SQL
|
|
150
143
|
def alter_table_sql(table, op)
|
|
151
144
|
case op[:op]
|
|
152
145
|
when :add_column
|
|
@@ -253,7 +246,7 @@ module Sequel
|
|
|
253
246
|
TRANSACTION_ISOLATION_LEVELS = {:uncommitted=>'READ COMMITTED'.freeze,
|
|
254
247
|
:committed=>'READ COMMITTED'.freeze,
|
|
255
248
|
:repeatable=>'SERIALIZABLE'.freeze,
|
|
256
|
-
:serializable=>'SERIALIZABLE'.freeze}
|
|
249
|
+
:serializable=>'SERIALIZABLE'.freeze}.freeze
|
|
257
250
|
# Oracle doesn't support READ UNCOMMITTED OR REPEATABLE READ transaction
|
|
258
251
|
# isolation levels, so upgrade to the next highest level in those cases.
|
|
259
252
|
def set_transaction_isolation_sql(level)
|
|
@@ -322,31 +315,6 @@ module Sequel
|
|
|
322
315
|
ROW_NUMBER_EXPRESSION = LiteralString.new('ROWNUM').freeze
|
|
323
316
|
BITAND_PROC = lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}
|
|
324
317
|
|
|
325
|
-
SPACE = ' '.freeze
|
|
326
|
-
Sequel::Deprecation.deprecate_constant(self, :SPACE)
|
|
327
|
-
APOS = "'".freeze
|
|
328
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
|
329
|
-
APOS_RE = /'/.freeze
|
|
330
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
|
|
331
|
-
DOUBLE_APOS = "''".freeze
|
|
332
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
|
|
333
|
-
FROM = ' FROM '.freeze
|
|
334
|
-
Sequel::Deprecation.deprecate_constant(self, :FROM)
|
|
335
|
-
TIMESTAMP_FORMAT = "TIMESTAMP '%Y-%m-%d %H:%M:%S%N %z'".freeze
|
|
336
|
-
Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
|
|
337
|
-
TIMESTAMP_OFFSET_FORMAT = "%+03i:%02i".freeze
|
|
338
|
-
Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_OFFSET_FORMAT)
|
|
339
|
-
BOOL_FALSE = "'N'".freeze
|
|
340
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
|
|
341
|
-
BOOL_TRUE = "'Y'".freeze
|
|
342
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
|
|
343
|
-
HSTAR = "H*".freeze
|
|
344
|
-
Sequel::Deprecation.deprecate_constant(self, :HSTAR)
|
|
345
|
-
DUAL = ' FROM DUAL'.freeze
|
|
346
|
-
Sequel::Deprecation.deprecate_constant(self, :DUAL)
|
|
347
|
-
SKIP_LOCKED = " SKIP LOCKED".freeze
|
|
348
|
-
Sequel::Deprecation.deprecate_constant(self, :SKIP_LOCKED)
|
|
349
|
-
|
|
350
318
|
include(Module.new do
|
|
351
319
|
Dataset.def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order limit lock')
|
|
352
320
|
end)
|
|
@@ -418,7 +386,8 @@ module Sequel
|
|
|
418
386
|
clone(:sequence=>s)
|
|
419
387
|
end
|
|
420
388
|
|
|
421
|
-
# Handle LIMIT by using a unlimited subselect filtered with ROWNUM
|
|
389
|
+
# Handle LIMIT by using a unlimited subselect filtered with ROWNUM,
|
|
390
|
+
# unless Oracle 12 is used.
|
|
422
391
|
def select_sql
|
|
423
392
|
return super if @opts[:sql]
|
|
424
393
|
return super if supports_fetch_next_rows?
|
|
@@ -467,6 +436,7 @@ module Sequel
|
|
|
467
436
|
sql << " ROWS ONLY"
|
|
468
437
|
end
|
|
469
438
|
end
|
|
439
|
+
|
|
470
440
|
# Oracle requires recursive CTEs to have column aliases.
|
|
471
441
|
def recursive_cte_requires_column_aliases?
|
|
472
442
|
true
|
|
@@ -481,7 +451,8 @@ module Sequel
|
|
|
481
451
|
false
|
|
482
452
|
end
|
|
483
453
|
|
|
484
|
-
# Oracle supports FETCH NEXT ROWS since 12c
|
|
454
|
+
# Oracle supports FETCH NEXT ROWS since 12c, but it doesn't work when
|
|
455
|
+
# locking or when skipping locked rows.
|
|
485
456
|
def supports_fetch_next_rows?
|
|
486
457
|
server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked])
|
|
487
458
|
end
|
|
@@ -551,7 +522,7 @@ module Sequel
|
|
|
551
522
|
db.server_version(@opts[:server])
|
|
552
523
|
end
|
|
553
524
|
|
|
554
|
-
# Oracle supports pattern matching via regular expressions
|
|
525
|
+
# Oracle 10+ supports pattern matching via regular expressions
|
|
555
526
|
def supports_regexp?
|
|
556
527
|
server_version >= 10010002
|
|
557
528
|
end
|
|
@@ -565,7 +536,8 @@ module Sequel
|
|
|
565
536
|
end
|
|
566
537
|
|
|
567
538
|
# Oracle doesn't support the use of AS when aliasing a dataset. It doesn't require
|
|
568
|
-
# the use of AS anywhere, so this disables it in all cases.
|
|
539
|
+
# the use of AS anywhere, so this disables it in all cases. Oracle also does not support
|
|
540
|
+
# derived column lists in aliases.
|
|
569
541
|
def as_sql_append(sql, aliaz, column_aliases=nil)
|
|
570
542
|
raise Error, "oracle does not support derived column lists" if column_aliases
|
|
571
543
|
sql << ' '
|
|
@@ -581,7 +553,7 @@ module Sequel
|
|
|
581
553
|
' FROM DUAL'
|
|
582
554
|
end
|
|
583
555
|
|
|
584
|
-
# There is no function on
|
|
556
|
+
# There is no function on Oracle that does character length
|
|
585
557
|
# and respects trailing spaces (datalength respects trailing spaces, but
|
|
586
558
|
# counts bytes instead of characters). Use a hack to work around the
|
|
587
559
|
# trailing spaces issue.
|