Skip to content

Commit caf631b

Browse files
committed
Make Fetch Happen!
Used the `base_test_sqlserver.rb` to get basic query support working. * Teardown our Arel visitor!!! Fetch now happens. Will build up form here. * Teardown quoting.rb to basics. Will build from here. * Use abstract adapter `lookup_cast_type` and pass `cast_type` when building column objects now. * TODO: I will be building out new Type objects that allow TinyTDS to win at native casting. * Simplify our column object. Remove 2008 hacks and need for so much out of scope reflection.
1 parent e7c257a commit caf631b

File tree

10 files changed

+106
-596
lines changed

10 files changed

+106
-596
lines changed

lib/active_record/connection_adapters/sqlserver/quoting.rb

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,10 @@ module ActiveRecord
22
module ConnectionAdapters
33
module Sqlserver
44
module Quoting
5-
QUOTED_TRUE, QUOTED_FALSE = '1', '0'
6-
QUOTED_STRING_PREFIX = 'N'
7-
8-
def quote(value, column = nil)
9-
case value
10-
when String, ActiveSupport::Multibyte::Chars
11-
if column && column.type == :integer && value.blank?
12-
value.to_i.to_s
13-
elsif column && column.type == :binary
14-
column.class.string_to_binary(value)
15-
elsif column && [:uuid, :uniqueidentifier].include?(column.type)
16-
"'#{quote_string(value)}'"
17-
elsif value.is_utf8? || (column && column.type == :string)
18-
"#{quoted_string_prefix}'#{quote_string(value)}'"
19-
else
20-
super
21-
end
22-
when Date, Time
23-
if column && column.sql_type == 'datetime'
24-
"'#{quoted_datetime(value)}'"
25-
elsif column && (column.sql_type == 'datetimeoffset' || column.sql_type == 'time')
26-
"'#{quoted_full_iso8601(value)}'"
27-
else
28-
super
29-
end
30-
when nil
31-
column.respond_to?(:sql_type) && column.sql_type == 'timestamp' ? 'DEFAULT' : super
32-
else
33-
super
34-
end
35-
end
365

37-
def quoted_string_prefix
38-
QUOTED_STRING_PREFIX
39-
end
6+
QUOTED_TRUE = '1'
7+
QUOTED_FALSE = '0'
8+
QUOTED_STRING_PREFIX = 'N'
409

4110
def quote_string(s)
4211
Sqlserver::Utils.quote_string(s)
@@ -46,11 +15,6 @@ def quote_column_name(name)
4615
Sqlserver::Utils.extract_identifiers(name).object_quoted
4716
end
4817

49-
def quote_table_name(name)
50-
quote_column_name(name)
51-
end
52-
53-
# Does not quote function default values for UUID columns
5418
def quote_default_value(value, column)
5519
if column.type == :uuid && value =~ /\(\)/
5620
value
@@ -59,22 +23,27 @@ def quote_default_value(value, column)
5923
end
6024
end
6125

62-
def substitute_at(column, index)
63-
if column.respond_to?(:sql_type) && column.sql_type == 'timestamp'
64-
nil
65-
else
66-
Arel::Nodes::BindParam.new "@#{index}"
67-
end
26+
def substitute_at(column, _unused = 0)
27+
return nil if column.respond_to?(:sql_type) && column.sql_type == 'timestamp'
28+
super
6829
end
6930

7031
def quoted_true
7132
QUOTED_TRUE
7233
end
7334

35+
def unquoted_true
36+
1
37+
end
38+
7439
def quoted_false
7540
QUOTED_FALSE
7641
end
7742

43+
def unquoted_false
44+
0
45+
end
46+
7847
def quoted_datetime(value)
7948
if value.acts_like?(:time)
8049
time_zone_qualified_value = quoted_value_acts_like_time_filter(value)
@@ -106,12 +75,27 @@ def quoted_date(value)
10675
end
10776
end
10877

109-
protected
78+
79+
private
80+
81+
def _quote(value) # , column = nil
82+
case value
83+
when String, ActiveSupport::Multibyte::Chars
84+
if value.is_utf8?
85+
"#{QUOTED_STRING_PREFIX}#{super}"
86+
else
87+
super
88+
end
89+
else
90+
super(value)
91+
end
92+
end
11093

