Subject Re: [ib-support] Re: Implementation limit exceeded
Author lele@seldati.it
>>>>> On Mon, 29 Apr 2002 17:00:35 +0200, Paul Reeves <paul@...> said:

PR> On Mon, 29 Apr 2002 16:28:39 +0200, lele@... wrote:
>>  > > > > > On Mon, 29 Apr 2002 10:15:16 +0200, lele@...
>> said:
>>
>>
>>  l> Hi there, I'm retesting right now the situation, l> but
>> here is  l> what a coworker found: she was able to install
>> without problem  l> that SP in another DB, always under
>> FB1.0. Then she did a l>  backup and tried to restore it, but
>> she got the infamous l>  message:

PR> Can you post the stored procedure that appears to be causing
PR> the problem?

Yes, but I'm afraid it's Italian-taylored, and of little help :|

In few words (I did not write it myself): say an object is composed by
"A1-A3-B2", this SP accepts a coding like that and expand it into the
actual tables. It's recursive, since the coding may refer to a
subobject...

That said, I cannot see it "corrupting" the DB in way that prevents
the restore...

Of course, please do not hesitate to ask whatever else may help me
understand what's is going!

Ah, did I mention that the same works great without noise on FB0.9? As
ClaudioV suggested, this *may* be related to the max-block-size limit
set at 32k, introduced just before 1.0...

thanx a lot,
bye, lele.

alter PROCEDURE AM$PARSER (
P_TIPOCODICE INTEGER,
P_CODICE VARCHAR(20) CHARACTER SET NONE,
P_CODICERIC VARCHAR(20) CHARACTER SET NONE,
P_MODELLOALTROCODICE VARCHAR(20) CHARACTER SET NONE,
P_VARMODALTROCODICE VARCHAR(20) CHARACTER SET NONE,
P_STRINGA VARCHAR(20) CHARACTER SET NONE,
P_PARAMETRO SMALLINT,
P_CODVARMOD INTEGER)
AS
DECLARE VARIABLE V_CODICE VARCHAR(20);
DECLARE VARIABLE V_POSIZIONE VARCHAR(20);
DECLARE VARIABLE V_INIZIOLETTURA INTEGER;
DECLARE VARIABLE V_I INTEGER;
DECLARE VARIABLE V_SEPARAZIONE VARCHAR(1) CHARACTER SET NONE;
DECLARE VARIABLE V_PRIMO VARCHAR(20) CHARACTER SET NONE;
DECLARE VARIABLE V_SECONDO VARCHAR(20) CHARACTER SET NONE;
DECLARE VARIABLE V_RISULTATO VARCHAR(20) CHARACTER SET NONE;
DECLARE VARIABLE V_RESTO VARCHAR(20);
DECLARE VARIABLE V_IDTIPOPARSER INTEGER;
DECLARE VARIABLE V_IDVARIANTEMODELLO INTEGER;
DECLARE VARIABLE V_IDCOMPONENTE INTEGER;
DECLARE VARIABLE V_TIPOASSOCIAZIONE INTEGER;
DECLARE VARIABLE V_PROGRESSIVO SMALLINT;
DECLARE VARIABLE V_RICORSIONE CHAR(1);
DECLARE VARIABLE V_TIPOCODICE INTEGER;
DECLARE VARIABLE V_IDOPERAZIONECICLODA INTEGER;
DECLARE VARIABLE V_IDOPERAZIONECICLOA INTEGER;
DECLARE VARIABLE V_IDELEMENTOSEQUENZA INTEGER;
DECLARE VARIABLE V_IDSEQCOMPONENTI INTEGER;
DECLARE VARIABLE V_TIPOCODICEDEFAULT INTEGER;
DECLARE VARIABLE V_CODICERIC VARCHAR(20);
DECLARE VARIABLE V_BLOCCACICLO VARCHAR(1);
DECLARE VARIABLE V_LOGPARSER VARCHAR(1);
begin
/* in p_parametro รจ contenuto un numero da 1 a 4 che indica il parametro
avvalorato passato alla procedura */
if (P_PARAMETRO = 1) then
V_CODICE = :P_CODICE;
if (P_PARAMETRO = 2) then
V_CODICE = :P_MODELLOALTROCODICE;
if (P_PARAMETRO = 3) then
V_CODICE = :P_VARMODALTROCODICE;
if (P_PARAMETRO = 4) then
V_CODICE = :P_STRINGA;
V_CODICERIC = :V_CODICE;

