Module: Sequel::SQLite::DatasetMethods

Module | Sequel::SQLite::DatasetMethods
In: | lib/sequel/adapters/shared/sqlite.rb

Instance methods for datasets that connect to an SQLite database

### Methods

complex_expression_sql constant_sql delete explain having quoted_identifier supports_intersect_except_all? supports_is_true? supports_multiple_column_in? supports_timestamp_timezones?

### Constants

SELECT_CLAUSE_METHODS | = | Dataset.clause_methods(:select, %w'distinct columns from join where group having compounds order limit')
CONSTANT_MAP | = | {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze}

### Public Instance methods

complex_expression_sql(op, args)

SQLite does not support pattern matching via regular expressions. SQLite is case insensitive (depending on pragma), so use LIKE for ILIKE.

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 244
    244:       def complex_expression_sql(op, args)
    245:         case op
    246:         when :~, '!~''!~', '~*''~*', '!~*''!~*'
    247:           raise Error, "SQLite does not support pattern matching via regular expressions"
    248:         when :LIKE, 'NOT LIKE''NOT LIKE', :ILIKE, 'NOT ILIKE''NOT ILIKE'
    249:           # SQLite is case insensitive for ASCII, and non case sensitive for other character sets
    250:           "#{'NOT ' if [:'NOT LIKE', :'NOT ILIKE'].include?(op)}(#{literal(args.at(0))} LIKE #{literal(args.at(1))})"
    251:         else
    252:           super(op, args)
    253:         end
    254:       end

constant_sql(constant)

MSSQL doesn‘t support the SQL standard CURRENT_DATE or CURRENT_TIME

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 257
    257:       def constant_sql(constant)
    258:         CONSTANT_MAP[constant] || super
    259:       end

delete()

SQLite performs a TRUNCATE style DELETE if no filter is specified. Since we want to always return the count of records, add a condition that is always true and then delete.

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 264
    264:       def delete
    265:         @opts[:where] ? super : filter(1=>1).delete
    266:       end

explain()

Return an array of strings specifying a query explanation for a SELECT of the current dataset.

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 270
    270:       def explain
    271:         db.send(:metadata_dataset).clone(:sql=>"EXPLAIN #{select_sql}").
    272:           map{|x| "#{x[:addr]}|#{x[:opcode]}|#{(1..5).map{|i| x[:"p#{i}"]}.join('|')}|#{x[:comment]}"}
    273:       end

having(*cond, &block)

HAVING requires GROUP BY on SQLite

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 276
    276:       def having(*cond, &block)
    277:         raise(InvalidOperation, "Can only specify a HAVING clause on a grouped dataset") unless @opts[:group]
    278:         super
    279:       end

quoted_identifier(c)

SQLite uses the nonstandard ` (backtick) for quoting identifiers.

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 282
    282:       def quoted_identifier(c)
    283:         "`#{c}`"
    284:       end

supports_intersect_except_all?()

SQLite does not support INTERSECT ALL or EXCEPT ALL

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 287
    287:       def supports_intersect_except_all?
    288:         false
    289:       end

supports_is_true?()

SQLite does not support IS TRUE

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 292
    292:       def supports_is_true?
    293:         false
    294:       end

supports_multiple_column_in?()

SQLite does not support multiple columns for the IN/NOT IN operators

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 297
    297:       def supports_multiple_column_in?
    298:         false
    299:       end

supports_timestamp_timezones?()

SQLite supports timezones in literal timestamps, since it stores them as text.

[Source]

         # File lib/sequel/adapters/shared/sqlite.rb, line 303
    303:       def supports_timestamp_timezones?
    304:         true
    305:       end

[Validate]