11194
def quoted_value_acts_like_time_filter(value)
11295
zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
11396
value.respond_to?(zone_conversion_method) ? value.send(zone_conversion_method) : value
11497
end
98+
11599
end
116100
end
117101
end

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module ActiveRecord
22
module ConnectionAdapters
33
module Sqlserver
44
module SchemaStatements
5+
56
def native_database_types
67
@native_database_types ||= initialize_native_database_types.freeze
78
end
@@ -45,10 +46,15 @@ def columns(table_name, _name = nil)
4546
return [] if table_name.blank?
4647
column_definitions(table_name).map do |ci|
4748
sqlserver_options = ci.except(:name, :default_value, :type, :null).merge(database_year: database_year)
48-
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
49+
cast_type = lookup_cast_type(ci[:type])
50+
new_column ci[:name], ci[:default_value], cast_type, ci[:type], ci[:null], sqlserver_options
4951
end
5052
end
5153

54+
def new_column(name, default, cast_type, sql_type = nil, null = true, sqlserver_options={})
55+
SQLServerColumn.new name, default, cast_type, sql_type, null, sqlserver_options
56+
end
57+
5258
# like postgres, sqlserver requires the ORDER BY columns in the select list for distinct queries, and
5359
# requires that the ORDER BY include the distinct column. Unfortunately, sqlserver does not support
5460
# DISTINCT ON () like Posgres, or FIRST_VALUE() like Oracle (at least before SQL Server 2012). Because
@@ -417,6 +423,7 @@ def identity_column(table_name)
417423
def create_table_definition(name, temporary, options, as = nil)
418424
TableDefinition.new native_database_types, name, temporary, options, as
419425
end
426+
420427
end
421428
end
422429
end

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require 'base64'
22
require 'active_record'
3-
require 'arel/arel_sqlserver'
3+
require 'arel_sqlserver'
44
require 'active_record/connection_adapters/abstract_adapter'
55
require 'active_record/connection_adapters/sqlserver/core_ext/active_record'
66
require 'active_record/connection_adapters/sqlserver/core_ext/explain'
@@ -42,10 +42,6 @@ class SQLServerAdapter < AbstractAdapter
4242

4343
self.enable_default_unicode_types = true
4444

45-
class BindSubstitution < Arel::Visitors::SQLServer # :nodoc:
46-
include Arel::Visitors::BindVisitor
47-
end
48-
4945
def initialize(connection, logger, pool, config)
5046
super(connection, logger, pool)
5147
# AbstractAdapter Responsibility

lib/active_record/connection_adapters/sqlserver_column.rb

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
module ActiveRecord
22
module ConnectionAdapters
33
class SQLServerColumn < Column
4-
def initialize(name, default, sql_type = nil, null = true, sqlserver_options = {})
4+
5+
def initialize(name, default, cast_type, sql_type = nil, null = true, sqlserver_options = {})
56
@sqlserver_options = sqlserver_options.symbolize_keys
6-
super(name, default, sql_type, null)
7+
super(name, default, cast_type, sql_type, null)
78
@primary = @sqlserver_options[:is_identity] || @sqlserver_options[:is_primary]
89
end
910

@@ -52,22 +53,6 @@ def default_function
5253
@sqlserver_options[:default_function]
5354
end
5455

55-
def table_name
56-
@sqlserver_options[:table_name]
57-
end
58-
59-
def table_klass
60-
@table_klass ||= begin
61-
table_name.classify.constantize
62-
rescue StandardError, NameError, LoadError
63-
nil
64-
end
65-
(@table_klass && @table_klass < ActiveRecord::Base) ? @table_klass : nil
66-
end
67-
68-
def database_year
69-
@sqlserver_options[:database_year]
70-
end
7156

7257
private
7358

@@ -93,24 +78,13 @@ def simplified_type(field_type)
9378
when /image/i then :binary
9479
when /bit/i then :boolean
9580
when /uniqueidentifier/i then :uuid
96-
when /datetime/i then simplified_datetime
81+
when /datetime/i then :datetime
9782
when /varchar\(max\)/ then :text
9883
when /timestamp/ then :binary
9984
else super
10085
end
10186
end
10287

103-
def simplified_datetime
104-
if database_year >= 2008
105-
:datetime
106-
elsif table_klass && table_klass.coerced_sqlserver_date_columns.include?(name)
107-
:date
108-
elsif table_klass && table_klass.coerced_sqlserver_time_columns.include?(name)
109-
:time
110-
else
111-
:datetime
112-
end
113-
end
114-
end # class SQLServerColumn
115-
end # module ConnectionAdapters
116-
end # module ActiveRecord
88+
end
89+
end
90+
end

lib/arel/nodes_sqlserver.rb

Lines changed: 0 additions & 14 deletions
This file was deleted.

lib/arel/select_manager_sqlserver.rb

Lines changed: 0 additions & 62 deletions
This file was deleted.

0 commit comments

Comments
 (0)