/* idVarianteModello da passare poi alle procedure AM$INCLUDICOMPONENTE
AM$AGGREGACOMPONENTE */
if (P_codvarmod is null) then
begin
SELECT IDVARIANTEMODELLO, IDSEQCOMPONENTI, BLOCCACICLO
FROM VARIANTIMODELLO VM
WHERE ((VM.CODMOD = :P_CODICE) AND
(VM.altrocodice = :P_VARMODaltrocodice))
INTO :V_IDVARIANTEMODELLO, :V_IDSEQCOMPONENTI, :V_BLOCCACICLO;
IF ((:V_IDSEQCOMPONENTI IS NOT NULL) AND (:V_BLOCCACICLO <> 'T'))
THEN EXECUTE PROCEDURE AM$RimuoviComponente (:V_IDVARIANTEMODELLO,
:V_IDSEQCOMPONENTI);
update VARIANTIMODELLO
set idseqcomponenti=null
where idvariantemodello=:v_idvariantemodello;
end
Else
begin
SELECT IDVARIANTEMODELLO, IDSEQCOMPONENTI, BLOCCACICLO
FROM VARIANTIMODELLO VM
WHERE ((VM.CODMOD = :P_CODICE) AND (VM.CODVARMOD = :P_CODVARMOD))
INTO :V_IDVARIANTEMODELLO, :V_IDSEQCOMPONENTI, :V_BLOCCACICLO;
IF ((:V_IDSEQCOMPONENTI IS NOT NULL) AND (:V_BLOCCACICLO <> 'T'))
THEN EXECUTE PROCEDURE AM$RimuoviComponente (:V_IDVARIANTEMODELLO,
:V_IDSEQCOMPONENTI);
update VARIANTIMODELLO
set idseqcomponenti=null
where idvariantemodello=:v_idvariantemodello;
END
/* progressivo da passare alle procedure AM$INCLUDICOMPONENTE
AM$AGGREGACOMPONENTE */
V_PROGRESSIVO = 1;
FOR SELECT IDTIPOPARSER, POSIZIONE, INIZIOLETTURA, RICORSIONE,
TIPOCODICEDEFAULT
FROM TIPIPARSER TP
WHERE (TP.TIPOCODICE = :P_TIPOCODICE)
INTO :V_IDTIPOPARSER, :V_POSIZIONE, :V_INIZIOLETTURA, :V_RICORSIONE,
:V_TIPOCODICEDEFAULT
DO BEGIN
/* lettura della stringa vposizione con i casi 1 o 1-3 o 1|3 */
/* in vprimo metto il primo numero, in vsecondo l'eventuale secondo
numero solo in caso di - e in vseparazione l'eventuale carattere di
separazione */
V_I = 1;
V_PRIMO = '';
V_SECONDO = '';
V_SEPARAZIONE = '';
V_RISULTATO = '';
WHILE (:V_I <= STRLEN(:V_POSIZIONE)) DO begin
if (SUBSTR (:V_POSIZIONE,:V_I,:V_I) = '-')
THEN BEGIN
V_SEPARAZIONE = SUBSTR (:V_POSIZIONE,:V_I,:V_I);
end
if (SUBSTR (:V_POSIZIONE,:V_I,:V_I) = '|')
THEN BEGIN
/* lettura da sinistra */
if (:V_INIZIOLETTURA = 0)
THEN begin
if (CAST(:V_PRIMO AS integer) <= STRLEN(:V_CODICE))
then V_RISULTATO = :V_RISULTATO || SUBSTR
(:V_CODICE,CAST(:V_PRIMO AS integer),CAST(:V_PRIMO AS integer));
END
ELSE BEGIN
/* lettura da destra */
if (CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer) <=
STRLEN(:V_CODICE))
then V_RISULTATO = :V_RISULTATO || SUBSTR
(:V_CODICE,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer)
,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer));
END
V_SEPARAZIONE = SUBSTR (:V_POSIZIONE,:V_I,:V_I);
V_PRIMO = '';
END
if ((SUBSTR (:V_POSIZIONE,:V_I,:V_I) <> '-') AND (SUBSTR
(:V_POSIZIONE,:V_I,:V_I) <> '|'))
THEN begin
if ((:V_SEPARAZIONE = '') or (:V_SEPARAZIONE = '|')) then
V_PRIMO = :V_PRIMO || SUBSTR (:V_POSIZIONE,:V_I,:V_I);
ELSE
V_SECONDO = :V_SECONDO || SUBSTR
(:V_POSIZIONE,:V_I,:V_I);
END
V_I = :V_I + 1;
END


