Ejemplo n.º 1
0
    def visit_insert(self, insert_stmt, asfrom=False, **kw):
        assert not self.stack  # INSERT only at top level

        self.stack.append({
            "correlate_froms": set(),
            "asfrom_froms": set(),
            "selectable": insert_stmt,
        })

        preparer = self.preparer

        text = "INSERT INTO "
        table_text = preparer.format_table(insert_stmt.table)
        text += table_text

        if insert_stmt.select is not None:
            # `_setup_crud_params()` multiplies parameter placeholders for
            # multiparam inserts.  We don't want this, so this part is moved to
            # the branch for `INSERT INTO ... SELECT`.
            crud_params = crud._setup_crud_params(self, insert_stmt,
                                                  crud.ISINSERT, **kw)

            if not crud_params:  # pragma: no cover
                raise exc.CompileError(
                    "The '%s' dialect with current database "
                    "version settings does not support empty "
                    "inserts." % self.dialect.name)

            assert not insert_stmt._has_multi_parameters

            text += " (%s)" % ", ".join(
                [preparer.format_column(c[0]) for c in crud_params])

            select_text = self.process(self._insert_from_select, **kw)

            # TODO Provide visit_cte for Clickhouse variant of CTE
            if self.ctes:
                text += " %s%s" % (self._render_cte_clause(), select_text)
            else:
                text += " %s" % select_text
        else:
            # This is normally done by `crud._setup_crud_params()`
            self.isinsert = True

            self._clickhouse_json_each_row = True
            text += ' FORMAT JSONEachRow'

        assert insert_stmt._post_values_clause is None

        self.stack.pop(-1)

        assert not asfrom
        return text
Ejemplo n.º 2
0
    def visit_update(self, update_stmt, asfrom=False, **kw):
        text = 'ALTER TABLE '
        table_text = self.update_tables_clause(update_stmt, update_stmt.table,
                                               [], **kw)
        text += table_text
        text += ' UPDATE '
        crud_params = crud._setup_crud_params(self,
                                              update_stmt,
                                              crud.ISUPDATE,
                                              include_table=False,
                                              **kw)

        text += ', '.join(c[0]._compiler_dispatch(self, include_table=False) +
                          '=' + c[1] for c in crud_params)

        if update_stmt._whereclause is not None:
            t = update_stmt._whereclause._compiler_dispatch(
                self, include_table=False)
            if t:
                text += " WHERE " + t
        return text
Ejemplo n.º 3
0
    def visit_update(self, update_stmt, asfrom=False, **kw):
        toplevel = not self.stack

        self.stack.append({
            'correlate_froms': set([update_stmt.table]),
            "asfrom_froms": set([update_stmt.table]),
            "selectable": update_stmt
        })

        extra_froms = update_stmt._extra_froms

        d = {'command': 'advanced/update'}

        d['table'] = update_stmt.table.name
        if update_stmt.table.schema:
            d['schema'] = update_stmt.table.schema.name

        crud_params = crud._setup_crud_params(self, update_stmt, crud.ISUPDATE,
                                              **kw)

        include_table = extra_froms and \
            self.render_table_with_column_in_update_from

        d['fields'] = [
            c[0]._compiler_dispatch(self, include_table=include_table)
            for c in crud_params
        ]
        d['values'] = [c[1] for c in crud_params]

        if update_stmt._whereclause is not None:
            t = self.process(update_stmt._whereclause, **kw)
            if t:
                d['where'] = t

        limit = self.update_limit_clause(update_stmt)
        if limit:
            d['limit'] = limit

        return d
