def compile_UpdateQuery( expr: qlast.UpdateQuery, *, ctx: context.ContextLevel) -> irast.Set: if ctx.in_conditional is not None: raise errors.QueryError( 'UPDATE statements cannot be used inside conditional expressions', context=expr.context, ) with ctx.subquery() as ictx: stmt = irast.UpdateStmt() init_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) subject = dispatch.compile(expr.subject, ctx=ictx) assert isinstance(subject, irast.Set) subj_type = inference.infer_type(subject, ictx.env) if not isinstance(subj_type, s_objtypes.ObjectType): raise errors.QueryError( f'cannot update non-ObjectType objects', context=expr.subject.context ) ictx.partial_path_prefix = subject clauses.compile_where_clause( stmt, expr.where, ctx=ictx) with ictx.new() as bodyctx: bodyctx.implicit_id_in_shapes = False bodyctx.implicit_tid_in_shapes = False bodyctx.implicit_limit = 0 stmt.subject = compile_query_subject( subject, shape=expr.shape, view_rptr=ctx.view_rptr, compile_views=True, result_alias=expr.subject_alias, is_update=True, ctx=bodyctx) stmt_subject_stype = setgen.get_set_type(subject, ctx=ictx) result = setgen.class_set( stmt_subject_stype.material_type(ctx.env.schema), path_id=stmt.subject.path_id, ctx=ctx) stmt.result = compile_query_subject( result, view_scls=ctx.view_scls, view_name=ctx.toplevel_result_view_name, compile_views=ictx.stmt is ictx.toplevel_stmt, ctx=ictx) result = fini_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) return result
def compile_UpdateQuery( expr: qlast.Base, *, ctx: context.ContextLevel) -> irast.Base: with ctx.subquery() as ictx: ictx.implicit_id_in_shapes = False ictx.implicit_tid_in_shapes = False stmt = irast.UpdateStmt() init_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) subject = dispatch.compile(expr.subject, ctx=ictx) subj_type = inference.infer_type(subject, ictx.env) if not isinstance(subj_type, s_objtypes.ObjectType): raise errors.QueryError( f'cannot update non-ObjectType objects', context=expr.subject.context ) ictx.partial_path_prefix = subject clauses.compile_where_clause( stmt, expr.where, ctx=ictx) stmt.subject = compile_query_subject( subject, shape=expr.shape, view_rptr=ctx.view_rptr, compile_views=True, result_alias=expr.subject_alias, is_update=True, ctx=ictx) stmt_subject_stype = setgen.get_set_type(subject, ctx=ictx) result = setgen.class_set( stmt_subject_stype.material_type(ctx.env.schema), path_id=stmt.subject.path_id, ctx=ctx) stmt.result = compile_query_subject( result, view_scls=ctx.view_scls, view_name=ctx.toplevel_result_view_name, compile_views=ictx.stmt is ictx.toplevel_stmt, ctx=ictx) result = fini_stmt(stmt, expr, ctx=ictx, parent_ctx=ctx) return result