/* caso del tipo un solo numero MODIFICATO QUI */
if ((:V_SEPARAZIONE IS NULL) OR (V_SEPARAZIONE = '')) then BEGIN
/* lettura da sinistra */
if (:V_INIZIOLETTURA = 0) THEN begin
V_RISULTATO = SUBSTR (:V_CODICE,CAST(:V_PRIMO AS
integer),CAST(:V_PRIMO AS integer));
V_RESTO = SUBSTR (:V_CODICE,CAST(:V_PRIMO AS
integer)+1,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer));
END
ELSE BEGIN
/* lettura da destra */
V_RISULTATO = SUBSTR (:V_CODICE,CAST(STRLEN(:V_CODICE) + 1 -
:V_PRIMO AS integer) ,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer));
V_RESTO = SUBSTR (:V_CODICE,1,CAST(STRLEN(:V_CODICE) + 1 -
:V_PRIMO AS integer));
END
END
/* caso del tipo 1|3 in carattere 2 e il carattere 3 */
if (:V_SEPARAZIONE = '|') then BEGIN
/* lettura da sinistra */
if (:V_INIZIOLETTURA = 0) THEN begin
if (CAST(:V_PRIMO AS integer) <= STRLEN(:V_CODICE))
then V_RISULTATO = :V_RISULTATO || SUBSTR (:V_CODICE,CAST(:V_PRIMO
AS integer),CAST(:V_PRIMO AS integer));
END
ELSE BEGIN
/* lettura da destra */
if (CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer) <=
STRLEN(:V_CODICE))
then V_RISULTATO = :V_RISULTATO || SUBSTR
(:V_CODICE,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer)
,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer));
END
END
/* caso del tipo 1-3 dal carattere 1 al carattere 3 */
if (:V_SEPARAZIONE = '-') then BEGIN
/* lettura da sinistra */
if (:V_INIZIOLETTURA = 0) THEN begin
V_RISULTATO = SUBSTR (:V_CODICE,CAST(:V_PRIMO AS
integer),CAST(:V_SECONDO AS integer));
V_RESTO = SUBSTR (:V_CODICE,1,CAST(:V_PRIMO AS integer)-1);
V_RESTO = :V_RESTO || SUBSTR (:V_CODICE,CAST(:V_SECONDO AS
integer)+1,CAST(STRLEN(:V_CODICE) AS integer));
END
ELSE BEGIN
/* lettura da destra */
V_RISULTATO = SUBSTR (:V_CODICE,CAST(STRLEN(:V_CODICE) + 1 -
:V_SECONDO AS integer) ,CAST(STRLEN(:V_CODICE) + 1 - :V_PRIMO AS integer));
V_RESTO = SUBSTR (:V_CODICE,1,CAST(STRLEN(:V_CODICE) - :V_SECONDO
+1 AS integer)-1);
V_RESTO = :V_RESTO || SUBSTR (:V_CODICE,CAST(:V_PRIMO AS
integer)+1,CAST(STRLEN(:V_CODICE) AS integer));
END
END
/* ricorsione */
if (:V_RICORSIONE = 'T') then
BEGIN
FOR SELECT TIPOCODICE
FROM PARSER PA
WHERE (PA.VALORE = :V_RISULTATO)
INTO :V_TIPOCODICE
DO BEGIN
if (P_PARAMETRO = 1) then
P_CODICE = :V_RESTO;
if (P_PARAMETRO = 2) then
P_MODELLOALTROCODICE = :V_RESTO;
if (P_PARAMETRO = 3) then
P_VARMODALTROCODICE = :V_RESTO;
if (P_PARAMETRO = 4) then
P_STRINGA = :V_RESTO;
EXECUTE PROCEDURE AM$PARSER (:V_TIPOCODICE,
:P_CODICE,
:V_CODICERIC,
:P_MODELLOALTROCODICE,
:P_VARMODALTROCODICE,
:P_STRINGA,
:P_PARAMETRO,
:P_CODVARMOD);
END
exit;
END

SELECT IDVARIANTEMODELLO, TIPOASSOCIAZIONE
FROM PARSER PA
WHERE ((PA.IDTIPOPARSER = :V_IDTIPOPARSER) AND
(PA.VALORE = :V_RISULTATO))
INTO :V_IDCOMPONENTE, :V_TIPOASSOCIAZIONE;

/* MODIFICATO */
IF (:V_IDCOMPONENTE IS NULL) THEN BEGIN
/* REGISTRO ANOMALIA */
EXECUTE PROCEDURE AM$PARSERANOMALIA (:V_IDTIPOPARSER, :V_RISULTATO);

SELECT IDVARIANTEMODELLO, TIPOASSOCIAZIONE
FROM TIPIPARSER TP
WHERE (TP.IDTIPOPARSER = :V_IDTIPOPARSER)
INTO :V_IDCOMPONENTE, :V_TIPOASSOCIAZIONE;
END

