# File lib/sequel/adapters/shared/oracle.rb, line 9 def self.mock_adapter_setup(db) db.instance_eval do @server_version = 11000000 @primary_key_sequences = {} end end
# File lib/sequel/adapters/shared/oracle.rb, line 354 def complex_expression_sql_append(sql, op, args) case op when :& complex_expression_arg_pairs_append(sql, args, &BITAND_PROC) when :| complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} when :^ complex_expression_arg_pairs_append(sql, args) do |*x| s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} s2 = complex_expression_arg_pairs(x, &BITAND_PROC) Sequel.lit(["(", " - ", ")"], s1, s2) end when :~, :'!~', :'~*', :'!~*' raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp? if op == :'!~' || op == :'!~*' sql << 'NOT ' end sql << 'REGEXP_LIKE(' literal_append(sql, args[0]) sql << ',' literal_append(sql, args[1]) if op == :'~*' || op == :'!~*' sql << ", 'i'" end sql << ')' when :%, :<<, :>>, :'B~' complex_expression_emulate_append(sql, op, args) else super end end
Oracle doesn’t support CURRENT_TIME, as it doesn’t have a type for storing just time values without a date, so use CURRENT_TIMESTAMP in its place.
# File lib/sequel/adapters/shared/oracle.rb, line 389 def constant_sql_append(sql, c) if c == :CURRENT_TIME super(sql, :CURRENT_TIMESTAMP) else super end end
Use a custom expression with EXISTS to determine whether a dataset is empty.
# File lib/sequel/adapters/shared/oracle.rb, line 405 def empty? db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil end
Oracle uses MINUS instead of EXCEPT, and doesn’t support EXCEPT ALL
# File lib/sequel/adapters/shared/oracle.rb, line 398 def except(dataset, opts=OPTS) raise(Sequel::Error, "EXCEPT ALL not supported") if opts[:all] compound_clone(:minus, dataset, opts) end
Oracle requires recursive CTEs to have column aliases.
# File lib/sequel/adapters/shared/oracle.rb, line 453 def recursive_cte_requires_column_aliases? true end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
# File lib/sequel/adapters/shared/oracle.rb, line 422 def select_sql return super if @opts[:sql] if o = @opts[:offset] columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns dsa1 = dataset_alias(1) rn = row_number_column limit = @opts[:limit] ds = unlimited. from_self(:alias=>dsa1). select_append(ROW_NUMBER_EXPRESSION.as(rn)). from_self(:alias=>dsa1). select(*columns). where(SQL::Identifier.new(rn) > o) ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit sql = @opts[:append_sql] || String.new subselect_sql_append(sql, ds) sql elsif limit = @opts[:limit] ds = clone(:limit=>nil) # Lock doesn't work in subselects, so don't use a subselect when locking. # Don't use a subselect if custom SQL is used, as it breaks somethings. ds = ds.from_self unless @opts[:lock] sql = @opts[:append_sql] || String.new subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit))) sql else super end end
Create a copy of this dataset associated to the given sequence name, which will be used when calling insert to find the most recently inserted value for the sequence.
# File lib/sequel/adapters/shared/oracle.rb, line 417 def sequence(s) clone(:sequence=>s) end
The version of the database server
# File lib/sequel/adapters/shared/oracle.rb, line 527 def server_version db.server_version(@opts[:server]) end
# File lib/sequel/adapters/shared/oracle.rb, line 457 def supports_cte?(type=:select) type == :select end
Oracle does not support derived column lists
# File lib/sequel/adapters/shared/oracle.rb, line 462 def supports_derived_column_lists? false end
Oracle supports GROUP BY CUBE
# File lib/sequel/adapters/shared/oracle.rb, line 467 def supports_group_cube? true end
Oracle supports GROUP BY ROLLUP
# File lib/sequel/adapters/shared/oracle.rb, line 472 def supports_group_rollup? true end
Oracle supports GROUPING SETS
# File lib/sequel/adapters/shared/oracle.rb, line 477 def supports_grouping_sets? true end
Oracle does not support INTERSECT ALL or EXCEPT ALL
# File lib/sequel/adapters/shared/oracle.rb, line 482 def supports_intersect_except_all? false end
Oracle does not support IS TRUE.
# File lib/sequel/adapters/shared/oracle.rb, line 487 def supports_is_true? false end
Oracle supports pattern matching via regular expressions
# File lib/sequel/adapters/shared/oracle.rb, line 532 def supports_regexp? server_version >= 10010002 end
Oracle does not support SELECT *, column
# File lib/sequel/adapters/shared/oracle.rb, line 502 def supports_select_all_and_column? false end
Oracle supports SKIP LOCKED.
# File lib/sequel/adapters/shared/oracle.rb, line 507 def supports_skip_locked? true end
Oracle supports timezones in literal timestamps.
# File lib/sequel/adapters/shared/oracle.rb, line 512 def supports_timestamp_timezones? true end
Oracle does not support WHERE ‘Y’ for WHERE TRUE.
# File lib/sequel/adapters/shared/oracle.rb, line 517 def supports_where_true? false end
Oracle supports window functions
# File lib/sequel/adapters/shared/oracle.rb, line 522 def supports_window_functions? true end