@@ -361,7 +361,7 @@ static int changesFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum,
361
361
}
362
362
363
363
char * zSql = crsql_changesUnionQuery (pTab -> pExtData -> zpTableInfos ,
364
- pTab -> pExtData -> tableInfosLen , idxNum );
364
+ pTab -> pExtData -> tableInfosLen , idxStr );
365
365
366
366
if (zSql == 0 ) {
367
367
pTabBase -> zErrMsg = sqlite3_mprintf (
@@ -379,46 +379,59 @@ static int changesFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum,
379
379
return rc ;
380
380
}
381
381
382
- // pull user provided params to `getChanges`
383
- int i = 0 ;
384
- sqlite3_int64 versionBound = MIN_POSSIBLE_DB_VERSION ;
385
- const char * requestorSiteId = "aa" ;
386
- int siteIdType = SQLITE_BLOB ;
387
- int requestorSiteIdLen = 1 ;
388
- if (idxNum & 2 ) {
389
- versionBound = sqlite3_value_int64 (argv [i ]);
390
- ++ i ;
391
- }
392
- if (idxNum & 4 ) {
393
- siteIdType = sqlite3_value_type (argv [i ]);
394
- requestorSiteIdLen = sqlite3_value_bytes (argv [i ]);
395
- if (requestorSiteIdLen != 0 ) {
396
- requestorSiteId = (const char * )sqlite3_value_blob (argv [i ]);
397
- } else {
398
- requestorSiteIdLen = 1 ;
399
- }
400
- ++ i ;
401
- }
402
-
403
382
// now bind the params.
404
- // for each table info we need to bind 2 params:
405
- // 1. the site id
406
- // 2. the version
407
- int j = 1 ;
408
- for (i = 0 ; i < pTab -> pExtData -> tableInfosLen ; ++ i ) {
409
- if (siteIdType == SQLITE_NULL ) {
410
- sqlite3_bind_null (pStmt , j ++ );
411
- } else {
412
- sqlite3_bind_blob (pStmt , j ++ , requestorSiteId , requestorSiteIdLen ,
413
- SQLITE_STATIC );
383
+ // for each arg, bind.
384
+ for (int i = 0 ; i < argc ; ++ i ) {
385
+ rc = sqlite3_bind_value (pStmt , i + 1 , argv [i ]);
386
+ if (rc != SQLITE_OK ) {
387
+ pTabBase -> zErrMsg = sqlite3_mprintf (
388
+ "error binding params to the statement to extract "
389
+ "changes." );
390
+ sqlite3_finalize (pStmt );
391
+ return rc ;
414
392
}
415
- sqlite3_bind_int64 (pStmt , j ++ , versionBound );
416
393
}
417
394
418
395
pCrsr -> pChangesStmt = pStmt ;
419
396
return changesNext ((sqlite3_vtab_cursor * )pCrsr );
420
397
}
421
398
399
+ static const char * getOperatorString (unsigned char op ) {
400
+ // SQLITE_INDEX_CONSTRAINT_NE
401
+ switch (op ) {
402
+ case SQLITE_INDEX_CONSTRAINT_EQ :
403
+ return "=" ;
404
+ case SQLITE_INDEX_CONSTRAINT_GT :
405
+ return ">" ;
406
+ case SQLITE_INDEX_CONSTRAINT_LE :
407
+ return "<=" ;
408
+ case SQLITE_INDEX_CONSTRAINT_LT :
409
+ return "<" ;
410
+ case SQLITE_INDEX_CONSTRAINT_GE :
411
+ return ">=" ;
412
+ case SQLITE_INDEX_CONSTRAINT_MATCH :
413
+ return "MATCH" ;
414
+ case SQLITE_INDEX_CONSTRAINT_LIKE :
415
+ return "LIKE" ;
416
+ case SQLITE_INDEX_CONSTRAINT_GLOB :
417
+ return "GLOB" ;
418
+ case SQLITE_INDEX_CONSTRAINT_REGEXP :
419
+ return "REGEXP" ;
420
+ case SQLITE_INDEX_CONSTRAINT_NE :
421
+ return "!=" ;
422
+ case SQLITE_INDEX_CONSTRAINT_ISNOT :
423
+ return "IS NOT" ;
424
+ case SQLITE_INDEX_CONSTRAINT_ISNOTNULL :
425
+ return "IS NOT NULL" ;
426
+ case SQLITE_INDEX_CONSTRAINT_ISNULL :
427
+ return "IS NULL" ;
428
+ case SQLITE_INDEX_CONSTRAINT_IS :
429
+ return "IS" ;
430
+ default :
431
+ return 0 ;
432
+ }
433
+ }
434
+
422
435
/*
423
436
** SQLite will invoke this method one or more times while planning a query
424
437
** that uses the virtual table. This routine needs to create
@@ -481,8 +494,6 @@ static int changesBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo) {
481
494
argvIndex += 1 ;
482
495
}
483
496
484
- const struct sqlite3_index_constraint * pConstraint =
485
- & pIdxInfo -> aConstraint [i ];
486
497
switch (pConstraint -> iColumn ) {
487
498
case CHANGES_SINCE_VTAB_DB_VRSN :
488
499
idxNum |= 2 ;
@@ -520,42 +531,6 @@ static int changesBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo) {
520
531
return SQLITE_OK ;
521
532
}
522
533
523
- static const char * getOperatorString (unsigned char op ) {
524
- // SQLITE_INDEX_CONSTRAINT_NE
525
- switch (op ) {
526
- case SQLITE_INDEX_CONSTRAINT_EQ :
527
- return "=" ;
528
- case SQLITE_INDEX_CONSTRAINT_GT :
529
- return ">" ;
530
- case SQLITE_INDEX_CONSTRAINT_LE :
531
- return "<=" ;
532
- case SQLITE_INDEX_CONSTRAINT_LT :
533
- return "<" ;
534
- case SQLITE_INDEX_CONSTRAINT_GE :
535
- return ">=" ;
536
- case SQLITE_INDEX_CONSTRAINT_MATCH :
537
- return "MATCH" ;
538
- case SQLITE_INDEX_CONSTRAINT_LIKE :
539
- return "LIKE" ;
540
- case SQLITE_INDEX_CONSTRAINT_GLOB :
541
- return "GLOB" ;
542
- case SQLITE_INDEX_CONSTRAINT_REGEXP :
543
- return "REGEXP" ;
544
- case SQLITE_INDEX_CONSTRAINT_NE :
545
- return "!=" ;
546
- case SQLITE_INDEX_CONSTRAINT_ISNOT :
547
- return "IS NOT" ;
548
- case SQLITE_INDEX_CONSTRAINT_ISNOTNULL :
549
- return "IS NOT NULL" ;
550
- case SQLITE_INDEX_CONSTRAINT_ISNULL :
551
- return "IS NULL" ;
552
- case SQLITE_INDEX_CONSTRAINT_IS :
553
- return "IS" ;
554
- default :
555
- return 0 ;
556
- }
557
- }
558
-
559
534
static int changesApply (sqlite3_vtab * pVTab , int argc , sqlite3_value * * argv ,
560
535
sqlite3_int64 * pRowid ) {
561
536
int argv0Type = sqlite3_value_type (argv [0 ]);
0 commit comments