Search Postgresql Archives

Re: can't figure string compare result (using also custom C function)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sam Mason ha scritto:
On Fri, Feb 13, 2009 at 10:31:49PM +0100, Edoardo Panfili wrote:
The problem arises only with particular records, when the first character of the string is generated by my function [1]. When the first character is copied from postgres parameter [2] all works fine.

[1] buffer[0]='X'; buffer[1]=' ';
[2] memcpy(buffer,VARDATA(part),VARSIZE(part)-VARHDRSZ)

I'm not much of an expert with extending PG in C; but my first
suggestion would be are you null terminating the string?
the code above is only a fragment, with a 0 at the end of the buffer there are a lot more problems, I use SET_VARSIZE().
The problem does not affect all my records, only 6/25480.

If you are, could you include a (cut down) portion of the code that
demonstrates the problem?

the problem seems to be at the start of the string:

guidebook=> SELECT idSpecie,nome FROM specienomi
WHERE nome like 'X Agropogon littoralis (Sm.) C.E. Hubb.';
 idspecie | nome
----------+------
(0 rows)


SELECT idSpecie,nome FROM specienomi
WHERE nome like '%X Agropogon littoralis (Sm.) C.E. Hubb.';
 idspecie |                  nome
----------+-----------------------------------------
    37026 | X Agropogon littoralis (Sm.) C.E. Hubb.
(1 row)


guidebook=> SELECT idSpecie,nome FROM specienomi
WHERE nome like 'X Agropogon littoralis (Sm.) C.E. Hubb.%';
 idspecie | nome
----------+------
(0 rows)

The function is very ripetitive (and whith italian names for variables). I did a try with a shorter one but can't obtain the same bug (sorry). there is a "HERE" near the lines that seems to be problematic.

Edoardo


----------------------------- function ------------------------------
char *prefissoSottospecie="subsp. ";
#define LUNGHEZZA_PREF_SS 7
char *prefissoVarieta="var. ";
#define LUNGHEZZA_PREF_VAR 5
char *prefissoSottoVarieta="subvar. ";
#define LUNGHEZZA_PREF_SVAR 8
char *prefissoForma="f. ";
#define LUNGHEZZA_PREF_FO 3
char *prefissoRace="race ";
#define LUNGHEZZA_PREF_RACE 5
char *prefissoSublusus="sublusus ";
#define LUNGHEZZA_PREF_SUBLUSUS 9
char *prefissoCultivar="c.v. ";
#define LUNGHEZZA_PREF_CV 5
char *suffissoProParte="p.p. ";
#define LUNGHEZZA_POST_PP 5

#define TEST_IBRIDO(n) {if(strcmp(ibrido,(n))==0){buffer[caratteriInseriti]='x';buffer[caratteriInseriti+1]=' ';caratteriInseriti+=2;}} #define INSERISCI_PARTE(parte) {memcpy(buffer+caratteriInseriti,VARDATA(parte),VARSIZE(parte)-VARHDRSZ);caratteriInseriti+=VARSIZE(parte)-VARHDRSZ+1;buffer[caratteriInseriti-1]=' ';}

// posizione degli ibridi
#define IBRIDO_GENERE "genus"
#define IBRIDO_SPECIE "specie"
#define IBRIDO_SOTTOSPECIE "subspecie"
#define IBRIDO_VARIETA "variety"
#define IBRIDO_SOTTOVARIETA "subvariety"
#define IBRIDO_FORMA "form"
#define IBRIDO_RACE "race"
#define IBRIDO_SUBLUSUS "sublusus"
#define IBRIDO_CULTIVAR "cultivar"

PG_FUNCTION_INFO_V1(esterna_nome);

