Esempio n. 1
0
async def plan_statement(stmt, backend, flags={}, *, timer):
    schema = backend.schema
    modaliases = backend.modaliases
    testmode = backend.testmode

    if isinstance(stmt, qlast.Database):
        # CREATE/ALTER/DROP DATABASE
        return s_ddl.cmd_from_ddl(stmt,
                                  schema=schema,
                                  modaliases=modaliases,
                                  testmode=testmode)

    elif isinstance(stmt, qlast.CreateDelta):
        # CREATE MIGRATION
        cmd = s_ddl.cmd_from_ddl(stmt,
                                 schema=schema,
                                 modaliases=modaliases,
                                 testmode=testmode)

        cmd = await backend.compile_migration(cmd)
        return cmd

    elif isinstance(stmt, qlast.Delta):
        # Other MIGRATION commands.
        return s_ddl.cmd_from_ddl(stmt,
                                  schema=schema,
                                  modaliases=modaliases,
                                  testmode=testmode)

    elif isinstance(stmt, qlast.DDL):
        # CREATE/DELETE/ALTER (FUNCTION, TYPE, etc)
        return s_ddl.delta_from_ddl(stmt,
                                    schema=schema,
                                    modaliases=modaliases,
                                    testmode=testmode)

    elif isinstance(stmt, qlast.Transaction):
        # BEGIN/COMMIT
        return TransactionStatement(stmt)

    elif isinstance(stmt, qlast.SetSessionState):
        # SET ...
        with timer.timeit('compile_eql_to_ir'):
            ir = ql_compiler.compile_ast_to_ir(stmt,
                                               schema=schema,
                                               modaliases=modaliases)

        return ir

    else:
        # Queries
        with timer.timeit('compile_eql_to_ir'):
            ir = ql_compiler.compile_ast_to_ir(stmt,
                                               schema=schema,
                                               modaliases=modaliases)

        return backend.compile(ir,
                               output_format=compiler.OutputFormat.JSON,
                               timer=timer)
Esempio n. 2
0
def plan_statement(stmt, backend, flags={}, *, timer):
    schema = backend.schema
    modaliases = backend.modaliases

    if isinstance(stmt, qlast.Database):
        # CREATE/ALTER/DROP DATABASE
        return s_ddl.cmd_from_ddl(stmt, schema=schema, modaliases=modaliases)

    elif isinstance(stmt, qlast.Delta):
        # CREATE/APPLY MIGRATION
        return s_ddl.cmd_from_ddl(stmt, schema=schema, modaliases=modaliases)

    elif isinstance(stmt, qlast.DDL):
        # CREATE/DELETE/ALTER (FUNCTION, TYPE, etc)
        return s_ddl.delta_from_ddl(stmt, schema=schema, modaliases=modaliases)

    elif isinstance(stmt, qlast.Transaction):
        # BEGIN/COMMIT
        return TransactionStatement(stmt)

    elif isinstance(stmt, qlast.SessionStateDecl):
        # SET ...
        with timer.timeit('compile_eql_to_ir'):
            ir = ql_compiler.compile_ast_to_ir(stmt,
                                               schema=schema,
                                               modaliases=modaliases)

        return ir

    else:
        # Queries
        with timer.timeit('compile_eql_to_ir'):
            ir = ql_compiler.compile_ast_to_ir(stmt,
                                               schema=schema,
                                               modaliases=modaliases,
                                               implicit_id_in_shapes=False)

        return backend.compile(ir,
                               output_format=compiler.OutputFormat.JSON,
                               timer=timer)
Esempio n. 3
0
    def _compile_view_expr(cls, expr, classname, schema, context):
        from edb.lang.edgeql import compiler as qlcompiler

        ir = context.get_cached((expr, classname))
        if ir is None:
            if not isinstance(expr, qlast.Statement):
                expr = qlast.SelectQuery(result=expr)
            ir = qlcompiler.compile_ast_to_ir(
                expr,
                schema,
                derived_target_module=classname.module,
                result_view_name=classname)
            context.cache_value((expr, classname), ir)

        return ir
Esempio n. 4
0
    def _compile_ql_query(self, ctx: CompileContext,
                          ql: qlast.Base) -> dbstate.BaseQuery:

        current_tx = ctx.state.current_tx()

        ir = ql_compiler.compile_ast_to_ir(
            ql,
            schema=current_tx.get_schema(),
            modaliases=current_tx.get_modaliases(),
            implicit_id_in_shapes=False)

        sql_text, argmap = pg_compiler.compile_ir_to_sql(
            ir,
            schema=ir.schema,
            pretty=debug.flags.edgeql_compile,
            output_format=ctx.output_format)

        sql_bytes = sql_text.encode(defines.EDGEDB_ENCODING)

        if ctx.single_query_mode or ctx.legacy_mode:
            if ctx.output_format is pg_compiler.OutputFormat.NATIVE:
                out_type_data, out_type_id = sertypes.TypeSerializer.describe(
                    ir.schema, ir.expr.stype, ir.view_shapes)
            else:
                out_type_data, out_type_id = \
                    sertypes.TypeSerializer.describe_json()

            if ir.params:
                subtypes = [None] * len(ir.params)
                first_param_name = next(iter(ir.params))
                if first_param_name.isdecimal():
                    named = False
                    for param_name, param_type in ir.params.items():
                        subtypes[int(param_name)] = (param_name, param_type)
                else:
                    named = True
                    for param_name, param_type in ir.params.items():
                        subtypes[argmap[param_name] - 1] = (param_name,
                                                            param_type)
                params_type = s_types.Tuple.create(
                    ir.schema,
                    element_types=collections.OrderedDict(subtypes),
                    named=named)
            else:
                params_type = s_types.Tuple.create(ir.schema,
                                                   element_types={},
                                                   named=False)

            in_type_data, in_type_id = sertypes.TypeSerializer.describe(
                ir.schema, params_type, {})

            sql_hash = self._hash_sql(sql_bytes,
                                      mode=str(ctx.output_format).encode())

            return dbstate.Query(
                sql=sql_bytes,
                sql_hash=sql_hash,
                in_type_id=in_type_id.bytes,
                in_type_data=in_type_data,
                out_type_id=out_type_id.bytes,
                out_type_data=out_type_data,
            )

        else:
            if ir.params:
                raise errors.QueryError(
                    'queries compiled in script mode cannot accept parameters')

            return dbstate.SimpleQuery(sql=sql_bytes)