Module | Sequel::MySQL::DatasetMethods |
In: |
lib/sequel_core/adapters/shared/mysql.rb
|
BOOL_TRUE | = | '1'.freeze |
BOOL_FALSE | = | '0'.freeze |
COMMA_SEPARATOR | = | ', '.freeze |
MySQL specific syntax for LIKE/REGEXP searches, as well as string concatenation.
# File lib/sequel_core/adapters/shared/mysql.rb, line 153 153: def complex_expression_sql(op, args) 154: case op 155: when :~, '!~''!~', '~*''~*', '!~*''!~*', :LIKE, 'NOT LIKE''NOT LIKE', :ILIKE, 'NOT ILIKE''NOT ILIKE' 156: "(#{literal(args.at(0))} #{'NOT ' if [:'NOT LIKE', :'NOT ILIKE', :'!~', :'!~*'].include?(op)}#{[:~, :'!~', :'~*', :'!~*'].include?(op) ? 'REGEXP' : 'LIKE'} #{'BINARY ' if [:~, :'!~', :LIKE, :'NOT LIKE'].include?(op)}#{literal(args.at(1))})" 157: when '||''||' 158: if args.length > 1 159: "CONCAT(#{args.collect{|a| literal(a)}.join(', ')})" 160: else 161: literal(args.at(0)) 162: end 163: else 164: super(op, args) 165: end 166: end
MySQL supports ORDER and LIMIT clauses in DELETE statements.
# File lib/sequel_core/adapters/shared/mysql.rb, line 169 169: def delete_sql(opts = nil) 170: sql = super 171: opts = opts ? @opts.merge(opts) : @opts 172: 173: if order = opts[:order] 174: sql << " ORDER BY #{expression_list(order)}" 175: end 176: if limit = opts[:limit] 177: sql << " LIMIT #{limit}" 178: end 179: 180: sql 181: end
MySQL specific full text search syntax.
# File lib/sequel_core/adapters/shared/mysql.rb, line 184 184: def full_text_search(cols, terms, opts = {}) 185: mode = opts[:boolean] ? " IN BOOLEAN MODE" : "" 186: s = if Array === terms 187: if mode.blank? 188: "MATCH #{literal(Array(cols))} AGAINST #{literal(terms)}" 189: else 190: "MATCH #{literal(Array(cols))} AGAINST (#{literal(terms)[1...-1]}#{mode})" 191: end 192: else 193: "MATCH #{literal(Array(cols))} AGAINST (#{literal(terms)}#{mode})" 194: end 195: filter(s) 196: end
Transforms an CROSS JOIN to an INNER JOIN if the expr is not nil. Raises an error on use of :full_outer type, since MySQL doesn‘t support it.
# File lib/sequel_core/adapters/shared/mysql.rb, line 211 211: def join_table(type, table, expr=nil, table_alias={}) 212: type = :inner if (type == :cross) && !expr.nil? 213: raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN") if type == :full_outer 214: super(type, table, expr, table_alias) 215: end
Transforms :natural_inner to NATURAL LEFT JOIN and straight to STRAIGHT_JOIN.
# File lib/sequel_core/adapters/shared/mysql.rb, line 219 219: def join_type_sql(join_type) 220: case join_type 221: when :straight then 'STRAIGHT_JOIN' 222: when :natural_inner then 'NATURAL LEFT JOIN' 223: else super 224: end 225: end
Override the default boolean values.
# File lib/sequel_core/adapters/shared/mysql.rb, line 228 228: def literal(v) 229: case v 230: when true 231: BOOL_TRUE 232: when false 233: BOOL_FALSE 234: when DateTime, Time 235: v.strftime("'%Y-%m-%d %H:%M:%S'") 236: else 237: super 238: end 239: end
MySQL specific syntax for inserting multiple values at once.
# File lib/sequel_core/adapters/shared/mysql.rb, line 242 242: def multi_insert_sql(columns, values) 243: values = values.map {|r| literal(Array(r))}.join(COMMA_SEPARATOR) 244: ["INSERT INTO #{source_list(@opts[:from])} (#{identifier_list(columns)}) VALUES #{values}"] 245: end
MySQL specific syntax for REPLACE (aka UPSERT, or update if exists, insert if it doesn‘t).
# File lib/sequel_core/adapters/shared/mysql.rb, line 254 254: def replace_sql(*values) 255: from = source_list(@opts[:from]) 256: if values.empty? 257: "REPLACE INTO #{from} DEFAULT VALUES" 258: else 259: values = values[0] if values.size == 1 260: 261: # if hash or array with keys we need to transform the values 262: if @transform && (values.is_a?(Hash) || (values.is_a?(Array) && values.keys)) 263: values = transform_save(values) 264: end 265: 266: case values 267: when Array 268: if values.empty? 269: "REPLACE INTO #{from} DEFAULT VALUES" 270: else 271: "REPLACE INTO #{from} VALUES #{literal(values)}" 272: end 273: when Hash 274: if values.empty? 275: "REPLACE INTO #{from} DEFAULT VALUES" 276: else 277: fl, vl = [], [] 278: values.each {|k, v| fl << literal(k.is_a?(String) ? k.to_sym : k); vl << literal(v)} 279: "REPLACE INTO #{from} (#{fl.join(COMMA_SEPARATOR)}) VALUES (#{vl.join(COMMA_SEPARATOR)})" 280: end 281: when Dataset 282: "REPLACE INTO #{from} #{literal(values)}" 283: else 284: if values.respond_to?(:values) 285: replace_sql(values.values) 286: else 287: "REPLACE INTO #{from} VALUES (#{literal(values)})" 288: end 289: end 290: end 291: end
MySQL supports ORDER and LIMIT clauses in UPDATE statements.
# File lib/sequel_core/adapters/shared/mysql.rb, line 294 294: def update_sql(values, opts = nil) 295: sql = super 296: opts = opts ? @opts.merge(opts) : @opts 297: 298: if order = opts[:order] 299: sql << " ORDER BY #{expression_list(order)}" 300: end 301: if limit = opts[:limit] 302: sql << " LIMIT #{limit}" 303: end 304: 305: sql 306: end