Exemplo n.º 1
0
def compile_to_ir(expr,
                  schema,
                  *,
                  anchors=None,
                  security_context=None,
                  modaliases=None,
                  implicit_id_in_shapes=False):
    """Compile given EdgeQL statement into EdgeDB IR."""

    if debug.flags.edgeql_compile:
        debug.header('EdgeQL TEXT')
        debug.print(expr)

    tree = ql_parser.parse(expr, modaliases)

    return compile_ast_to_ir(tree,
                             schema,
                             anchors=anchors,
                             security_context=security_context,
                             modaliases=modaliases,
                             implicit_id_in_shapes=implicit_id_in_shapes)
Exemplo n.º 2
0
    async def execute(self, context):
        code, vars = await self.get_code_and_vars(context)

        if code:
            extra = await self.extra(context)
            extra_before = extra_after = None

            if isinstance(extra, dict):
                extra_before = extra.get('before')
                extra_after = extra.get('after')
            else:
                extra_after = extra

            if extra_before:
                for cmd in extra_before:
                    await cmd.execute(context)

            if debug.flags.delta_execute:
                debug.header('Executing DDL')
                debug.print(repr(self))
                debug.print('CODE:', code)
                debug.print('VARS:', vars)

            stmt = await context.db.prepare(code)
            result = await stmt.fetch(*vars)

            if extra_after:
                for cmd in extra_after:
                    await cmd.execute(context)
            return result
Exemplo n.º 3
0
    async def _execute(self, context, code, vars):
        if debug.flags.delta_execute:
            debug.print(repr(self), '\n')
            debug.print('CODE:', code)
            debug.print('VARS:', vars)

        stmt = await context.db.prepare(code)

        if vars is None:
            vars = []

        result = await stmt.fetch(*vars)
        return result
Exemplo n.º 4
0
def compile_func_to_ir(func,
                       schema,
                       *,
                       anchors=None,
                       security_context=None,
                       modaliases=None,
                       implicit_id_in_shapes=False):
    """Compile an EdgeQL function into EdgeDB IR."""

    if debug.flags.edgeql_compile:
        debug.header('EdgeQL Function')
        debug.print(func.get_code(schema))

    trees = ql_parser.parse_block(func.get_code(schema) + ';')
    if len(trees) != 1:
        raise errors.InvalidFunctionDefinitionError(
            'functions can only contain one statement')

    tree = trees[0]
    if modaliases:
        ql_parser.append_module_aliases(tree, modaliases)

    if anchors is None:
        anchors = {}

    anchors['__defaults_mask__'] = irast.Parameter(
        name='__defaults_mask__', stype=schema.get('std::bytes'))

    func_params = func.get_params(schema)
    pg_params = s_func.PgParams.from_params(schema, func_params)
    for pi, p in enumerate(pg_params.params):
        p_shortname = p.get_shortname(schema)
        anchors[p_shortname] = irast.Parameter(name=p_shortname,
                                               stype=p.get_type(schema))

        if p.get_default(schema) is None:
            continue

        tree.aliases.append(
            qlast.AliasedExpr(
                alias=p_shortname,
                expr=qlast.
                IfElse(condition=qlast.BinOp(left=qlast.FunctionCall(
                    func=('std', 'bytes_get_bit'),
                    args=[
                        qlast.FuncArg(arg=qlast.Path(
                            steps=[qlast.ObjectRef(
                                name='__defaults_mask__')])),
                        qlast.FuncArg(arg=qlast.IntegerConstant(value=str(pi)))
                    ]),
                                             right=qlast.IntegerConstant(
                                                 value='0'),
                                             op='='),
                       if_expr=qlast.Path(
                           steps=[qlast.ObjectRef(name=p_shortname)]),
                       else_expr=qlast._Optional(
                           expr=p.get_ql_default(schema)))))

    ir = compile_ast_to_ir(tree,
                           schema,
                           anchors=anchors,
                           func=func,
                           security_context=security_context,
                           modaliases=modaliases,
                           implicit_id_in_shapes=implicit_id_in_shapes)

    return ir