SELECT LOGPARSER
FROM CONFIGURAZIONE
INTO :V_LOGPARSER;

if ((:V_LOGPARSER = 'T') AND
(:V_IDVARIANTEMODELLO IS NOT NULL) AND
(:V_IDCOMPONENTE IS NOT NULL) AND
(NOT EXISTS (SELECT * FROM AM$ComponentiVariante (:V_IDVARIANTEMODELLO,
NULL) where idvariantemodello is not null)))
THEN BEGIN
if (:V_TIPOASSOCIAZIONE = 20) then
BEGIN
/* file log */
INSERT INTO AM$PARSERLOG
(DATA,
IN_TIPOCODICE,
IN_CODICE,
IN_CODICERIC,
IN_MODELLOALTROCODICE,
IN_VARMODALTROCODICE,
IN_STRINGA,
IN_PARAMETRO,
IN_CODVARMOD,
OUT_NOMEPROCEDURA,
OUT_IDVARIANTEMODELLO,
OUT_IDCOMPONENTE,
OUT_PROGRESSIVO,
OUT_IDTIPOPARSER,
OUT_RISULTATO)
VALUES
('NOW',
:P_TIPOCODICE,
:P_CODICE,
:P_CODICERIC,
:P_MODELLOALTROCODICE,
:P_VARMODALTROCODICE,
:P_STRINGA,
:P_PARAMETRO,
:P_CODVARMOD,
'AM$INCLUDICOMPONENTE',
:V_IDVARIANTEMODELLO,
:V_IDCOMPONENTE,
:V_PROGRESSIVO,
:V_IDTIPOPARSER,
:V_RISULTATO);
/* oggetto */
SELECT MIN(IDOPERAZIONECICLODA), MIN(IDOPERAZIONECICLOA)
FROM AM$INCLUDICOMPONENTE
(:V_IDVARIANTEMODELLO,:V_IDCOMPONENTE,:V_PROGRESSIVO)
INTO :V_IDOPERAZIONECICLODA, :V_IDOPERAZIONECICLOA;
V_PROGRESSIVO = :V_PROGRESSIVO +1;
END
ELSE BEGIN
/* file log */
INSERT INTO AM$PARSERLOG
(DATA,
IN_TIPOCODICE,
IN_CODICE,
IN_CODICERIC,
IN_MODELLOALTROCODICE,
IN_VARMODALTROCODICE,
IN_STRINGA,
IN_PARAMETRO,
IN_CODVARMOD,
OUT_NOMEPROCEDURA,
OUT_IDVARIANTEMODELLO,
OUT_IDCOMPONENTE,
OUT_PROGRESSIVO,
OUT_IDTIPOPARSER,
OUT_RISULTATO)
VALUES
('NOW',
:P_TIPOCODICE,
:P_CODICE,
:P_CODICERIC,
:P_MODELLOALTROCODICE,
:P_VARMODALTROCODICE,
:P_STRINGA,
:P_PARAMETRO,
:P_CODVARMOD,
'AM$AGGREGACOMPONENTE ',
:V_IDVARIANTEMODELLO,
:V_IDCOMPONENTE,
:V_PROGRESSIVO,
:V_IDTIPOPARSER,
:V_RISULTATO);
/* aggregato */
SELECT MIN(IDELEMENTOSEQUENZA)
FROM AM$AGGREGACOMPONENTE
(:V_IDVARIANTEMODELLO,:V_IDCOMPONENTE,:V_PROGRESSIVO)
INTO :V_IDELEMENTOSEQUENZA;
V_PROGRESSIVO = :V_PROGRESSIVO +1;
END
END

SELECT IDSEQCOMPONENTI
FROM VARIANTIMODELLO VM
WHERE (IDVARIANTEMODELLO = :V_IDVARIANTEMODELLO)
INTO :V_IDSEQCOMPONENTI;
/* se la variante modello non ha una sequenza, parserizzo con il tipoParser
di default */
if (V_IDSEQCOMPONENTI is null) then
begin
EXECUTE PROCEDURE AM$PARSER (:V_TIPOCODICEDEFAULT,
:P_CODICE,
:V_CODICERIC,
:P_MODELLOALTROCODICE,
:P_VARMODALTROCODICE,
:P_STRINGA,
:P_PARAMETRO,
:P_CODVARMOD);
exit;
end
END
end

:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:
Anna Dalla Fontana
EXEKON
Tel. 0461/917472
:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:


--
nickname: Lele Gaifax | Quando vivro' di quello che ho pensato ieri
real: Emanuele Gaifas | comincero' ad aver paura di chi mi copia.
email: lele@... | -- Fortunato Depero, 1929.