Module | Sequel::Oracle |
In: |
lib/sequel/adapters/oracle.rb
lib/sequel/adapters/shared/oracle.rb |
# File lib/sequel/adapters/shared/oracle.rb, line 9 9: def self.mock_adapter_setup(db) 10: db.instance_eval do 11: @server_version = 11000000 12: @primary_key_sequences = {} 13: end 14: end
# File lib/sequel/adapters/shared/oracle.rb, line 324 324: def complex_expression_sql_append(sql, op, args) 325: case op 326: when :& 327: complex_expression_arg_pairs_append(sql, args, &BITAND_PROC) 328: when :| 329: complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 330: when :^ 331: complex_expression_arg_pairs_append(sql, args) do |*x| 332: s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 333: s2 = complex_expression_arg_pairs(x, &BITAND_PROC) 334: Sequel.lit(["(", " - ", ")"], s1, s2) 335: end 336: when :~, '!~''!~', '~*''~*', '!~*''!~*' 337: raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp? 338: if op == '!~''!~' || op == '!~*''!~*' 339: sql << 'NOT ' 340: end 341: sql << 'REGEXP_LIKE(' 342: literal_append(sql, args.at(0)) 343: sql << ',' 344: literal_append(sql, args.at(1)) 345: if op == '~*''~*' || op == '!~*''!~*' 346: sql << ", 'i'" 347: end 348: sql << ')' 349: when :%, :<<, :>>, 'B~''B~' 350: complex_expression_emulate_append(sql, op, args) 351: else 352: super 353: end 354: 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 359 359: def constant_sql_append(sql, c) 360: if c == :CURRENT_TIME 361: super(sql, :CURRENT_TIMESTAMP) 362: else 363: super 364: end 365: end
Use a custom expression with EXISTS to determine whether a dataset is empty.
# File lib/sequel/adapters/shared/oracle.rb, line 375 375: def empty? 376: db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil 377: end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
# File lib/sequel/adapters/shared/oracle.rb, line 392 392: def select_sql 393: return super if @opts[:sql] 394: if o = @opts[:offset] 395: columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns 396: dsa1 = dataset_alias(1) 397: rn = row_number_column 398: limit = @opts[:limit] 399: ds = unlimited. 400: from_self(:alias=>dsa1). 401: select_append(ROW_NUMBER_EXPRESSION.as(rn)). 402: from_self(:alias=>dsa1). 403: select(*columns). 404: where(SQL::Identifier.new(rn) > o) 405: ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit 406: sql = @opts[:append_sql] || String.new 407: subselect_sql_append(sql, ds) 408: sql 409: elsif limit = @opts[:limit] 410: ds = clone(:limit=>nil) 411: # Lock doesn't work in subselects, so don't use a subselect when locking. 412: # Don't use a subselect if custom SQL is used, as it breaks somethings. 413: ds = ds.from_self unless @opts[:lock] 414: sql = @opts[:append_sql] || String.new 415: subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit))) 416: sql 417: else 418: super 419: end 420: end
The version of the database server
# File lib/sequel/adapters/shared/oracle.rb, line 497 497: def server_version 498: db.server_version(@opts[:server]) 499: end
# File lib/sequel/adapters/shared/oracle.rb, line 427 427: def supports_cte?(type=:select) 428: type == :select 429: end