sql probléma ccc update után

Fórumok

A legutóbbi ccc update után az sgl-es program az első select-nél elszállt. Az oknyomozás során a postgresql driver rowset.prg-ben a következő eltérést találtam a
korábbi verzióhoz képest (122. sor):

if( filterclause!=NIL )
stmt+=" "+sql2.postgres.sqlbind(filterclause,bindarray)
end

Az idézőjelek közül kimaradhatott a where kulcsszó, beírtam újrafordítás után minden OK.

Hozzászólások

Tévedsz. Az idézőjek között csak egy szóköz van, hogy a parancs elemei el legyenek választva. A where a filterclause része (első szava). Talán a tds-t szúrtad el. Itt egy példa, hogyan kell selectet definiálni:


select: select_kk  
    where konyvkelt<:1 or konyvkelt is null 
    order by szamlaszam

Az ide beírt "where" kerül át a filterclause-ba.

--
CCC3

A tds-ek teljesen renben vannak ugyanis egy korábbi verzióval tökéletesen működnek.

Beidézném neked a comfirm.hu-ról letölthető verzió idevonatkozó kódrészletét:

static function rowset.__select__(this,whereclause,orderbyclause,bindarray,wait,crsflg)

local stmt,status,err

stmt:="select "+this:__table__:__selectlist__
stmt+=" from "+this:__table__:__fromclause__

if( whereclause!=NIL )
stmt+=" where "+sql2.postgres.sqlbind(whereclause,bindarray)
end

if( NIL!=orderbyclause )
stmt+=" order by "+orderbyclause
end

Biztos hogy tévedek?

Úgy látom, összekevered a változatokat.

Az első postodban levő kódrészletet megtaláltam a legfrissebb (svn-ből letölthető) változatban. Ellenőriztem: benne van a "where". Ha az általad javasolt helyre is be volna írva a "where", akkor már duplán volna.

A második postodban levő kódrészlet viszont a letölthető zip-ből van, ami sokkal régebbi. A két változat közötti eltérésre most nehezen tudnék visszaemlékezni. Az újat kell használni és kész (tehát az svn-t).

Nem tudom, nem CCC2-t használsz-e. Ha azt használsz, azt is frissítsd az svn-ből. Sokat dolgoztam azért, hogy a CCC3-ban fejlesztett egyes könyvtárak (mint az SQL2 interfész is) leforduljanak CCC2 alatt (UTF8/unicode helyett Latin-1-gyel). Most az a helyzet, hogy az SQL2 könyvtár forrása CCC2-ben és CCC3-ban megegyezik. A továbbiakban már csak ezt szeretném karban tartani.

--
CCC3

Természetesen már ccc3-at használok és svn-ből frissítek.

A következőt próbáltam ma: leszedtem svn-el a teljes ccc3-at (187-es rev.) egy új
könyvtárba (tehát nem update-eltem)
A ..../driver-postgres/rowset.prg-ben (15212 bájt) nincsen where string!

Remélem nem kekeckedésnek veszed, de a mellékelt ábra szerint itt valami nem OK.

Talán segít, ha megnézed az util/tdsutil/tds2dom.prg 320. sora táján a kódba írt commenteket, különösen ezt:


#ifdef EMLEKEZTETO //where kiegészítés 2007.06.19
  Korábban vagy volt "where" klóz, vagy egyáltalán nem lehetett 
  filterezni, pl. nem kezdődhetett a filter egy "group by" klózzal.
  A tds elemző a where kulcsszót levágta, az SQL kódgenerátor 
  pedig újra berakta. Most meghagyjuk a filter klózokat úgy, 
  ahogy beírták. 
#endif

A másik, hogy vannak projektek, ahol CCC2-t _kell_ használni. A CCC2 és a CCC3 között a karakterkódolás a legnagyobb különbség. Ha olyan a szituáció, hogy nem lehet áttérni UTF-8/unicode kódolásra (pl. a főnök nem engedi), akkor maradni kell CCC2-n. A CCC2-ben ugyanúgy benne vannak a korszerűsítések, mint a CCC3-ban. Egyszer írta itt valaki, hogy ilyen helyzetben van.

--
CCC3

Nálam ott van a "where".

Ellenőrizd, hogy minden utility újra legyen fordítva, különösen a tds2prg. Az SQL-es dolgok nem fordulnak automatikusan, hanem be kell menni a $CCCDIR/tools/sql2-be, és elindítani az mkall.b-t. Utána futtasd le ezt:


    tds2prg.exe aal.tds

A generált kód (aal.prg) 76. és 78. sorában ott kell legyen a "where", nekem ott van. A te eseted olyan, mintha a régi változatú tds2prg-t használnád az új változatú SQL kódgenerátorral (lásd még az "emlékeztetőt", amit korábban írtam).

Nem tudom ismered-e a jeed programot. Ha nem, próbáld ki: jeed.exe aal.tds. (Ehhez meg a Jáva terminált kell külön lefordítani: $CCCDIR/jt-ben mkall.b)

Ha már itt tartunk, így célszerű CCC-t fordítani:

1) $CCCDIR-ben (clean-all.b) install.b
2) $CCCDIR/jt-ben (clean.b) mkall.b
3) $CCCDIR/tools/sql2-ben (clean.b) mkall.b
4) $CCCDIR/gtk-ban (cleanall.b) mkall.b

A 2-3-4 lépés nem automatikus, mert nem kell mindig mindenkinek, és plusz dolgokat kell hozzá installálni.

Ja. Ha már itt tartunk. Nemrég telepítettem egy új Gutsyt, és volt alkalmam kifigyelni, hogy miket kell installálni, hogy forduljon a CCC. Itt az eredmény.

--
CCC3

A problémát a következő okozta: a frissített CCC letöltése és újrafordítása után, az alkalmazásom tds könyvtárában csak a lib és obj fájlokat töröltem le és fordítottam újra az mklib scripttel (ami az mkentitylib.exe-t indítja)
A régi, tds-ből generált prg-ket nem töröltem le, így a lib ezekből fordítódott.
A prg-k törlése és az mklib újrafuttatása után minden rendbe jött.

Tanulság: ha módosul az sql2 a ccc-ben akkor az alkalmazásunk tábladefiníciókat tartalmazó könyvtárában töröljük a prg-ket is (ezt akár az mklib szkriptbe is bele lehetne tenni)

Köszönöm mrev-nek a segítséget probléma megoldásában.

A mkentitylib alapesetben akkor csinál a tds-ből prg-t, ha az előbbi frissebb vagy az utóbbi nem létezik. Ha viszont be van állítva a MKENTITYLIB_FORCE környezet bármilyen nemüres értékre, akkor a fájlidőktől függetlenül minden prg-t újragyárt. Ezt kellett volna használni, nem emlékeztem rá.

--
CCC3

mivel a rejtély tisztázódott úgy gondoltam módosítom a post címét (Postgresql bug?) nehogy már azt sugallja hogy bugos a ccc :)