[firebase-br] UDF derrubando FB

Welkson Renny de Medeiros welkson em gmail.com
Qui Dez 18 10:20:14 -03 2008


Pessoal,

Estou em contato com o pessoal que criou o FreeAdhocUDF (Christoph 
Theuring/Alemanha) e eles estão me ajudando a resolver o problema. Eu tenho 
certeza que tem problema na UDF, já testei tanto em Windows quanto em Linux, 
tanto CS quanto SS e acontece o mesmo problema... o detalhe é que só 
acontece em grandes volumes de dados. Assim que tiver uma solução eu posto 
pra vocês.

Quem quiser ver o problema acontecendo baixe o vídeo e o banco que usei para 
testes:
http://intranet.focusautomacao.com.br/welkson/UDF_Test/

Abraço a todos.

Welkson




----- Original Message ----- 
From: "Sandro Souza" <escovadordebits em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, December 16, 2008 4:06 PM
Subject: Re: [firebase-br] UDF derrubando FB


Bom dia/tarde Welkson.

Amigo, sempre que for possível, prefira utilizar funções nativas que UDFs,
justamente por esses problemas de incompatibilidade entre versões diferentes
de Firebird.

Experimente testar essa versão nativa da LASTDAYMONTH:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LASTDAYMONTH (
    AYEAR INTEGER,
    AMONTH INTEGER)
RETURNS (
    RESULT INTEGER)
AS
DECLARE VARIABLE INICIO DATE;
BEGIN
  /* Já está em dezembro? */
  IF (AMONTH = 12) THEN
  BEGIN
    /* Avança para janeiro do próximo ano. */
    AMONTH = 1;
    AYEAR = AYEAR + 1;
  END
  ELSE
    /* Avança para o próximo mês do mesmo ano */
    AMONTH = AMONTH + 1;
  /* Gera a data referente a início do próximo mês */
  INICIO = CAST((LPAD(CAST(AYEAR  AS VARCHAR(4)),4,'0') || '-' ||
                 LPAD(CAST(AMONTH AS VARCHAR(2)),2,'0') || '-01') AS DATE);
  /* Obtém o dia da data anterior ao início do próximo mês, ou seja,
     o último dia do mês informado */
  RESULT = EXTRACT(DAY FROM (INICIO - 1));
  SUSPEND;
END^

SET TERM ; ^

DESCRIBE PARAMETER AYEAR PROCEDURE LASTDAYMONTH
'Ano de referência.';

DESCRIBE PARAMETER AMONTH PROCEDURE LASTDAYMONTH
'Mês de referência.';

DESCRIBE PARAMETER RESULT PROCEDURE LASTDAYMONTH
'Último dia do mês informado.';

GRANT EXECUTE ON PROCEDURE LASTDAYMONTH TO SYSDBA;

Eu criei essa função e testei-a aqui.

Espero ter ajudado mais que atrapalhado.

2008/12/16 Welkson Renny de Medeiros <welkson em gmail.com>

> Boa tarde amigos!
>
> Tenho algumas procedures que usam uma udf chamada LASTDAYMONTH (último dia
> do mês).
>
> Comecei usando essa UDF no FB 1.5 com o pacote RFUNC....
>
> Recente migrei para o Firebird 2.1 e o pacote RFUNC gerou vários erros e
> não funcionou... verifiquei no site e o mesmo está sem atualização a 5
> anos...
>
> Procurei um pouco e encontrei o FreeAdHocUDF que contem mais de 400 UDF,
> entre elas as "antigas" da RFunc funcionando no 2.1.
>
> Se tu testar essa procedure com pouco volume de dados ela funciona
> perfeitamente... com grande volume de dados ela derruba o servidor FB e
> grava a seguinte mensagem no log:
>
> FAKE (Server) Tue Dec 16 14:34:09 2008
> The user defined function:  LASTDAYMONTH
>   referencing entrypoint:  lastdaymonth
>                in module:  FreeAdhocUDF
> caused the fatal exception: Access violation.
>  The code attempted to access a virtual
>  address without privilege to do so.
> This exception will cause the Firebird server
> to terminate abnormally.
>
> Fiz o mesmo teste no servidor em PRODUÇÃO (Debian 4 - 2.6.18-6), e também
> no servidor de desenvolvimento (Windows XP SP3), e ocorre o MESMO 
> problema.
> Engraçado que semana passada ocorreu esse mesmo problema com outra udf, a
> substr... acabei substituindo pelo comando nativo SUBSTRING.
>
> Vi no histórico da lista que outras pessoas já tiveram esse problema.
>
> Como resolveram?
>
> E o RFUNC? vai morrer mesmo?
>
> --
> Welkson Renny
>
>
>                     Powered by ....
>
>                                          (__)
>                                       \\\'',)
>                                         \/  \ ^
>                                         .\._/_)
>
>                                     www.FreeBSD.org
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista