# Buggy code
def create(
    cls: typing.Type[Tuple_T],
    schema: s_schema.Schema,
    *,
    name: Optional[s_name.Name] = None,
    id: Union[uuid.UUID, so.NoDefaultT] = so.NoDefault,
    element_types: Mapping[str, Type],
    named: bool = False,
    **kwargs: Any,
) -> typing.Tuple[s_schema.Schema, Tuple_T]:
    element_types = types.MappingProxyType(element_types)
    if id is so.NoDefault:
        quals = []
        if name is not None:
            quals.append(str(name))
        id = generate_tuple_type_id(schema, element_types, named, *quals)

    if name is None:
        st_names = ", ".join(
            st.get_displayname(schema) for st in element_types.values()
        )
        name = type_name_from_id_and_displayname(id, f"tuple<{st_names}>")

    result = typing.cast(Tuple_T, schema.get_by_id(id, default=None))
    if result is None:
        schema, result = super().create_in_schema(
            schema,
            id=id,
            name=name,
            named=named,
            element_types=element_types,
            **kwargs,
        )

    return schema, result


# 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 create(
    cls: typing.Type[Tuple_T],
    schema: s_schema.Schema,
    *,
    name: Optional[s_name.Name] = None,
    id: Optional[uuid.UUID] = None,
    element_types: Mapping[str, Type],
    named: bool = False,
    **kwargs: Any,
) -> typing.Tuple[s_schema.Schema, Tuple_T]:
    el_types = so.ObjectDict[str, Type].create(schema, element_types)
    if name is None:
        name = cls.generate_name(
            {n: el.get_name(schema) for n, el in element_types.items()},
            named,
        )

    if isinstance(name, s_name.QualName):
        result = schema.get(name, type=cls, default=None)
    else:
        result = schema.get_global(cls, name, default=None)

    if result is None:
        schema, result = super().create_in_schema(
            schema,
            id=id,
            name=name,
            named=named,
            element_types=el_types,
            **kwargs,
        )

    return schema, result