Skip to content

Access a Map with a non-string keys #11785

@goldmedal

Description

@goldmedal

Describe the bug

Currently, we support creating a map like

SELECT MAKE_MAP(1, 'a', 2, 'b', 3, 'c');
----
{1: a, 2: b, 3: c}

However, we can't access this map if its key isn't a string.

SELECT MAKE_MAP(1, 'a', 2, 'b', 3, 'c')[1]

It will get the error

External error: query failed: DataFusion error: Error during planning: Error during planning: Coercion from [Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Int64, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false), Int64] to the signature ArraySignature(ArrayAndIndex) failed. No function matches the given name and argument types 'array_element(Map(Field { name: "entries", data_type: Struct([Field { name: "key", data_type: Int64, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, false), Int64)'. You might need to add explicit type casts.
        Candidate functions:
        array_element(array, index)

If the key is a string, it works well.

query T
SELECT MAKE_MAP('1', 'a', '2', 'b', '3', 'c')['1']
----
a

To Reproduce

As mentioned above, create a map with non-string keys and try to access it by the key.

Expected behavior

Given the SQL

SELECT MAKE_MAP(1, 'a', 2, 'b', 3, 'c')[1]

It should return the value 'a'.

Additional context

#11780 (comment)

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions