Method: Sequel::SQLite::DatasetMethods#complex_expression_sql_append
- Defined in:
- lib/sequel/adapters/shared/sqlite.rb
permalink #complex_expression_sql_append(sql, op, args) ⇒ Object
SQLite doesn’t support a NOT LIKE b, you need to use NOT (a LIKE b). It doesn’t support xor, power, or the extract function natively, so those have to be emulated.
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 614 def complex_expression_sql_append(sql, op, args) case op when :"NOT LIKE", :"NOT ILIKE" sql << 'NOT ' complex_expression_sql_append(sql, (op == :"NOT ILIKE" ? :ILIKE : :LIKE), args) when :^ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["((~(", " & ", ")) & (", " | ", "))"], a, b, a, b)} when :** unless (exp = args[1]).is_a?(Integer) raise(Sequel::Error, "can only emulate exponentiation on SQLite if exponent is an integer, given #{exp.inspect}") end case exp when 0 sql << '1' else sql << '(' arg = args[0] if exp < 0 invert = true exp = exp.abs sql << '(1.0 / (' end (exp - 1).times do literal_append(sql, arg) sql << " * " end literal_append(sql, arg) sql << ')' if invert sql << "))" end end when :extract part = args[0] raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part] sql << "CAST(strftime(" << format << ', ' literal_append(sql, args[1]) sql << ') AS ' << (part == :second ? 'NUMERIC' : 'INTEGER') << ')' else super end end |