Ejemplo n.º 4
0
    def visit_update(self, update_stmt, asfrom=False, **kw):
        toplevel = not self.stack

        self.stack.append(
            {'correlate_froms': set([update_stmt.table]),
             "asfrom_froms": set([update_stmt.table]),
             "selectable": update_stmt})

        extra_froms = update_stmt._extra_froms

        d = {'command': 'advanced/update'}

        d['table'] = update_stmt.table.name
        if update_stmt.table.schema:
            d['schema'] = update_stmt.table.schema.name


        crud_params = crud._setup_crud_params(
            self, update_stmt, crud.ISUPDATE, **kw)

        include_table = extra_froms and \
            self.render_table_with_column_in_update_from

        d['fields'] = [c[0]._compiler_dispatch(self, include_table=include_table) for c in crud_params]
        d['values'] = [c[1] for c in crud_params]

        if update_stmt._whereclause is not None:
            t = self.process(update_stmt._whereclause, **kw)
            if t:
                d['where'] = t

        limit = self.update_limit_clause(update_stmt)
        if limit:
            d['limit'] = limit

        return d
Ejemplo n.º 5
0
    def visit_insert(self, insert_stmt, asfrom=False, **kw):
        toplevel = not self.stack

        self.stack.append({
            "correlate_froms": set(),
            "asfrom_froms": set(),
            "selectable": insert_stmt,
        })

        crud_params = crud._setup_crud_params(self, insert_stmt, crud.ISINSERT,
                                              **kw)

        if (not crud_params and not self.dialect.supports_default_values
                and not self.dialect.supports_empty_insert):
            raise exc.CompileError("The '%s' dialect with current database "
                                   "version settings does not support empty "
                                   "inserts." % self.dialect.name)

        if insert_stmt._has_multi_parameters:
            if not self.dialect.supports_multivalues_insert:
                raise exc.CompileError(
                    "The '%s' dialect with current database "
                    "version settings does not support "
                    "in-place multirow inserts." % self.dialect.name)
            crud_params_single = crud_params[0]
        else:
            crud_params_single = crud_params

        preparer = self.preparer
        supports_default_values = self.dialect.supports_default_values

        text = "INSERT "

        if insert_stmt._prefixes:
            text += self._generate_prefixes(insert_stmt, insert_stmt._prefixes,
                                            **kw)

        text += "INTO "
        table_text = preparer.format_table(insert_stmt.table)

        if insert_stmt._hints:
            _, table_text = self._setup_crud_hints(insert_stmt, table_text)

        text += table_text

        if crud_params_single or not supports_default_values:
            text += " (%s)" % ", ".join(
                [preparer.format_column(c[0]) for c in crud_params_single])

        if self.returning or insert_stmt._returning:
            returning_clause = self.returning_clause(
                insert_stmt, self.returning or insert_stmt._returning)

            if self.returning_precedes_values:
                text += " " + returning_clause
        else:
            returning_clause = None

        if insert_stmt.select is not None:
            select_text = self.process(self._insert_from_select, **kw)

            if self.ctes and toplevel and self.dialect.cte_follows_insert:
                text += " %s%s" % (self._render_cte_clause(), select_text)
            else:
                text += " %s" % select_text
        elif not crud_params and supports_default_values:
            text += " DEFAULT VALUES"

        # This part would originally generate an insert statement such as
        # `insert into table test values (?,?), (?,?), (?,?)` which sqream
        # does not support
        # <Overriding part> - money is in crud_params[0]
        elif insert_stmt._has_multi_parameters:
            insert_single_values_expr = ", ".join(
                [c[1] for c in crud_params[0]])
            text += " VALUES (%s)" % insert_single_values_expr
            if toplevel:
                self.insert_single_values_expr = insert_single_values_expr
        # </Overriding part>
        else:
            insert_single_values_expr = ", ".join([c[1] for c in crud_params])
            text += " VALUES (%s)" % insert_single_values_expr
            if toplevel:
                self.insert_single_values_expr = insert_single_values_expr

        if insert_stmt._post_values_clause is not None:
            post_values_clause = self.process(insert_stmt._post_values_clause,
                                              **kw)
            if post_values_clause:
                text += " " + post_values_clause

        if returning_clause and not self.returning_precedes_values:
            text += " " + returning_clause

        if self.ctes and toplevel and not self.dialect.cte_follows_insert:
            text = self._render_cte_clause() + text

        self.stack.pop(-1)

        if asfrom:
            return "(" + text + ")"
        else:
            return text