Class: ActiveRecord::ConnectionAdapters::SQLite2Adapter

Inherits:
SQLiteAdapter show all
Defined in:
lib/active_record/connection_adapters/sqlite_adapter.rb

Overview

:nodoc:

Direct Known Subclasses

DeprecatedSQLiteAdapter

Instance Method Summary collapse

Methods inherited from SQLiteAdapter

#adapter_name, #add_column, #begin_db_transaction, #change_column, #change_column_default, #columns, #commit_db_transaction, #delete, #indexes, #insert, #native_database_types, #primary_key, #quote_column_name, #quote_string, #remove_column, #remove_index, #rename_column, #rename_table, #rollback_db_transaction, #select_all, #select_one, #supports_count_distinct?, #supports_migrations?, #tables, #update

Methods inherited from AbstractAdapter

#clear_query_cache

Instance Method Details

#execute(sql, name = nil) ⇒ Object

SQLite 2 does not support COUNT(DISTINCT) queries:

select COUNT(DISTINCT ArtistID) from CDs;

In order to get the number of artists we execute the following statement

SELECT COUNT(ArtistID) FROM (SELECT DISTINCT ArtistID FROM CDs);


354
355
356
# File 'lib/active_record/connection_adapters/sqlite_adapter.rb', line 354

def execute(sql, name = nil) #:nodoc:
  super(rewrite_count_distinct_queries(sql), name)
end

#rewrite_count_distinct_queries(sql) ⇒ Object



358
359
360
361
362
363
364
365
366
367
# File 'lib/active_record/connection_adapters/sqlite_adapter.rb', line 358

def rewrite_count_distinct_queries(sql)
  if sql =~ /count\(distinct ([^\)]+)\)( AS \w+)? (.*)/i
    distinct_column = $1
    distinct_query  = $3
    column_name     = distinct_column.split('.').last
    "SELECT COUNT(#{column_name}) FROM (SELECT DISTINCT #{distinct_column} #{distinct_query})"
  else
    sql
  end
end