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)
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)
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
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)