Search code examples
tarantool

delete() from the script and the interpretator gives a different result. Why?


Function from script:

function test_delete(val)
    local result = box.space.upbx_test_redirections.index.name_index:delete(val)
    return result
end

I get: "message":"Get() doesn't support partial keys and non-unique indexes". If I call from the interpreter, everything is OK, i get tuple. Options my index

name_index:   3: &3
    unique: true
    parts:
    - type: string
      is_nullable: false
      fieldno: 4
    id: 3
    type: TREE
    space_id: 517
    name: name_index
  bucket_id: *1
  index_name: *3
  ID: *0
  secondary: *2

value for test:1234567890abcdefghijkl0987654321_uuid

Code for create space:

local upbx_test_redirections = box.schema.space.create(
        "upbx_test_redirections", 
        {
            format = {
                {"ID", "integer"},
                {"bucket_id", "unsigned"}, 
                {"test1", "string"},
                {"test2", "string"},
                {"test3", "string"},
                {"test4", "string"},
                {"test5", "string"},
                {"test6", "string"},
                {"test7", "string"},
                {"test8", "string"},
                {"test9", "integer"},
                {"test10", "integer"},
            },
            if_not_exists = true,
        }
    )

and index:

upbx_test_redirections:create_index(
    "name_index", 
    {
        parts = {"test2"}, 
        unique = true, 
        if_not_exists = true, 
    }
)

Solution: need changed in all instances.


Solution

  • I'd recommend you revise your schema again. My hypothesis - previously you created non-unique index and then just modify unique=false to unique=true.

    tarantool> upbx_test_redirections:create_index(
             >     "name_index",
             >     {
             >         parts = {"test2"},
             >         unique = false,
             >         if_not_exists = true,
             >     }
             > )
    ---
    - unique: false
      parts:
      - type: string
        is_nullable: false
        fieldno: 4
      id: 1
      space_id: 512
      type: TREE
      name: name_index
    ...
    
    tarantool> upbx_test_redirections:create_index(
             >     "name_index",
             >     {
             >         parts = {"test2"},
             >         unique = true,
             >         if_not_exists = true,
             >     }
             > )
    ---
    - unique: false    -- unique option isn't changed
      parts:
      - type: string
        is_nullable: false
        fieldno: 4
      id: 1
      space_id: 512
      type: TREE
      name: name_index
    - not created
    ...
    
    

    See my example with errors that you could face.

    box.cfg{}
    s = box.schema.space.create('test')
    s:format({{name = 'id', type = 'unsigned'}, {name = 'value', type = 'string'}})
    -- Unique primary index
    s:create_index('pk', {unique = true, parts = {{field = 'id', is_nullable = false}}})
    -- Unique secondary index
    s:create_index('sk', {unique = true, parts = {{field = 'value', is_nullable = false}}})
    -- Unique multipart index
    s:create_index('multipart', {unique = true, parts = {{field = 'id', is_nullable = false}, {field = 'value', is_nullable = false}}})
    -- Non-unique multipart indexes
    s:create_index('multipart_non_unique', {unique = false, parts = {{field = 'id', is_nullable = false}, {field = 'value', is_nullable = false}}})
    
    -- Test data
    s:replace{1, '1'}
    s:replace{2, '2'}
    s:replace{3, '3'}
    s:replace{4, '4'}
    s:replace{5, '5'}
    
    -- Examples with errors
    box.space.test:delete({1}) -- OK
    box.space.test.index['pk']:delete({2}) -- OK
    box.space.test.index['pk']:delete(2) -- OK
    box.space.test.index['pk']:delete(nil) -- Fail
    box.space.test.index['sk']:delete('3') -- OK
    box.space.test.index['sk']:delete({'3'}) -- OK
    box.space.test.index['multipart']:delete({4}) -- Fail: Invalid key part count in an exact match (expected 2, got 1)
    box.space.test.index['multipart']:delete({4, '4'}) -- OK
    box.space.test.index['multipart_non_unique']:delete({5}) -- Fail: Get() doesn't support partial keys and non-unique indexes
    box.space.test.index['multipart_non_unique']:delete({5, '5'}) -- Fail: Get() doesn't support partial keys and non-unique indexes
    

    If problem still exists feel free to report a bug