Module: Sequel::SQLite::DatasetMethods
- Included in:
- Amalgalite::Dataset, DataObjects::SQLite::Dataset, JDBC::SQLite::Dataset, Dataset, Sequel::Swift::SQLite::Dataset
- Defined in:
- lib/sequel/adapters/shared/sqlite.rb
Overview
Instance methods for datasets that connect to an SQLite database
Constant Summary collapse
- 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}
- EXTRACT_MAP =
{:year=>"'%Y'", :month=>"'%m'", :day=>"'%d'", :hour=>"'%H'", :minute=>"'%M'", :second=>"'%f'"}
Instance Method Summary collapse
-
#complex_expression_sql(op, args) ⇒ Object
SQLite does not support pattern matching via regular expressions.
-
#constant_sql(constant) ⇒ Object
MSSQL doesn’t support the SQL standard CURRENT_DATE or CURRENT_TIME.
-
#delete ⇒ Object
SQLite performs a TRUNCATE style DELETE if no filter is specified.
-
#explain ⇒ Object
Return an array of strings specifying a query explanation for a SELECT of the current dataset.
-
#having(*cond) ⇒ Object
HAVING requires GROUP BY on SQLite.
-
#quoted_identifier(c) ⇒ Object
SQLite uses the nonstandard ‘ (backtick) for quoting identifiers.
-
#select(*cols) ⇒ Object
When a qualified column is selected on SQLite and the qualifier is a subselect, the column name used is the full qualified name (including the qualifier) instead of just the column name.
-
#supports_intersect_except_all? ⇒ Boolean
SQLite does not support INTERSECT ALL or EXCEPT ALL.
-
#supports_is_true? ⇒ Boolean
SQLite does not support IS TRUE.
-
#supports_multiple_column_in? ⇒ Boolean
SQLite does not support multiple columns for the IN/NOT IN operators.
-
#supports_timestamp_timezones? ⇒ Boolean
SQLite supports timezones in literal timestamps, since it stores them as text.
-
#supports_where_true? ⇒ Boolean
SQLite cannot use WHERE ‘t’.
Instance Method Details
#complex_expression_sql(op, args) ⇒ Object
SQLite does not support pattern matching via regular expressions. SQLite is case insensitive (depending on pragma), so use LIKE for ILIKE.
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 407 def complex_expression_sql(op, args) case op when :~, :'!~', :'~*', :'!~*' raise Error, "SQLite does not support pattern matching via regular expressions" when :ILIKE super(:LIKE, args.map{|a| SQL::Function.new(:upper, a)}) when :"NOT LIKE", :"NOT ILIKE" "NOT #{complex_expression_sql((op == :"NOT ILIKE" ? :ILIKE : :LIKE), args)}" when :^ complex_expression_arg_pairs(args) do |a, b| a = literal(a) b = literal(b) "((~(#{a} & #{b})) & (#{a} | #{b}))" end when :extract part = args.at(0) raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part] expr = args.at(1) "CAST(strftime(#{format}, #{literal(expr)}) AS #{part == :second ? 'NUMERIC' : 'INTEGER'})" else super(op, args) end end |
#constant_sql(constant) ⇒ Object
MSSQL doesn’t support the SQL standard CURRENT_DATE or CURRENT_TIME
432 433 434 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 432 def constant_sql(constant) CONSTANT_MAP[constant] || super end |
#delete ⇒ Object
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.
439 440 441 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 439 def delete @opts[:where] ? super : filter(1=>1).delete end |
#explain ⇒ Object
Return an array of strings specifying a query explanation for a SELECT of the current dataset.
445 446 447 448 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 445 def explain db.send(:metadata_dataset).clone(:sql=>"EXPLAIN #{select_sql}"). map{|x| "#{x[:addr]}|#{x[:opcode]}|#{(1..5).map{|i| x[:"p#{i}"]}.join('|')}|#{x[:comment]}"} end |
#having(*cond) ⇒ Object
HAVING requires GROUP BY on SQLite
451 452 453 454 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 451 def having(*cond) raise(InvalidOperation, "Can only specify a HAVING clause on a grouped dataset") unless @opts[:group] super end |
#quoted_identifier(c) ⇒ Object
SQLite uses the nonstandard ‘ (backtick) for quoting identifiers.
457 458 459 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 457 def quoted_identifier(c) "`#{c}`" end |
#select(*cols) ⇒ Object
When a qualified column is selected on SQLite and the qualifier is a subselect, the column name used is the full qualified name (including the qualifier) instead of just the column name. To get correct column names, you must use an alias.
465 466 467 468 469 470 471 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 465 def select(*cols) if ((f = @opts[:from]) && f.any?{|t| t.is_a?(Dataset) || (t.is_a?(SQL::AliasedExpression) && t.expression.is_a?(Dataset))}) || ((j = @opts[:join]) && j.any?{|t| t.table.is_a?(Dataset)}) super(*cols.map{|c| alias_qualified_column(c)}) else super end end |
#supports_intersect_except_all? ⇒ Boolean
SQLite does not support INTERSECT ALL or EXCEPT ALL
474 475 476 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 474 def supports_intersect_except_all? false end |
#supports_is_true? ⇒ Boolean
SQLite does not support IS TRUE
479 480 481 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 479 def supports_is_true? false end |
#supports_multiple_column_in? ⇒ Boolean
SQLite does not support multiple columns for the IN/NOT IN operators
484 485 486 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 484 def supports_multiple_column_in? false end |
#supports_timestamp_timezones? ⇒ Boolean
SQLite supports timezones in literal timestamps, since it stores them as text. But using timezones in timestamps breaks SQLite datetime functions, so we allow the user to override the default per database.
491 492 493 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 491 def db. end |
#supports_where_true? ⇒ Boolean
SQLite cannot use WHERE ‘t’.
496 497 498 |
# File 'lib/sequel/adapters/shared/sqlite.rb', line 496 def supports_where_true? false end |