         if call.args.length == 0
             return prologue + epilogue
 
-        @doList(call.args, @_doAtom, ', ', prologue, epilogue)
+        @doList(call.args, @_doColumnAtom, ', ', prologue, epilogue)
 
 
     doList: (collection, fn = @f, separator = ', ', prologue = '', epilogue = '') ->

    column: (c) ->
        atom = _.firstOrSelf(c)
        alias = _.secondOrNull(c)
        return @_doAtom(atom, alias, true)

    _doAtom: (atom, alias, addAlias = false) ->
        token = @tokenizeAtom(atom)
        schema = @_findColumnSchema(token)
        s = @_doToken(token, schema)

        if addAlias
            alias = @_doAlias(token, schema, alias)
            if (alias? && alias != schema?.name)
                s += " as #{@delimit(alias)}"

        return s

    _doToken: (token, schema) ->
        if (schema?)

        names = []
        values = []
        for k, v of i.values
            c = @_doColumnAtom(k, @_doInsertUpdateColumn)
            continue unless c
            names.push(c)
            values.push(@f(v))

        ret += " (#{names.join(', ')}) VALUES (#{values.join(', ')})"

    update: (u) ->
        ret = "UPDATE #{@_doTargetTable(u.targetTable)} SET "

        values = []
        for k, v of u.values
            c = @_doColumnAtom(k, @_doInsertUpdateColumn)
            continue unless c
            values.push("#{c} = #{@f(v)}")

        ret += values.join(', ')

        ret += @where(u)
        return ret

    _doInsertUpdateColumn: (token, columnSchema, s) ->
        if @targetTableSchema? && (not columnSchema? || columnSchema.isReadOnly)
            return false

        return @_doToken(token, columnSchema)

    delete: (d) ->
        ret = "DELETE FROM #{@_doTargetTable(d.targetTable)}"
