module Sequel::Access::DatasetMethods
Constants
- CAST_TYPES
- EXTRACT_MAP
- OPS
Public Instance Methods
Access
doesn't support CASE, so emulate it with nested IIF function calls.
# File lib/sequel/adapters/shared/access.rb 95 def case_expression_sql_append(sql, ce) 96 literal_append(sql, ce.with_merged_expression.conditions.reverse.inject(ce.default){|exp,(cond,val)| Sequel::SQL::Function.new(:IIF, cond, val, exp)}) 97 end
Access
doesn't support CAST, it uses separate functions for type conversion
# File lib/sequel/adapters/shared/access.rb 101 def cast_sql_append(sql, expr, type) 102 sql << CAST_TYPES.fetch(type, type).to_s 103 sql << '(' 104 literal_append(sql, expr) 105 sql << ')' 106 end
# File lib/sequel/adapters/shared/access.rb 108 def complex_expression_sql_append(sql, op, args) 109 case op 110 when :ILIKE 111 complex_expression_sql_append(sql, :LIKE, args) 112 when :'NOT ILIKE' 113 complex_expression_sql_append(sql, :'NOT LIKE', args) 114 when :'!=' 115 sql << '(' 116 literal_append(sql, args[0]) 117 sql << ' <> ' 118 literal_append(sql, args[1]) 119 sql << ')' 120 when :'%', :'||' 121 sql << '(' 122 c = false 123 op_str = OPS[op] 124 args.each do |a| 125 sql << op_str if c 126 literal_append(sql, a) 127 c ||= true 128 end 129 sql << ')' 130 when :** 131 sql << '(' 132 literal_append(sql, args[0]) 133 sql << ' ^ ' 134 literal_append(sql, args[1]) 135 sql << ')' 136 when :extract 137 part = args[0] 138 raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part] 139 sql << "datepart(" << format.to_s << ', ' 140 literal_append(sql, args[1]) 141 sql << ')' 142 else 143 super 144 end 145 end
Use Date(), Now(), and Time() for CURRENT_DATE, CURRENT_TIMESTAMP, and CURRENT_TIME
# File lib/sequel/adapters/shared/access.rb 148 def constant_sql_append(sql, constant) 149 case constant 150 when :CURRENT_DATE 151 sql << 'Date()' 152 when :CURRENT_TIMESTAMP 153 sql << 'Now()' 154 when :CURRENT_TIME 155 sql << 'Time()' 156 else 157 super 158 end 159 end
Emulate cross join by using multiple tables in the FROM clause.
# File lib/sequel/adapters/shared/access.rb 162 def cross_join(table) 163 clone(:from=>@opts[:from] + [table]) 164 end
Access
uses [] to escape metacharacters, instead of backslashes.
# File lib/sequel/adapters/shared/access.rb 167 def escape_like(string) 168 string.gsub(/[\\*#?\[]/){|m| "[#{m}]"} 169 end
Specify a table for a SELECT … INTO query.
# File lib/sequel/adapters/shared/access.rb 172 def into(table) 173 clone(:into => table) 174 end
Access
uses [] for quoting identifiers, and can't handle ] inside identifiers.
# File lib/sequel/adapters/shared/access.rb 178 def quoted_identifier_append(sql, v) 179 sql << '[' << v.to_s << ']' 180 end
Access
does not support derived column lists.
# File lib/sequel/adapters/shared/access.rb 183 def supports_derived_column_lists? 184 false 185 end
Access
doesn't support INTERSECT or EXCEPT
# File lib/sequel/adapters/shared/access.rb 188 def supports_intersect_except? 189 false 190 end
Access
does not support IS TRUE
# File lib/sequel/adapters/shared/access.rb 193 def supports_is_true? 194 false 195 end
Access
doesn't support JOIN USING
# File lib/sequel/adapters/shared/access.rb 198 def supports_join_using? 199 false 200 end
Access
does not support multiple columns for the IN/NOT IN operators
# File lib/sequel/adapters/shared/access.rb 203 def supports_multiple_column_in? 204 false 205 end
Access
doesn't support truncate, so do a delete instead.
# File lib/sequel/adapters/shared/access.rb 208 def truncate 209 delete 210 nil 211 end
Private Instance Methods
Access
uses # to quote dates
# File lib/sequel/adapters/shared/access.rb 216 def literal_date(d) 217 d.strftime('#%Y-%m-%d#') 218 end
Access
uses # to quote datetimes
# File lib/sequel/adapters/shared/access.rb 221 def literal_datetime(t) 222 t.strftime('#%Y-%m-%d %H:%M:%S#') 223 end
Use 0 for false on MSSQL
# File lib/sequel/adapters/shared/access.rb 227 def literal_false 228 '0' 229 end
Use -1 for true on MSSQL
# File lib/sequel/adapters/shared/access.rb 232 def literal_true 233 '-1' 234 end
Emulate the char_length function with len
# File lib/sequel/adapters/shared/access.rb 237 def native_function_name(emulated_function) 238 if emulated_function == :char_length 239 'len' 240 else 241 super 242 end 243 end
Access
does not natively support NULLS FIRST/LAST.
# File lib/sequel/adapters/shared/access.rb 246 def requires_emulating_nulls_first? 247 true 248 end
Access
doesn't support ESCAPE for LIKE.
# File lib/sequel/adapters/shared/access.rb 251 def requires_like_escape? 252 false 253 end
Access
requires parentheses when joining more than one table
# File lib/sequel/adapters/shared/access.rb 256 def select_from_sql(sql) 257 if f = @opts[:from] 258 sql << ' FROM ' 259 if (j = @opts[:join]) && !j.empty? 260 sql << ('(' * j.length) 261 end 262 source_list_append(sql, f) 263 end 264 end
# File lib/sequel/adapters/shared/access.rb 266 def select_into_sql(sql) 267 if i = @opts[:into] 268 sql << " INTO " 269 identifier_append(sql, i) 270 end 271 end
Access
requires parentheses when joining more than one table
# File lib/sequel/adapters/shared/access.rb 274 def select_join_sql(sql) 275 if js = @opts[:join] 276 js.each do |j| 277 literal_append(sql, j) 278 sql << ')' 279 end 280 end 281 end
Access
uses TOP for limits
# File lib/sequel/adapters/shared/access.rb 284 def select_limit_sql(sql) 285 if l = @opts[:limit] 286 sql << " TOP " 287 literal_append(sql, l) 288 end 289 end