orm: limit
parent
f8f2fa246e
commit
f073ffa4ad
|
@ -168,6 +168,12 @@ fn test_orm_sqlite() {
|
||||||
}
|
}
|
||||||
assert no_user.name == '' // TODO optional
|
assert no_user.name == '' // TODO optional
|
||||||
assert no_user.age == 0
|
assert no_user.age == 0
|
||||||
|
//
|
||||||
|
two_users := sql db {
|
||||||
|
select from User limit 2
|
||||||
|
}
|
||||||
|
assert two_users.len == 2
|
||||||
|
assert two_users[0].id > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
struct User {
|
struct User {
|
||||||
|
|
|
@ -106,7 +106,7 @@ pub:
|
||||||
field_name string
|
field_name string
|
||||||
pub mut:
|
pub mut:
|
||||||
expr_type table.Type // type of `Foo` in `Foo.bar`
|
expr_type table.Type // type of `Foo` in `Foo.bar`
|
||||||
typ table.Type // type of the entire thing (`Foo.bar`)
|
typ table.Type // type of the entire thing (`Foo.bar`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// module declaration
|
// module declaration
|
||||||
|
@ -211,10 +211,10 @@ pub:
|
||||||
|
|
||||||
pub struct AnonFn {
|
pub struct AnonFn {
|
||||||
pub:
|
pub:
|
||||||
decl FnDecl
|
decl FnDecl
|
||||||
is_called bool
|
is_called bool
|
||||||
pub mut:
|
pub mut:
|
||||||
typ table.Type
|
typ table.Type
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FnDecl {
|
pub struct FnDecl {
|
||||||
|
@ -809,7 +809,6 @@ pub enum SqlExprKind {
|
||||||
update
|
update
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub enum SqlStmtKind {
|
pub enum SqlStmtKind {
|
||||||
insert
|
insert
|
||||||
update
|
update
|
||||||
|
@ -818,32 +817,36 @@ pub enum SqlStmtKind {
|
||||||
|
|
||||||
pub struct SqlStmt {
|
pub struct SqlStmt {
|
||||||
pub:
|
pub:
|
||||||
kind SqlStmtKind
|
kind SqlStmtKind
|
||||||
db_expr Expr // `db` in `sql db {`
|
db_expr Expr // `db` in `sql db {`
|
||||||
object_var_name string // `user`
|
object_var_name string // `user`
|
||||||
table_type table.Type
|
table_type table.Type
|
||||||
pos token.Position
|
pos token.Position
|
||||||
where_expr Expr
|
where_expr Expr
|
||||||
updated_columns []string //for `update set x=y`
|
updated_columns []string // for `update set x=y`
|
||||||
update_exprs []Expr//for `update`
|
update_exprs []Expr // for `update`
|
||||||
pub mut:
|
pub mut:
|
||||||
table_name string
|
table_name string
|
||||||
fields []table.Field
|
fields []table.Field
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SqlExpr {
|
pub struct SqlExpr {
|
||||||
pub:
|
pub:
|
||||||
typ table.Type
|
typ table.Type
|
||||||
is_count bool
|
is_count bool
|
||||||
db_expr Expr // `db` in `sql db {`
|
db_expr Expr // `db` in `sql db {`
|
||||||
where_expr Expr
|
where_expr Expr
|
||||||
has_where bool
|
has_where bool
|
||||||
is_array bool
|
has_offset bool
|
||||||
table_type table.Type
|
offset_expr Expr
|
||||||
pos token.Position
|
is_array bool
|
||||||
|
table_type table.Type
|
||||||
|
pos token.Position
|
||||||
|
has_limit bool
|
||||||
|
limit_expr Expr
|
||||||
pub mut:
|
pub mut:
|
||||||
table_name string
|
table_name string
|
||||||
fields []table.Field
|
fields []table.Field
|
||||||
}
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
|
@ -898,8 +901,7 @@ pub fn (expr Expr) position() token.Position {
|
||||||
InfixExpr {
|
InfixExpr {
|
||||||
left_pos := expr.left.position()
|
left_pos := expr.left.position()
|
||||||
right_pos := expr.right.position()
|
right_pos := expr.right.position()
|
||||||
if left_pos.pos == 0 ||
|
if left_pos.pos == 0 || right_pos.pos == 0 {
|
||||||
right_pos.pos == 0 {
|
|
||||||
return expr.pos
|
return expr.pos
|
||||||
}
|
}
|
||||||
return token.Position{
|
return token.Position{
|
||||||
|
|
|
@ -131,7 +131,12 @@ fn (mut g Gen) sql_select_expr(node ast.SqlExpr) {
|
||||||
if node.has_where && node.where_expr is ast.InfixExpr {
|
if node.has_where && node.where_expr is ast.InfixExpr {
|
||||||
g.expr_to_sql(node.where_expr)
|
g.expr_to_sql(node.where_expr)
|
||||||
}
|
}
|
||||||
g.writeln(' order by id"));')
|
g.write(' order by id ')
|
||||||
|
if node.has_limit {
|
||||||
|
g.write(' limit ')
|
||||||
|
g.expr_to_sql(node.limit_expr)
|
||||||
|
}
|
||||||
|
g.writeln('"));')
|
||||||
// Dump all sql parameters generated by our custom expr handler
|
// Dump all sql parameters generated by our custom expr handler
|
||||||
binds := g.sql_buf.str()
|
binds := g.sql_buf.str()
|
||||||
g.sql_buf = strings.new_builder(100)
|
g.sql_buf = strings.new_builder(100)
|
||||||
|
@ -182,7 +187,7 @@ fn (mut g Gen) sql_select_expr(node ast.SqlExpr) {
|
||||||
g.writeln('\tif (_step_res$tmp == SQLITE_ROW) ;') // another row
|
g.writeln('\tif (_step_res$tmp == SQLITE_ROW) ;') // another row
|
||||||
g.writeln('\telse if (_step_res$tmp != SQLITE_OK) break;')
|
g.writeln('\telse if (_step_res$tmp != SQLITE_OK) break;')
|
||||||
} else {
|
} else {
|
||||||
g.writeln('printf("RES: %d\\n", _step_res$tmp) ;')
|
// g.writeln('printf("RES: %d\\n", _step_res$tmp) ;')
|
||||||
g.writeln('\tif (_step_res$tmp == SQLITE_OK || _step_res$tmp == SQLITE_ROW) {')
|
g.writeln('\tif (_step_res$tmp == SQLITE_OK || _step_res$tmp == SQLITE_ROW) {')
|
||||||
}
|
}
|
||||||
for i, field in node.fields {
|
for i, field in node.fields {
|
||||||
|
|
|
@ -38,13 +38,17 @@ fn (mut p Parser) sql_expr() ast.Expr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mut has_limit := false
|
||||||
|
mut limit_expr := ast.Expr{}
|
||||||
if p.tok.kind == .name && p.tok.lit == 'limit' {
|
if p.tok.kind == .name && p.tok.lit == 'limit' {
|
||||||
// `limit 1` means that a single object is returned
|
// `limit 1` means that a single object is returned
|
||||||
p.check_name() // `limit`
|
p.check_name() // `limit`
|
||||||
if p.tok.kind == .number && p.tok.lit == '1' {
|
if p.tok.kind == .number && p.tok.lit == '1' {
|
||||||
query_one = true
|
query_one = true
|
||||||
|
} else {
|
||||||
|
has_limit = true
|
||||||
}
|
}
|
||||||
p.next()
|
limit_expr = p.expr(0)
|
||||||
}
|
}
|
||||||
if !query_one && !is_count {
|
if !query_one && !is_count {
|
||||||
// return an array
|
// return an array
|
||||||
|
@ -63,6 +67,8 @@ fn (mut p Parser) sql_expr() ast.Expr {
|
||||||
table_type: table_type
|
table_type: table_type
|
||||||
where_expr: where_expr
|
where_expr: where_expr
|
||||||
has_where: has_where
|
has_where: has_where
|
||||||
|
has_limit: has_limit
|
||||||
|
limit_expr: limit_expr
|
||||||
is_array: !query_one
|
is_array: !query_one
|
||||||
pos: pos
|
pos: pos
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue