>CLEAR >CREATE CURSOR mcur ( FMEM M NOT NULL) >* i cannot index a SUBSTRING of a MEMO field directly >INDEX ON SUBSTR(FMEM,5,10) TAG TAG1 >>An workaround is simple, but it annoying use it for get optimized SELECT
>CLEAR >********** >CREATE CURSOR mcur ( FMEM M NOT NULL) >INSERT INTO mcur VALUES ('ab') >INSERT INTO mcur VALUES ('ac') >INSERT INTO mcur VALUES ('ac1') >INSERT INTO mcur VALUES ('ad'+REPLICATE(CHR(255),300)) >* for SUBSTR() INDEX ON check oversize if exist a oversize key on memo values >INDEX ON SUBSTR(FMEM+'',2,250) TAG TAG1 > >********* > >CREATE CURSOR mcur ( FMEM M NOT NULL) >* for LEFT() INDEX ON check oversize key, also for empty cursor >INDEX ON LEFT(FMEM,250) TAG TAGERR && ignore error end continue > >INSERT INTO mcur VALUES ('ab') >INSERT INTO mcur VALUES ('ac') >INSERT INTO mcur VALUES ('ac1') >* for SUBSTR() INDEX ON is build also if expression oversized 240 >INDEX ON SUBSTR(FMEM+'',2,250) TAG TAG1 >* next value have a oversize key >INSERT INTO mcur VALUES ('ad'+REPLICATE(CHR(255),300)) >* but index is 2 lenght >? 'b' ,KEYMATCH('b') && FOUND >? 'b ' ,KEYMATCH('b ') && FOUND >? 'b ' ,KEYMATCH('b ') && NOT FOUND -> KEY LENGHT IS 2 >? 'c1' ,KEYMATCH('c1') && FOUND >? 'd'+CHR(255) ,KEYMATCH('d'+CHR(255)) && FOUND >? 'd'+CHR(255)+CHR(255) ,KEYMATCH('d'+CHR(255)++CHR(255)) && NOT FOUND >* If i reindex, check oversize is not done ( a oversize key exist on field ) >REINDEX >* now index have key lenght of 240 bytes >? 'd+CHR(255)x239' ,KEYMATCH('d'+REPLICATE(CHR(255),239)) && FOUND !!! >? 'd+CHR(255)x240' ,KEYMATCH('d'+REPLICATE(CHR(255),240)) && NOT FOUND !!! >* but if i search right spaced strings it apply 250 limit on internal pointers and go in a buffer overrun >? 'b+SPACE(239)' ,KEYMATCH('b'+SPACE(239)) && FOUND >? 'b+SPACE(240)' ,KEYMATCH('b'+SPACE(240)) && FOUND !!! >? 'b+SPACE(241)' ,KEYMATCH('b'+SPACE(241)) && FOUND !!! >? 'b+SPACE(242)' ,KEYMATCH('b'+SPACE(242)) && FOUND !!! >? 'b+SPACE(243)' ,KEYMATCH('b'+SPACE(243)) && FOUND !!! >* now point go out of buffer, and VFP Crash >? 'b+SPACE(244)' ,KEYMATCH('b'+SPACE(244)) && BUFFER OVERRRUN >>