| Module | Sequel::SQLite::DatasetMethods |
| In: |
lib/sequel/adapters/shared/sqlite.rb
|
Instance methods for datasets that connect to an SQLite database
| SELECT_CLAUSE_METHODS | = | Dataset.clause_methods(:select, %w'distinct columns from join where group having compounds order limit') |
| COMMA_SEPARATOR | = | ', '.freeze |
| CONSTANT_MAP | = | {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze} |
Ugly hack. Really, SQLite uses 0 for false and 1 for true but then you can‘t differentiate between integers and booleans. In filters, SQL::BooleanConstants are used more, while in other places the ruby true/false values are used more, so use 1/0 for SQL::BooleanConstants. The correct fix for this would require separate literalization paths for filters compared to other values, but that‘s more work than I want to do right now.
# File lib/sequel/adapters/shared/sqlite.rb, line 349
349: def boolean_constant_sql(constant)
350: case constant
351: when true
352: '1'
353: when false
354: '0'
355: else
356: super
357: end
358: end
SQLite does not support pattern matching via regular expressions. SQLite is case insensitive (depending on pragma), so use LIKE for ILIKE.
# File lib/sequel/adapters/shared/sqlite.rb, line 363
363: def complex_expression_sql(op, args)
364: case op
365: when :~, '!~''!~', '~*''~*', '!~*''!~*'
366: raise Error, "SQLite does not support pattern matching via regular expressions"
367: when :LIKE, 'NOT LIKE''NOT LIKE', :ILIKE, 'NOT ILIKE''NOT ILIKE'
368: # SQLite is case insensitive for ASCII, and non case sensitive for other character sets
369: "#{'NOT ' if [:'NOT LIKE', :'NOT ILIKE'].include?(op)}(#{literal(args.at(0))} LIKE #{literal(args.at(1))})"
370: else
371: super(op, args)
372: end
373: end
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.
# File lib/sequel/adapters/shared/sqlite.rb, line 383
383: def delete
384: @opts[:where] ? super : filter(1=>1).delete
385: end
Return an array of strings specifying a query explanation for a SELECT of the current dataset.
# File lib/sequel/adapters/shared/sqlite.rb, line 389
389: def explain
390: db.send(:metadata_dataset).clone(:sql=>"EXPLAIN #{select_sql}").
391: map{|x| "#{x[:addr]}|#{x[:opcode]}|#{(1..5).map{|i| x[:"p#{i}"]}.join('|')}|#{x[:comment]}"}
392: end