Skip to content

Commit 1569a82

Browse files
authored
orm: support lowercase operators like, in, not in etc (fix #25032) (#25035)
1 parent d249bfb commit 1569a82

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

‎vlib/orm/orm_func.v‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,18 @@ fn (mut ss MyTextScanner) next_tok() string {
9393
mut ret := ''
9494
ss.skip_whitespace()
9595
ss.last_tok_start = ss.pos
96+
ss_upper := ss.input.to_upper()
9697

9798
// check for longest token first
98-
if ss.input[ss.pos..].starts_with('IS NOT NULL') {
99+
if ss_upper[ss.pos..].starts_with('IS NOT NULL') {
99100
ss.pos += 11
100101
return 'IS NOT NULL'
101102
}
102-
if ss.input[ss.pos..].starts_with('IS NULL') {
103+
if ss_upper[ss.pos..].starts_with('IS NULL') {
103104
ss.pos += 7
104105
return 'IS NULL'
105106
}
106-
if ss.input[ss.pos..].starts_with('NOT IN') {
107+
if ss_upper[ss.pos..].starts_with('NOT IN') {
107108
ss.pos += 6
108109
return 'NOT IN'
109110
}
@@ -186,7 +187,7 @@ fn (qb_ &QueryBuilder[T]) parse_conditions(conds string, params []Primitive) ! {
186187
}
187188
}
188189
.op {
189-
current_op = match tok {
190+
current_op = match tok.to_upper() {
190191
'=' {
191192
OperationKind.eq
192193
}

‎vlib/orm/orm_func_test.v‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ fn test_orm_func_where() {
8686
qb.where('(salary >= ? AND (age <= ? OR title LIKE ?))', 50000, 35, '%Manager%')!
8787
assert qb.where.parentheses == [[1, 2], [0, 2]]
8888

89+
// test lowercase `like`
90+
qb.reset()
91+
qb.where('(salary >= ? AND (age <= ? OR title like ?))', 50000, 35, '%Manager%')!
92+
assert qb.where.parentheses == [[1, 2], [0, 2]]
93+
assert qb.where.kinds == [.ge, .le, .orm_like]
94+
8995
// complex_nesting
9096
qb.reset()
9197
qb.where('((age = ? OR (salary > ? AND id < ?)) AND (name LIKE ?))', 1, 2, 3, '%test%')!
@@ -96,6 +102,12 @@ fn test_orm_func_where() {
96102
qb.where('name IN ? AND age NOT IN ?', ['Tom'], [2])!
97103
assert qb.where.fields == ['name', 'age']
98104
assert qb.where.kinds == [.in, .not_in]
105+
106+
// lowercase in and not in
107+
qb.reset()
108+
qb.where('name in ? AND age not in ?', ['Tom'], [2])!
109+
assert qb.where.fields == ['name', 'age']
110+
assert qb.where.kinds == [.in, .not_in]
99111
}
100112

101113
fn test_orm_func_stmts() {
@@ -503,6 +515,12 @@ fn test_orm_func_stmts() {
503515
assert selected_users[0].name == 'Silly'
504516
assert selected_users.len == 1
505517

518+
// complex select with lowercase `is null` and `like`
519+
selected_users1 := qb.where('created_at is null && ((salary > ? && age < ?) || (role like ?))',
520+
2000, 30, '%employee%')!.query()!
521+
assert selected_users1[0].name == 'Silly'
522+
assert selected_users1.len == 1
523+
506524
// chain where
507525
and_where := qb.where('salary > ?', 2000)!.where('age > ?', 40)!.query()!
508526
assert and_where.len == 1

0 commit comments

Comments
 (0)