# Buggy code
def _canonicalize(
    self,
    schema: s_schema.Schema,
    context: sd.CommandContext,
    scls: so.Object,
) -> List[sd.Command]:
    assert isinstance(scls, CallableObject)
    commands = list(super()._canonicalize(schema, context, scls))

    # Don't do anything for concrete constraints
    if not isinstance(scls, Function) and not scls.get_abstract(schema):
        return commands

    # params don't get picked up by the base _canonicalize because
    # they aren't RefDicts (and use a different mangling scheme to
    # boot), so we need to do it ourselves.
    param_list = scls.get_params(schema)
    params = CallableCommand._get_param_desc_from_params_ast(
        schema, context.modaliases, param_list.get_ast(schema)
    )

    assert isinstance(self.new_name, sn.QualName)
    for dparam, oparam in zip(params, param_list.objects(schema)):
        ref_name = oparam.get_name(schema)
        new_ref_name = dparam.get_fqname(schema, self.new_name)
        commands.append(
            self._canonicalize_ref_rename(
                oparam, ref_name, new_ref_name, schema, context, scls
            )
        )

    return commands


# Traceback (AttributeError)
ERROR: InternalServerError: 'UnionType' object has no attribute 'get_name'
Hint: This is most likely a bug in EdgeDB. Please consider opening an issue ticket at https://github.com/edgedb/edgedb/issues/new?template=bug_report.md
Server traceback:
Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/server/procpool/worker.py", line 75, in worker
res = await meth(*args)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/server/compiler/compiler.py", line 1808, in compile_eql_tokens
return self._compile(ctx=ctx, tokens=eql_tokens)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/server/compiler/compiler.py", line 1442, in _compile
comp: dbstate.BaseQuery = self._compile_dispatch_ql(ctx, stmt)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/server/compiler/compiler.py", line 1365, in _compile_dispatch_ql
return self._compile_ql_migration(ctx, ql)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/server/compiler/compiler.py", line 794, in _compile_ql_migration
target_schema = s_ddl.apply_sdl(
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/schema/ddl.py", line 371, in apply_sdl
ddl_stmts = s_decl.sdl_to_ddl(current_schema, documents)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/declarative.py", line 230, in sdl_to_ddl
trace_dependencies(decl_ast, ctx=ctx)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/functools.py", line 875, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/declarative.py", line 499, in trace_default
_register_item(node, ctx=ctx)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/declarative.py", line 623, in _register_item
trace_dependencies(cmd, ctx=ctx)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/functools.py", line 875, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/declarative.py", line 443, in trace_ConcretePointer
_register_item(
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/declarative.py", line 638, in _register_item
tdeps = qltracer.trace_refs(
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/tracer.py", line 162, in trace_refs
trace(qltree, ctx=ctx)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/functools.py", line 875, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/usr/lib/x86_64-linux-gnu/edgedb-server-1-alpha6/lib/python3.8/site-packages/edb/edgeql/tracer.py", line 653, in trace_Select
ctx.path_prefix = tip.get_name(ctx.schema)
AttributeError: 'UnionType' object has no attribute 'get_name'

# Fixed code
def _canonicalize(
    self,
    schema: s_schema.Schema,
    context: sd.CommandContext,
    scls: so.Object,
) -> None:
    super()._canonicalize(schema, context, scls)

    assert isinstance(scls, CallableObject)
    # Don't do anything for concrete constraints
    if not isinstance(scls, Function) and not scls.get_abstract(schema):
        return

    # params don't get picked up by the base _canonicalize because
    # they aren't RefDicts (and use a different mangling scheme to
    # boot), so we need to do it ourselves.
    param_list = scls.get_params(schema)
    params = CallableCommand._get_param_desc_from_params_ast(
        schema, context.modaliases, param_list.get_ast(schema)
    )

    assert isinstance(self.new_name, sn.QualName)
    for dparam, oparam in zip(params, param_list.objects(schema)):
        self.add(
            self.init_rename_branch(
                oparam,
                dparam.get_fqname(schema, self.new_name),
                schema=schema,
                context=context,
            )
        )