Module | Sequel::Oracle |
In: |
lib/sequel/adapters/shared/oracle.rb
lib/sequel/adapters/oracle.rb |
# File lib/sequel/adapters/shared/oracle.rb, line 289 289: def complex_expression_sql_append(sql, op, args) 290: case op 291: when :& 292: complex_expression_arg_pairs_append(sql, args, &BITAND_PROC) 293: when :| 294: complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 295: when :^ 296: complex_expression_arg_pairs_append(sql, args) do |*x| 297: s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 298: s2 = complex_expression_arg_pairs(x, &BITAND_PROC) 299: Sequel.lit(["(", " - ", ")"], s1, s2) 300: end 301: when :%, :<<, :>>, 'B~''B~' 302: complex_expression_emulate_append(sql, op, args) 303: else 304: super 305: end 306: 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 311 311: def constant_sql_append(sql, c) 312: if c == :CURRENT_TIME 313: super(sql, :CURRENT_TIMESTAMP) 314: else 315: super 316: end 317: end
Use a custom expression with EXISTS to determine whether a dataset is empty.
# File lib/sequel/adapters/shared/oracle.rb, line 327 327: def empty? 328: db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil 329: end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
# File lib/sequel/adapters/shared/oracle.rb, line 344 344: def select_sql 345: return super if @opts[:sql] 346: if o = @opts[:offset] 347: columns = clone(:append_sql=>'', :placeholder_literal_null=>true).columns 348: dsa1 = dataset_alias(1) 349: rn = row_number_column 350: limit = @opts[:limit] 351: ds = unlimited. 352: from_self(:alias=>dsa1). 353: select_append(ROW_NUMBER_EXPRESSION.as(rn)). 354: from_self(:alias=>dsa1). 355: select(*columns). 356: where(SQL::Identifier.new(rn) > o) 357: ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit 358: sql = @opts[:append_sql] || '' 359: subselect_sql_append(sql, ds) 360: sql 361: elsif limit = @opts[:limit] 362: ds = clone(:limit=>nil) 363: # Lock doesn't work in subselects, so don't use a subselect when locking. 364: # Don't use a subselect if custom SQL is used, as it breaks somethings. 365: ds = ds.from_self unless @opts[:lock] 366: sql = @opts[:append_sql] || '' 367: subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit))) 368: sql 369: else 370: super 371: end 372: end
# File lib/sequel/adapters/shared/oracle.rb, line 379 379: def supports_cte?(type=:select) 380: type == :select 381: end