1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

New options for vt02.c that allow tests to configure it to partially

de-duplicate a DISTINCT query.

FossilOrigin-Name: 1c65bb6e5d92cf39c409b7f870253571ec96b48abf87e5ed931cabd86f582069
This commit is contained in:
drh
2025-12-18 16:14:38 +00:00
parent ce46f82bc4
commit ae66a8d760
3 changed files with 25 additions and 13 deletions

View File

@@ -1,5 +1,5 @@
C Improve\stests\sin\sbestindexF.test.\sNo\schanges\sto\snon-test\scode.
D 2025-12-18T16:05:05.184
C New\soptions\sfor\svt02.c\sthat\sallow\stests\sto\sconfigure\sit\sto\spartially\nde-duplicate\sa\sDISTINCT\squery.
D 2025-12-18T16:14:38.572
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -1948,7 +1948,7 @@ F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661
F test/view.test 3c23d7a068e9e4a0c4e6907498042772adea725f0630c3d9638ffd4e5a08b92b
F test/view2.test db32c8138b5b556f610b35dfddd38c5a58a292f07fda5281eedb0851b2672679
F test/view3.test ad8a8290ee2b55ff6ce66c9ef1ce3f1e47926273a3814e1c425293e128a95456
F test/vt02.c e2eb2e576567bba5c0f7bd7fe1a267fe566f1422a55fcff6dda02012159ec95d
F test/vt02.c 91f2643dce0385300294cb2e78b459d038a3f4b095ab5031926742e8871487d4
F test/vt100-a.sql a3e188a118ca78c08b41681a4db6d0f353e554ceb33f1573b1872d16e2d30596
F test/vtab1.test 09a72330d0f31eda2ffaa828b06a6b917fb86250ee72de0301570af725774c07
F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082
@@ -2187,8 +2187,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 612c1ece6752e3318fc688717ad6a82219b85df7d32e4e07dbc2f361a5aeeee4
R 580ea8657cb3efb5b82ff2a1e13c7fc2
U dan
Z 99a67f6205f5b3113357bf79d420e775
P 347d4d34c1815827e7049e57830c1fff67f6eb16ae5cc00839e35d94bac81e92
R 29e510d0a5b9184871ac0c9974760fc9
U drh
Z 011846103a1c6bd79a9c9fff8a8c2bf0
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
347d4d34c1815827e7049e57830c1fff67f6eb16ae5cc00839e35d94bac81e92
1c65bb6e5d92cf39c409b7f870253571ec96b48abf87e5ed931cabd86f582069

View File

@@ -111,6 +111,13 @@
** vector of results sent to xFilter. Only the first
** few are used, as required by idxNum.
**
** 0x80 If sqlite3_vtab_distinct() says that duplicate rows
** may be omitted (values 2 or 3), then maybe omit
** some but not all of the duplicate rows.
**
** 0x100 Do not omit any duplicate rows even if
** sqlite3_vtab_distinct() says that is ok to do.
**
** Because these flags take effect during xBestIndex, the RHS of the
** flag= constraint must be accessible. In other words, the RHS of flag=
** needs to be an integer literal, not another column of a join or a
@@ -215,6 +222,8 @@ struct vt02_vtab {
#define VT02_NO_OFFSET 0x0004 /* Omit the offset optimization */
#define VT02_ALLOC_IDXSTR 0x0008 /* Alloate an idxStr */
#define VT02_BAD_IDXNUM 0x0010 /* Generate an invalid idxNum */
#define VT02_PARTIAL_DEDUP 0x0080 /* Omit some but not all duplicate rows */
#define VT02_NO_DEDUP 0x0100 /* Include all duplicate rows */
/*
** A cursor
@@ -905,18 +914,21 @@ static int vt02BestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
}else if( nAsc==0 ){
pInfo->idxNum += 1000; /* Reverse output order */
}
if( eDistinct==2 ){ /* DISTINCT */
if( eDistinct>=2 && (flags & VT02_NO_DEDUP)!=0 ){
eDistinct = 1;
}
if( eDistinct>=2 ){ /* DISTINCT or (DISTINCT and ORDER BY) */
if( x==0x02 ){
/* DISTINCT A */
pInfo->idxNum += 30;
pInfo->idxNum += (flags & VT02_PARTIAL_DEDUP)!=0 ? 20 : 30;
pInfo->orderByConsumed = 1;
}else if( x==0x06 ){
/* DISTINCT A,B */
pInfo->idxNum += 20;
pInfo->idxNum += (flags & VT02_PARTIAL_DEDUP)!=0 ? 10 : 20;
pInfo->orderByConsumed = 1;
}else if( x==0x0e ){
/* DISTINCT A,B,C */
pInfo->idxNum += 10;
pInfo->idxNum += (flags & VT02_PARTIAL_DEDUP)!=0 ? 0 : 10;
pInfo->orderByConsumed = 1;
}else if( x & 0x01 ){
/* DISTINCT X */
@@ -925,7 +937,7 @@ static int vt02BestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
/* DISTINCT A,B,C,D */
pInfo->orderByConsumed = 1;
}
}else if( eDistinct>=1 ){ /* GROUP BY or (DISTINCT and ORDER BY) */
}else{ /* GROUP BY */
if( x==0x02 ){
/* GROUP BY A */
pInfo->orderByConsumed = 1;