pub fn (mut db DB) gen_sql() string {
mut s := strings.new_builder(200)
s.write_string('select ')
s.write_string('distinct ')
for i, f in stmt.aggregate_fn {
s.write_string('distinct ')
s.write_string('${f.name}(')
s.write_string('$f.column_name)')
if f.column_alias != '' {
s.write_string('$f.column_alias,')
if i == stmt.aggregate_fn.len - 1 {
if stmt.columns.len == 0 && stmt.aggregate_fn.len == 0 {
for i, column in stmt.columns {
s.write_string('$column.name')
s.write_string('$column.alias,')
if i == stmt.columns.len - 1 {
s.write_string('$stmt.table_name ')
if stmt.table_alias != '' {
s.write_string('as $stmt.table_alias ')
db.write_where(stmt.where, mut &s)
s.write_string('$stmt.join_raw ')
s.write_string('$j.typ ')
s.write_string('$j.table_name ')
s.write_string('as $j.table_alias ')
if j.join_condition != '' {
s.write_string('on $j.join_condition ')
s.write_string('offset $stmt.offset ')
s.write_string('limit $stmt.limit ')
if stmt.order_by_raw != '' {
s.write_string('order by ')
s.write_string('$stmt.order_by_raw ')
} else if stmt.order_by.len > 0 {
s.write_string('order by ')
s.write_string('$o.column $o.order,')
if stmt.group_by_raw != '' {
s.write_string('group by ')
s.write_string('$stmt.group_by_raw ')
} else if stmt.group_by.len > 0 {
s.write_string('group by ')
for col in stmt.group_by {
s.write_string('having $stmt.having ')
if stmt.union_stmts.len > 0 {
for us in stmt.union_stmts {
s.write_string('$stmt.union_type ')
s.write_string('insert into ')
s.write_string('$stmt.table_name ')
for key, val in stmt.data {
s.write_string(' values ')
if stmt.returning.len != 0 {
s.write_string(' returning ')
for r in stmt.returning {
s.write_string('update ')
s.write_string('$stmt.table_name ')
for key, val in stmt.data {
s.write_string("$key='$val',")
db.write_where(stmt.where, mut &s)
if stmt.returning.len != 0 {
s.write_string('returning ')
for r in stmt.returning {
s.write_string('delete from ')
s.write_string('$stmt.table_name ')
db.write_where(stmt.where, mut &s)
s.write_string('create database $stmt.db_name')
s.write_string('alter table $stmt.table_name rename to $stmt.new_table_name')
s.write_string('drop table $stmt.table_name')
s.write_string('truncate table $stmt.table_name')
pub fn (mut db DB) write_where(where []Where, mut s strings.Builder) {
if pos >= 1 && w.operator == '' {
s.write_string('$operator ($w.condition) ')
s.write_string('$operator ($w.column_name in ($range_str)) ')
s.write_string('$operator ($w.column_name is null) ')
s.write_string('$operator ($w.column_name between ${w.range[0]} and ${w.range[1]}) ')
s.write_string('$operator exists ($w.exist_stmt) ')
s.write_string(' $w.condition ')
panic('unknown where type')
pub fn (t &Table) gen_table_sql() string {
mut s := strings.new_builder(200)
s.write_string('create table $t.name (')
for column in t.columns {
s.write_string('$column.name ')
s.write_string('$column.typ ')
if column.default_value != '' {
s.write_string("default '$column.default_value' ")
s.write_string('serial ')
s.write_string('not null ')
s.write_string('primary key ')
s.write_string('unique ')
s.write_string('index $column.index ')
if column.collate != '' {
s.write_string('check ($column.check) ')
if t.primarys.len == 0 && t.uniques.len == 0 && t.checks.len == 0 {
if t.primarys.len > 0 || t.uniques.len > 0 || t.indexs.len > 0 || t.checks.len > 0 {
s.write_string('primary key (')
for column in t.primarys {
s.write_string('$column,')
s.write_string('unique (')
for column in t.uniques {
s.write_string('$column,')