Fixes #3256
---

Issue: https://github.com/tarantool/tarantool/issues/3256
Branch: https://github.com/tarantool/tarantool/compare/gh-3256-net-box-nullable-collation-options-output

 src/box/lua/net_box.lua | 6 ++++-
 test/box/net.box.result | 65 +++++++++++++++++++++++++++++++++++++++++++++++
 test/box/net.box.test.lua | 24 +++++++++++++++++
 3 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua
index a6a8648..d37032f 100644
--- a/src/box/lua/net_box.lua
+++ b/src/box/lua/net_box.lua
@@ -895,12 +895,16 @@ function remote_methods:_install_schema(schema_version, spaces, indices)
             end
         else
             for k = 1, #index[PARTS] do
+ local pknullable = index[PARTS][k].is_nullable or false
+ local pkcollationid = index[PARTS][k].collation
                 local pktype = index[PARTS][k][2] or index[PARTS][k].type
                 local pkfield = index[PARTS][k][1] or index[PARTS][k].field
 
                 local pk = {
                     type = pktype,
- fieldno = pkfield + 1
+ fieldno = pkfield + 1,
+ collation_id = pkcollationid,
+ is_nullable = pknullable
                 }
                 idx.parts[k] = pk
             end
diff --git a/test/box/net.box.result b/test/box/net.box.result
index 6150ad3..c423c13 100644
--- a/test/box/net.box.result
+++ b/test/box/net.box.result
@@ -1308,15 +1308,19 @@ c.space.test:select{}
 c.space.test.index.primary.parts
 ---
 - - type: unsigned
+ is_nullable: false
     fieldno: 1
 ...
 c.space.test.index.covering.parts
 ---
 - - type: unsigned
+ is_nullable: false
     fieldno: 1
   - type: string
+ is_nullable: false
     fieldno: 3
   - type: unsigned
+ is_nullable: false
     fieldno: 2
 ...
 box.space.test:drop()
@@ -1979,3 +1983,64 @@ box.schema.user.revoke('guest','read,write,execute','universe')
 space:drop()
 ---
 ...
+--
+-- gh-3256 net.box is_nullable and collation options output
+--
+space = box.schema.create_space('test')
+---
+...
+box.schema.user.grant('guest','read,write,execute','space', 'test')
+---
+...
+pk = space:create_index('pk')
+---
+...
+sk = space:create_index('sk', {parts = {{2, 'unsigned', is_nullable = true}}})
+---
+...
+c = net:connect(box.cfg.listen)
+---
+...
+c.space.test.index.sk.parts
+---
+- - type: unsigned
+ is_nullable: true
+ fieldno: 2
+...
+c:close()
+---
+...
+space:drop()
+---
+...
+space = box.schema.create_space('test')
+---
+...
+box.schema.user.grant('guest','read,write,execute','space', 'test')
+---
+...
+box.internal.collation.create('test', 'ICU', 'ru-RU')
+---
+...
+sk = space:create_index('sk', { type = 'tree', parts = {{1, 'str', collation = 'test'}}, unique = true })
+---
+...
+c = net:connect(box.cfg.listen)
+---
+...
+c.space.test.index.sk.parts
+---
+- - type: string
+ is_nullable: false
+ collation_id: 3
+ fieldno: 1
+...
+c:close()
+---
+...
+box.internal.collation.drop('test')
+---
+...
+space:drop()
+---
+...
diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua
index c7541ed..fe45721 100644
--- a/test/box/net.box.test.lua
+++ b/test/box/net.box.test.lua
@@ -798,3 +798,27 @@ c.space.test.index.test_index ~= nil
 box.schema.user.revoke('guest','read,write,execute','universe')
 
 space:drop()
+
+
+--
+-- gh-3256 net.box is_nullable and collation options output
+--
+
+space = box.schema.create_space('test')
+box.schema.user.grant('guest','read,write,execute','space', 'test')
+pk = space:create_index('pk')
+sk = space:create_index('sk', {parts = {{2, 'unsigned', is_nullable = true}}})
+c = net:connect(box.cfg.listen)
+c.space.test.index.sk.parts
+c:close()
+space:drop()
+
+space = box.schema.create_space('test')
+box.schema.user.grant('guest','read,write,execute','space', 'test')
+box.internal.collation.create('test', 'ICU', 'ru-RU')
+sk = space:create_index('sk', { type = 'tree', parts = {{1, 'str', collation = 'test'}}, unique = true })
+c = net:connect(box.cfg.listen)
+c.space.test.index.sk.parts
+c:close()
+box.internal.collation.drop('test')
+space:drop()
\ No newline at end of file
-- 
2.7.4