I made a patch which seems to do this for you...once in a while it's fun to do a bit of programming like this...I didn't do extensive testing on this so you may want to do some yourself. It's going to just about double the RTREE size of course. SQLite version 3.7.3 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> CREATE VIRTUAL TABLE demo_index USING rtree( ...> id, -- Integer primary key ...> minX, maxX, -- Minimum and maximum X coordinate ...> minY, maxY -- Minimum and maximum Y coordinate ...> ); sqlite> INSERT INTO demo_index VALUES( ...> 1, -- Primary key ...> -80.7749, -80.7747, -- Longitude range ...> 30.3776, 30.3778 -- Latitude range ...> ); sqlite> INSERT INTO demo_index VALUES( ...> 2, ...> -81.0, -79.6, ...> 35.0, 36.2 ...> ); sqlite> INSERT INTO demo_index VALUES(3,-80.77491234,-80.77471234,30.37761234,30 .37781234); sqlite> select * from demo_index; 1|-80.7749|-80.7747|30.3776|30.3778 2|-81.0|-79.6|35.0|36.2 3|-80.77491234|-80.77471234|30.37761234|30.37781234 Use this switch to enable double precision on RTREE /DRTREE_DOUBLE *** ..\..\sqlite3.c Thu Oct 07 22:36:26 2010 --- sqlite3.c Tue Nov 02 10:43:16 2010 *************** *** 116902,116909 **** --- 116902,116914 ---- }; union RtreeCoord { + #ifndef RTREE_DOUBLE float f; int i; + #else + double f; + u64 i; + #endif }; /* *************** *** 117006,117011 **** --- 117011,117017 ---- return (p[0]<<8) + p[1]; } static void readCoord(u8 *p, RtreeCoord *pCoord){ + #ifndef RTREE_DOUBLE u32 i = ( (((u32)p[0]) << 24) + (((u32)p[1]) << 16) + *************** *** 117013,117018 **** --- 117019,117037 ---- (((u32)p[3]) << 0) ); *(u32 *)pCoord = i; + #else + u64 i = ( + (((u64)p[0]) << 56) + + (((u64)p[1]) << 48) + + (((u64)p[2]) << 40) + + (((u64)p[3]) << 32) + + (((u64)p[4]) << 24) + + (((u64)p[5]) << 16) + + (((u64)p[6]) << 8) + + (((u64)p[7]) << 0) + ); + *(u64 *)pCoord = i; + #endif } static i64 readInt64(u8 *p){ return ( *************** *** 117038,117043 **** --- 117057,117063 ---- return 2; } static int writeCoord(u8 *p, RtreeCoord *pCoord){ + #ifndef RTREE_DOUBLE u32 i; assert( sizeof(RtreeCoord)==4 ); assert( sizeof(u32)==4 ); *************** *** 117047,117052 **** --- 117067,117087 ---- p[2] = (i>> 8)&0xFF; p[3] = (i>> 0)&0xFF; return 4; + #else + u64 i; + assert( sizeof(RtreeCoord)==8 ); + assert( sizeof(u64)==8 ); + i = *(u64 *)pCoord; + p[0] = (i>>56)&0xFF; + p[1] = (i>>48)&0xFF; + p[2] = (i>>40)&0xFF; + p[3] = (i>>32)&0xFF; + p[4] = (i>>24)&0xFF; + p[5] = (i>>16)&0xFF; + p[6] = (i>> 8)&0xFF; + p[7] = (i>> 0)&0xFF; + return 8; + #endif } static int writeInt64(u8 *p, i64 i){ p[0] = (i>>56)&0xFF; *************** *** 117365,117371 **** --- 117400,117410 ---- int iCoord, RtreeCoord *pCoord /* Space to write result to */ ){ + #ifndef RTREE_DOUBLE readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); + #else + readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 8*iCoord], pCoord); + #endif } /* *************** *** 119463,119470 **** --- 119502,119514 ---- assert( nData==(pRtree->nDim*2 + 3) ); if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + #ifndef RTREE_DOUBLE cell.aCoord[ii].f = (float)sqlite3_value_double(azData[ii+3]); cell.aCoord[ii+1].f = (float)sqlite3_value_double(azData[ii+4]); + #else + cell.aCoord[ii].f = sqlite3_value_double(azData[ii+3]); + cell.aCoord[ii+1].f = sqlite3_value_double(azData[ii+4]); + #endif if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){ rc = SQLITE_CONSTRAINT; goto constraint; *************** *** 119746,119752 **** --- 119790,119800 ---- pRtree->zDb = (char *)&pRtree[1]; pRtree->zName = &pRtree->zDb[nDb+1]; pRtree->nDim = (argc-4)/2; + #ifndef RTREE_DOUBLE pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2; + #else + pRtree->nBytesPerCell = 8 + pRtree->nDim*8*2; + #endif pRtree->eCoordType = eCoordType; memcpy(pRtree->zDb, argv[1], nDb); memcpy(pRtree->zName, argv[2], nName); *************** *** 119818,119824 **** --- 119866,119877 ---- memset(&node, 0, sizeof(RtreeNode)); memset(&tree, 0, sizeof(Rtree)); tree.nDim = sqlite3_value_int(apArg[0]); + #ifndef RTREE_DOUBLE tree.nBytesPerCell = 8 + 8 * tree.nDim; + #else + tree.nBytesPerCell = 8 + 16 * tree.nDim; + #endif + node.zData = (u8 *)sqlite3_value_blob(apArg[1]); for(ii=0; ii<NCELL(&node); ii++){
Michael D. Black Senior Scientist Advanced Analytics Directorate Northrop Grumman Information Systems
_______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users