-- personagem_item.quantidade: int -> bigint.
--
-- Por que: o Carat (dinheiro) e um ITEM comum no inventario -- id 999999, ocupando slot,
-- com o registro identico em forma ao de uma pocao. Foi medido no 06 05 do oficial em
-- 25/08: registros de 147 bytes, item_id em [0:4] e quantidade em [14:...]; a pocao trazia
-- 100, a armadura 1, e o Carat 261.
--
-- Sendo dinheiro, ele passa de 2.147.483.647 sem esforco, e esse e o teto do int. Este e o
-- mesmo defeito de largura que a EXP tinha ate a manha de 25/08, quando se descobriu que os
-- campos [69:77] e [77:85] do 08 01 sao u64 e nos escreviamos u32. La deu pra corrigir antes
-- de causar dano porque ninguem tinha EXP alta ainda; aqui da pra corrigir antes de alguem
-- acumular dinheiro.
--
-- bigint aceita tudo que int aceitava, entao a conversao nao perde dado. As 26 linhas de
-- hoje tem no maximo 100.
--
-- A view vw_inventario e as procedures criar_personagem/apagar_personagem referenciam a
-- tabela, mas nenhuma e SCHEMABINDING, entao o ALTER passa. A view devolve a coluna e
-- passa a devolve-la como bigint, o que nenhum consumidor nosso distingue.

-- A coluna tem uma constraint de DEFAULT ((1)) com nome gerado pelo servidor
-- (DF__personage__quant__...), e o ALTER COLUMN nao passa enquanto ela existir. Solta,
-- altera e RECRIA -- agora com nome proprio, pra proxima migracao nao precisar descobrir
-- o nome sorteado. Perder o default numa conversao ja aconteceu neste projeto e so
-- apareceu depois, num INSERT que omitia a coluna.

IF EXISTS (SELECT 1 FROM sys.columns
           WHERE object_id = OBJECT_ID('dbo.personagem_item')
             AND name = 'quantidade'
             AND system_type_id = TYPE_ID('int'))
BEGIN
    DECLARE @df sysname;
    SELECT @df = dc.name
      FROM sys.default_constraints dc
      JOIN sys.columns c ON c.object_id = dc.parent_object_id
                        AND c.column_id = dc.parent_column_id
     WHERE dc.parent_object_id = OBJECT_ID('dbo.personagem_item')
       AND c.name = 'quantidade';

    IF @df IS NOT NULL
        EXEC('ALTER TABLE dbo.personagem_item DROP CONSTRAINT ' + @df);

    ALTER TABLE dbo.personagem_item ALTER COLUMN quantidade bigint NOT NULL;

    ALTER TABLE dbo.personagem_item
        ADD CONSTRAINT DF_personagem_item_quantidade DEFAULT (1) FOR quantidade;
END