Datum esterna_nome(PG_FUNCTION_ARGS){
	char buffer[300];
int caratteriInseriti=0; // tiene il conto dei caratteri presenti in buffer
	Datum datumIbrido        = PG_GETARG_DATUM(0);
	bool proParte            = PG_GETARG_BOOL(1);
text *genere = (PG_ARGISNULL( 2) || VARSIZE(PG_GETARG_TEXT_P( 2))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(2)); text *specieNome = (PG_ARGISNULL( 3) || VARSIZE(PG_GETARG_TEXT_P( 3))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(3)); text *specieAutore = (PG_ARGISNULL( 4) || VARSIZE(PG_GETARG_TEXT_P( 4))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(4)); text *sottospecieNome = (PG_ARGISNULL( 5) || VARSIZE(PG_GETARG_TEXT_P( 5))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(5)); text *sottospecieAutore = (PG_ARGISNULL( 6) || VARSIZE(PG_GETARG_TEXT_P( 6))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(6)); text *varietaNome = (PG_ARGISNULL( 7) || VARSIZE(PG_GETARG_TEXT_P( 7))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(7)); text *varietaAutore = (PG_ARGISNULL( 8) || VARSIZE(PG_GETARG_TEXT_P( 8))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(8)); text *sottoVarietaNome = (PG_ARGISNULL( 9) || VARSIZE(PG_GETARG_TEXT_P( 9))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(9)); text *sottoVarietaAutore = (PG_ARGISNULL(10) || VARSIZE(PG_GETARG_TEXT_P(10))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(10)); text *formaNome = (PG_ARGISNULL(11) || VARSIZE(PG_GETARG_TEXT_P(11))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(11)); text *formaAutore = (PG_ARGISNULL(12) || VARSIZE(PG_GETARG_TEXT_P(12))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(12)); text *raceNome = (PG_ARGISNULL(13) || VARSIZE(PG_GETARG_TEXT_P(13))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(13)); text *raceAutore = (PG_ARGISNULL(14) || VARSIZE(PG_GETARG_TEXT_P(14))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(14)); text *sublususNome = (PG_ARGISNULL(15) || VARSIZE(PG_GETARG_TEXT_P(15))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(15)); text *sublususAutore = (PG_ARGISNULL(16) || VARSIZE(PG_GETARG_TEXT_P(16))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(16)); text *cultivar = (PG_ARGISNULL(17) || VARSIZE(PG_GETARG_TEXT_P(17))==VARHDRSZ ?NULL:PG_GETARG_TEXT_P(17));
	text *nomeEsterno;
	Datum unrolled;
	char *ibrido;
	char debug[300];

	unrolled = DirectFunctionCall1(enum_out,datumIbrido);
	ibrido = DatumGetCString(unrolled);

	// genere
	if(strcmp(ibrido,IBRIDO_GENERE)==0){
		// HERE
		buffer[0]='X';
		buffer[1]=' ';
		caratteriInseriti=2;
	}
	INSERISCI_PARTE(genere);
	// specie
	TEST_IBRIDO(IBRIDO_SPECIE);
	if(specieNome!=NULL){
		INSERISCI_PARTE(specieNome);
		if(specieAutore!=NULL){
			INSERISCI_PARTE(specieAutore);
		}
	}
	// sottospecie
	if(sottospecieNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoSottospecie,LUNGHEZZA_PREF_SS);
		caratteriInseriti+=LUNGHEZZA_PREF_SS;
		TEST_IBRIDO(IBRIDO_SOTTOSPECIE);
		INSERISCI_PARTE(sottospecieNome);
		if(sottospecieAutore!=NULL){
			INSERISCI_PARTE(sottospecieAutore);
		}
	}
	// varieta
	if(varietaNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoVarieta,LUNGHEZZA_PREF_VAR);
		caratteriInseriti+=LUNGHEZZA_PREF_VAR;
		TEST_IBRIDO(IBRIDO_VARIETA);
		INSERISCI_PARTE(varietaNome);
		if(varietaAutore!=NULL){
			INSERISCI_PARTE(varietaAutore);
		}
	}
	// sotto varieta
	if(sottoVarietaNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoSottoVarieta,LUNGHEZZA_PREF_SVAR);
		caratteriInseriti+=LUNGHEZZA_PREF_SVAR;
		TEST_IBRIDO(IBRIDO_SOTTOVARIETA);
		INSERISCI_PARTE(sottoVarietaNome);
		if(sottoVarietaAutore!=NULL){
			INSERISCI_PARTE(sottoVarietaAutore);
		}
	}
	// forma
	if(formaNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoForma,LUNGHEZZA_PREF_FO);
		caratteriInseriti+=LUNGHEZZA_PREF_FO;
		TEST_IBRIDO(IBRIDO_FORMA);
		INSERISCI_PARTE(formaNome);
		if(formaAutore!=NULL){
			INSERISCI_PARTE(formaAutore);
		}
	}

	// race
	if(raceNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoRace,LUNGHEZZA_PREF_RACE);
		caratteriInseriti+=LUNGHEZZA_PREF_RACE;
		TEST_IBRIDO(IBRIDO_RACE);
		INSERISCI_PARTE(raceNome);
		if(raceAutore!=NULL){
			INSERISCI_PARTE(raceAutore);
		}
	}
	// sublusus
	if(sublususNome!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoSublusus,LUNGHEZZA_PREF_SUBLUSUS);
		caratteriInseriti+=LUNGHEZZA_PREF_SUBLUSUS;
		TEST_IBRIDO(IBRIDO_SUBLUSUS);
		INSERISCI_PARTE(sublususNome);
		if(sublususAutore!=NULL){
			INSERISCI_PARTE(sublususAutore);
		}
	}

	// cultivar
	if(cultivar!=NULL){
		memcpy(buffer+caratteriInseriti,prefissoCultivar,LUNGHEZZA_PREF_CV);
		caratteriInseriti+=LUNGHEZZA_PREF_CV;
		TEST_IBRIDO(IBRIDO_CULTIVAR);
		INSERISCI_PARTE(cultivar);
	}
	//pro parte
	if(proParte==true){
		memcpy(buffer+caratteriInseriti,suffissoProParte,LUNGHEZZA_POST_PP);
		caratteriInseriti+=LUNGHEZZA_POST_PP;
	}

	nomeEsterno=(text *)palloc(caratteriInseriti-1+VARHDRSZ);
	memcpy(VARDATA(nomeEsterno),buffer,caratteriInseriti-1);
// VARATT_SIZEP(nomeEsterno)=caratteriInseriti-1+VARHDRSZ; // per postgreSQL <=8.2 SET_VARSIZE(nomeEsterno, caratteriInseriti-1+VARHDRSZ); // per postgreSQL 8.3
	PG_RETURN_TEXT_P(nomeEsterno);
}

--
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux