mirror of
https://github.com/vlang/v.git
synced 2025-09-10 07:47:20 -04:00
This commit is contained in:
parent
d249bfb04e
commit
1569a821cd
@ -93,17 +93,18 @@ fn (mut ss MyTextScanner) next_tok() string {
|
|||||||
mut ret := ''
|
mut ret := ''
|
||||||
ss.skip_whitespace()
|
ss.skip_whitespace()
|
||||||
ss.last_tok_start = ss.pos
|
ss.last_tok_start = ss.pos
|
||||||
|
ss_upper := ss.input.to_upper()
|
||||||
|
|
||||||
// check for longest token first
|
// check for longest token first
|
||||||
if ss.input[ss.pos..].starts_with('IS NOT NULL') {
|
if ss_upper[ss.pos..].starts_with('IS NOT NULL') {
|
||||||
ss.pos += 11
|
ss.pos += 11
|
||||||
return 'IS NOT NULL'
|
return 'IS NOT NULL'
|
||||||
}
|
}
|
||||||
if ss.input[ss.pos..].starts_with('IS NULL') {
|
if ss_upper[ss.pos..].starts_with('IS NULL') {
|
||||||
ss.pos += 7
|
ss.pos += 7
|
||||||
return 'IS NULL'
|
return 'IS NULL'
|
||||||
}
|
}
|
||||||
if ss.input[ss.pos..].starts_with('NOT IN') {
|
if ss_upper[ss.pos..].starts_with('NOT IN') {
|
||||||
ss.pos += 6
|
ss.pos += 6
|
||||||
return 'NOT IN'
|
return 'NOT IN'
|
||||||
}
|
}
|
||||||
@ -186,7 +187,7 @@ fn (qb_ &QueryBuilder[T]) parse_conditions(conds string, params []Primitive) ! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.op {
|
.op {
|
||||||
current_op = match tok {
|
current_op = match tok.to_upper() {
|
||||||
'=' {
|
'=' {
|
||||||
OperationKind.eq
|
OperationKind.eq
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,12 @@ fn test_orm_func_where() {
|
|||||||
qb.where('(salary >= ? AND (age <= ? OR title LIKE ?))', 50000, 35, '%Manager%')!
|
qb.where('(salary >= ? AND (age <= ? OR title LIKE ?))', 50000, 35, '%Manager%')!
|
||||||
assert qb.where.parentheses == [[1, 2], [0, 2]]
|
assert qb.where.parentheses == [[1, 2], [0, 2]]
|
||||||
|
|
||||||
|
// test lowercase `like`
|
||||||
|
qb.reset()
|
||||||
|
qb.where('(salary >= ? AND (age <= ? OR title like ?))', 50000, 35, '%Manager%')!
|
||||||
|
assert qb.where.parentheses == [[1, 2], [0, 2]]
|
||||||
|
assert qb.where.kinds == [.ge, .le, .orm_like]
|
||||||
|
|
||||||
// complex_nesting
|
// complex_nesting
|
||||||
qb.reset()
|
qb.reset()
|
||||||
qb.where('((age = ? OR (salary > ? AND id < ?)) AND (name LIKE ?))', 1, 2, 3, '%test%')!
|
qb.where('((age = ? OR (salary > ? AND id < ?)) AND (name LIKE ?))', 1, 2, 3, '%test%')!
|
||||||
@ -96,6 +102,12 @@ fn test_orm_func_where() {
|
|||||||
qb.where('name IN ? AND age NOT IN ?', ['Tom'], [2])!
|
qb.where('name IN ? AND age NOT IN ?', ['Tom'], [2])!
|
||||||
assert qb.where.fields == ['name', 'age']
|
assert qb.where.fields == ['name', 'age']
|
||||||
assert qb.where.kinds == [.in, .not_in]
|
assert qb.where.kinds == [.in, .not_in]
|
||||||
|
|
||||||
|
// lowercase in and not in
|
||||||
|
qb.reset()
|
||||||
|
qb.where('name in ? AND age not in ?', ['Tom'], [2])!
|
||||||
|
assert qb.where.fields == ['name', 'age']
|
||||||
|
assert qb.where.kinds == [.in, .not_in]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_orm_func_stmts() {
|
fn test_orm_func_stmts() {
|
||||||
@ -503,6 +515,12 @@ fn test_orm_func_stmts() {
|
|||||||
assert selected_users[0].name == 'Silly'
|
assert selected_users[0].name == 'Silly'
|
||||||
assert selected_users.len == 1
|
assert selected_users.len == 1
|
||||||
|
|
||||||
|
// complex select with lowercase `is null` and `like`
|
||||||
|
selected_users1 := qb.where('created_at is null && ((salary > ? && age < ?) || (role like ?))',
|
||||||
|
2000, 30, '%employee%')!.query()!
|
||||||
|
assert selected_users1[0].name == 'Silly'
|
||||||
|
assert selected_users1.len == 1
|
||||||
|
|
||||||
// chain where
|
// chain where
|
||||||
and_where := qb.where('salary > ?', 2000)!.where('age > ?', 40)!.query()!
|
and_where := qb.where('salary > ?', 2000)!.where('age > ?', 40)!.query()!
|
||||||
assert and_where.len == 1
|
assert and_where.len == 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user