/ Check-in [98cc265987]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Update this branch with latest trunk changes.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | window-functions
Files: files | file ages | folders
SHA3-256: 98cc26598718e5557ee00aa77336024c91e483ec6de650e172ad1b44a6f0a77b
User & Date: dan 2019-03-19 11:17:28
Wiki:window-functions
Context
2019-03-19
11:56
Revert the OP_MustBeInt opcode implementation on this branch so that it again matches trunk. The extra functionality is no longer required. check-in: c02f77b1b4 user: dan tags: window-functions
11:17
Update this branch with latest trunk changes. check-in: 98cc265987 user: dan tags: window-functions
09:57
Add a LICENSE.md, containing the text of the blessing. check-in: cbb7e60272 user: drh tags: trunk
06:40
Ensure that all the new window-function keywords can still be used as SQL identifiers. check-in: a6d61dfd47 user: dan tags: window-functions
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Added LICENSE.md.













>
>
>
>
>
>
1
2
3
4
5
6
The author disclaims copyright to this source code.  In place of
a legal notice, here is a blessing:

  *   May you do good and not evil.
  *   May you find forgiveness for yourself and forgive others.
  *   May you share freely, never taking more than you give.

Changes to README.md.

1
2
3
4
5
6
7
8






9
10
11







12




13
14
15
16
17
18
19
20
21
22
23
24
...
290
291
292
293
294
295
296



























297
298
299
300
301
302
303
<h1 align="center">SQLite Source Repository</h1>

This repository contains the complete source code for the 
[SQLite database engine](https://sqlite.org/).  Some test scripts 
are also included.  However, many other test scripts
and most of the documentation are managed separately.

SQLite [does not use Git](https://sqlite.org/whynotgit.html).






If you are reading this on GitHub, then you are looking at an
unofficial mirror. See <https://sqlite.org/src> for the official
repository.












## Obtaining The Code

SQLite sources are managed using the
[Fossil](https://www.fossil-scm.org/), a distributed version control system
that was specifically designed to support SQLite development.
If you do not want to use Fossil, you can download tarballs or ZIP
archives or [SQLite archives](https://sqlite.org/cli.html#sqlar) as follows:

  *  Lastest trunk check-in as
     [Tarball](https://www.sqlite.org/src/tarball/sqlite.tar.gz),
     [ZIP-archive](https://www.sqlite.org/src/zip/sqlite.zip), or
     [SQLite-archive](https://www.sqlite.org/src/sqlar/sqlite.sqlar).
................................................................................

  *  **ext/misc/json1.c** - This file implements the various JSON functions
     that are build into SQLite.

There are many other source files.  Each has a succinct header comment that
describes its purpose and role within the larger system.





























## Contacts

The main SQLite webpage is [http://www.sqlite.org/](http://www.sqlite.org/)
with geographically distributed backups at
[http://www2.sqlite.org/](http://www2.sqlite.org) and
[http://www3.sqlite.org/](http://www3.sqlite.org).







|
>
>
>
>
>
>
|
<
<
>
>
>
>
>
>
>

>
>
>
>


<
<
<







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


16
17
18
19
20
21
22
23
24
25
26
27
28
29



30
31
32
33
34
35
36
...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
<h1 align="center">SQLite Source Repository</h1>

This repository contains the complete source code for the 
[SQLite database engine](https://sqlite.org/).  Some test scripts 
are also included.  However, many other test scripts
and most of the documentation are managed separately.

## Version Control

SQLite sources are managed using the
[Fossil](https://www.fossil-scm.org/), a distributed version control system
that was specifically designed and written to support SQLite development.
The [Fossil repository](https://sqlite.org/src/timeline) contains the urtext.

If you are reading this on GitHub or some other Git repository or service,


then you are looking at a mirror.  The names of check-ins and
other artifacts in a Git mirror are different from the official
names for those objects.  The offical names for check-ins are
found in a footer on the check-in comment for authorized mirrors.
The official check-in name can also be seen in the `manifest.uuid` file
in the root of the tree.  Always use the official name, not  the
Git-name, when communicating about an SQLite check-in.

If you pulled your SQLite source code from a secondary source and want to
verify its integrity, there are hints on how to do that in the
[Verifying Code Authenticity](#vauth) section below.

## Obtaining The Code




If you do not want to use Fossil, you can download tarballs or ZIP
archives or [SQLite archives](https://sqlite.org/cli.html#sqlar) as follows:

  *  Lastest trunk check-in as
     [Tarball](https://www.sqlite.org/src/tarball/sqlite.tar.gz),
     [ZIP-archive](https://www.sqlite.org/src/zip/sqlite.zip), or
     [SQLite-archive](https://www.sqlite.org/src/sqlar/sqlite.sqlar).
................................................................................

  *  **ext/misc/json1.c** - This file implements the various JSON functions
     that are build into SQLite.

There are many other source files.  Each has a succinct header comment that
describes its purpose and role within the larger system.

<a name="vauth"></a>
## Verifying Code Authenticity

If you obtained an SQLite source tree from a secondary source, such as a
GitHub mirror, and you want to verify that it has not been altered, there
are a couple of ways to do that.

If you have an official release version of SQLite, and you are using the
`sqlite3.c` amalgamation, then SHA3-256 hashes for the amalgamation are
available in the [change log](https://www.sqlite.org/changes.html) on
the official website.  After building the `sqlite3.c` file, you can check
that is authentic by comparing the hash.  This does not ensure that the
test scripts are unaltered, but it does validate the deliverable part of
the code and only involves computing and comparing a single hash.

For versions other than an official release, or if you are building the
`sqlite3.c` amalgamation using non-standard build options, the verification
process is a little more involved.  The `manifest` file at the root directory
of the source tree ([example](https://sqlite.org/src/artifact/bd49a8271d650fa8))
contains either a SHA3-256 hash (for newer files) or a SHA1 hash (for 
older files) for every source file in the repository.  You can write a script
to extracts hashes from `manifest` and verifies the hashes against the 
corresponding files in the source tree.  The SHA3-256 hash of the `manifest`
file itself is the official name of the version of the source tree that you
have.  The `manifest.uuid` file should contain the SHA3-256 hash of the
`manifest` file.  If all of the above hash comparisons are correct, then
you can be confident that your source tree is authentic and unadulterated.

## Contacts

The main SQLite webpage is [http://www.sqlite.org/](http://www.sqlite.org/)
with geographically distributed backups at
[http://www2.sqlite.org/](http://www2.sqlite.org) and
[http://www3.sqlite.org/](http://www3.sqlite.org).

Changes to ext/fts5/fts5Int.h.

579
580
581
582
583
584
585

586
587
588
589
590
591
592
593
594
/*
** Empty (but do not delete) a hash table.
*/
void sqlite3Fts5HashClear(Fts5Hash*);

int sqlite3Fts5HashQuery(
  Fts5Hash*,                      /* Hash table to query */

  const char *pTerm, int nTerm,   /* Query term */
  const u8 **ppDoclist,           /* OUT: Pointer to doclist for pTerm */
  int *pnDoclist                  /* OUT: Size of doclist in bytes */
);

int sqlite3Fts5HashScanInit(
  Fts5Hash*,                      /* Hash table to query */
  const char *pTerm, int nTerm    /* Query prefix */
);







>

|







579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
/*
** Empty (but do not delete) a hash table.
*/
void sqlite3Fts5HashClear(Fts5Hash*);

int sqlite3Fts5HashQuery(
  Fts5Hash*,                      /* Hash table to query */
  int nPre,
  const char *pTerm, int nTerm,   /* Query term */
  void **ppObj,                   /* OUT: Pointer to doclist for pTerm */
  int *pnDoclist                  /* OUT: Size of doclist in bytes */
);

int sqlite3Fts5HashScanInit(
  Fts5Hash*,                      /* Hash table to query */
  const char *pTerm, int nTerm    /* Query prefix */
);

Changes to ext/fts5/fts5_hash.c.

183
184
185
186
187
188
189
190





191
192

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215


216
217
218

219


220
221
222
223
224
225
226
...
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
...
441
442
443
444
445
446
447

448

449
450
451
452
453
454
455
...
469
470
471
472
473
474
475

476
477

478
479
480
481
482
483
484
485
486
487
488
489
490






491


492
493


494
495
496
497
498
499
500
501
502
...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537

  sqlite3_free(apOld);
  pHash->nSlot = nNew;
  pHash->aSlot = apNew;
  return SQLITE_OK;
}

static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){





  if( p->iSzPoslist ){
    u8 *pPtr = (u8*)p;

    if( pHash->eDetail==FTS5_DETAIL_NONE ){
      assert( p->nData==p->iSzPoslist );
      if( p->bDel ){
        pPtr[p->nData++] = 0x00;
        if( p->bContent ){
          pPtr[p->nData++] = 0x00;
        }
      }
    }else{
      int nSz = (p->nData - p->iSzPoslist - 1);       /* Size in bytes */
      int nPos = nSz*2 + p->bDel;                     /* Value of nPos field */

      assert( p->bDel==0 || p->bDel==1 );
      if( nPos<=127 ){
        pPtr[p->iSzPoslist] = (u8)nPos;
      }else{
        int nByte = sqlite3Fts5GetVarintLen((u32)nPos);
        memmove(&pPtr[p->iSzPoslist + nByte], &pPtr[p->iSzPoslist + 1], nSz);
        sqlite3Fts5PutVarint(&pPtr[p->iSzPoslist], nPos);
        p->nData += (nByte-1);
      }
    }



    p->iSzPoslist = 0;
    p->bDel = 0;
    p->bContent = 0;

  }


}

/*
** Add an entry to the in-memory hash table. The key is the concatenation
** of bByte and (pToken/nToken). The value is (iRowid/iCol/iPos).
**
**     (bByte || pToken) -> (iRowid,iCol,iPos)
................................................................................
  assert( (p->nAlloc - p->nData) >= (9 + 4 + 1 + 3 + 5) );

  pPtr = (u8*)p;

  /* If this is a new rowid, append the 4-byte size field for the previous
  ** entry, and the new rowid for this entry.  */
  if( iRowid!=p->iRowid ){
    fts5HashAddPoslistSize(pHash, p);
    p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iRowid - p->iRowid);
    p->iRowid = iRowid;
    bNew = 1;
    p->iSzPoslist = p->nData;
    if( pHash->eDetail!=FTS5_DETAIL_NONE ){
      p->nData += 1;
      p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
................................................................................
  ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot);
  if( !ap ) return SQLITE_NOMEM;
  memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot);

  for(iSlot=0; iSlot<pHash->nSlot; iSlot++){
    Fts5HashEntry *pIter;
    for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){

      if( pTerm==0 || 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm) ){

        Fts5HashEntry *pEntry = pIter;
        pEntry->pScanNext = 0;
        for(i=0; ap[i]; i++){
          pEntry = fts5HashEntryMerge(pEntry, ap[i]);
          ap[i] = 0;
        }
        ap[i] = pEntry;
................................................................................
}

/*
** Query the hash table for a doclist associated with term pTerm/nTerm.
*/
int sqlite3Fts5HashQuery(
  Fts5Hash *pHash,                /* Hash table to query */

  const char *pTerm, int nTerm,   /* Query term */
  const u8 **ppDoclist,           /* OUT: Pointer to doclist for pTerm */

  int *pnDoclist                  /* OUT: Size of doclist in bytes */
){
  unsigned int iHash = fts5HashKey(pHash->nSlot, (const u8*)pTerm, nTerm);
  char *zKey = 0;
  Fts5HashEntry *p;

  for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){
    zKey = fts5EntryKey(p);
    assert( p->nKey+1==(int)strlen(zKey) );
    if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break;
  }

  if( p ){






    fts5HashAddPoslistSize(pHash, p);


    *ppDoclist = (const u8*)&zKey[nTerm+1];
    *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1);


  }else{
    *ppDoclist = 0;
    *pnDoclist = 0;
  }

  return SQLITE_OK;
}

int sqlite3Fts5HashScanInit(
................................................................................
  const u8 **ppDoclist,           /* OUT: pointer to doclist */
  int *pnDoclist                  /* OUT: size of doclist in bytes */
){
  Fts5HashEntry *p;
  if( (p = pHash->pScan) ){
    char *zKey = fts5EntryKey(p);
    int nTerm = (int)strlen(zKey);
    fts5HashAddPoslistSize(pHash, p);
    *pzTerm = zKey;
    *ppDoclist = (const u8*)&zKey[nTerm+1];
    *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1);
  }else{
    *pzTerm = 0;
    *ppDoclist = 0;
    *pnDoclist = 0;
  }
}







|
>
>
>
>
>

|
>

|

|

|



|









|



>
>
|
|
|
>
|
>
>







 







|







 







>
|
>







 







>

<
>













>
>
>
>
>
>
|
>
>
|
<
>
>

|







 







|









183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
...
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
...
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
...
482
483
484
485
486
487
488
489
490

491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514

515
516
517
518
519
520
521
522
523
524
525
...
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560

  sqlite3_free(apOld);
  pHash->nSlot = nNew;
  pHash->aSlot = apNew;
  return SQLITE_OK;
}

static int fts5HashAddPoslistSize(
  Fts5Hash *pHash, 
  Fts5HashEntry *p,
  Fts5HashEntry *p2
){
  int nRet = 0;
  if( p->iSzPoslist ){
    u8 *pPtr = p2 ? (u8*)p2 : (u8*)p;
    int nData = p->nData;
    if( pHash->eDetail==FTS5_DETAIL_NONE ){
      assert( nData==p->iSzPoslist );
      if( p->bDel ){
        pPtr[nData++] = 0x00;
        if( p->bContent ){
          pPtr[nData++] = 0x00;
        }
      }
    }else{
      int nSz = (nData - p->iSzPoslist - 1);       /* Size in bytes */
      int nPos = nSz*2 + p->bDel;                     /* Value of nPos field */

      assert( p->bDel==0 || p->bDel==1 );
      if( nPos<=127 ){
        pPtr[p->iSzPoslist] = (u8)nPos;
      }else{
        int nByte = sqlite3Fts5GetVarintLen((u32)nPos);
        memmove(&pPtr[p->iSzPoslist + nByte], &pPtr[p->iSzPoslist + 1], nSz);
        sqlite3Fts5PutVarint(&pPtr[p->iSzPoslist], nPos);
        nData += (nByte-1);
      }
    }

    nRet = nData - p->nData;
    if( p2==0 ){
      p->iSzPoslist = 0;
      p->bDel = 0;
      p->bContent = 0;
      p->nData = nData;
    }
  }
  return nRet;
}

/*
** Add an entry to the in-memory hash table. The key is the concatenation
** of bByte and (pToken/nToken). The value is (iRowid/iCol/iPos).
**
**     (bByte || pToken) -> (iRowid,iCol,iPos)
................................................................................
  assert( (p->nAlloc - p->nData) >= (9 + 4 + 1 + 3 + 5) );

  pPtr = (u8*)p;

  /* If this is a new rowid, append the 4-byte size field for the previous
  ** entry, and the new rowid for this entry.  */
  if( iRowid!=p->iRowid ){
    fts5HashAddPoslistSize(pHash, p, 0);
    p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iRowid - p->iRowid);
    p->iRowid = iRowid;
    bNew = 1;
    p->iSzPoslist = p->nData;
    if( pHash->eDetail!=FTS5_DETAIL_NONE ){
      p->nData += 1;
      p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
................................................................................
  ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot);
  if( !ap ) return SQLITE_NOMEM;
  memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot);

  for(iSlot=0; iSlot<pHash->nSlot; iSlot++){
    Fts5HashEntry *pIter;
    for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){
      if( pTerm==0 
       || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm))
      ){
        Fts5HashEntry *pEntry = pIter;
        pEntry->pScanNext = 0;
        for(i=0; ap[i]; i++){
          pEntry = fts5HashEntryMerge(pEntry, ap[i]);
          ap[i] = 0;
        }
        ap[i] = pEntry;
................................................................................
}

/*
** Query the hash table for a doclist associated with term pTerm/nTerm.
*/
int sqlite3Fts5HashQuery(
  Fts5Hash *pHash,                /* Hash table to query */
  int nPre,
  const char *pTerm, int nTerm,   /* Query term */

  void **ppOut,                   /* OUT: Pointer to new object */
  int *pnDoclist                  /* OUT: Size of doclist in bytes */
){
  unsigned int iHash = fts5HashKey(pHash->nSlot, (const u8*)pTerm, nTerm);
  char *zKey = 0;
  Fts5HashEntry *p;

  for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){
    zKey = fts5EntryKey(p);
    assert( p->nKey+1==(int)strlen(zKey) );
    if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break;
  }

  if( p ){
    int nHashPre = sizeof(Fts5HashEntry) + nTerm + 1;
    int nList = p->nData - nHashPre;
    u8 *pRet = (u8*)(*ppOut = sqlite3_malloc64(nPre + nList + 10));
    if( pRet ){
      Fts5HashEntry *pFaux = (Fts5HashEntry*)&pRet[nPre-nHashPre];
      memcpy(&pRet[nPre], &((u8*)p)[nHashPre], nList);
      nList += fts5HashAddPoslistSize(pHash, p, pFaux);
      *pnDoclist = nList;
    }else{
      *pnDoclist = 0;

      return SQLITE_NOMEM;
    }
  }else{
    *ppOut = 0;
    *pnDoclist = 0;
  }

  return SQLITE_OK;
}

int sqlite3Fts5HashScanInit(
................................................................................
  const u8 **ppDoclist,           /* OUT: pointer to doclist */
  int *pnDoclist                  /* OUT: size of doclist in bytes */
){
  Fts5HashEntry *p;
  if( (p = pHash->pScan) ){
    char *zKey = fts5EntryKey(p);
    int nTerm = (int)strlen(zKey);
    fts5HashAddPoslistSize(pHash, p, 0);
    *pzTerm = zKey;
    *ppDoclist = (const u8*)&zKey[nTerm+1];
    *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1);
  }else{
    *pzTerm = 0;
    *ppDoclist = 0;
    *pnDoclist = 0;
  }
}

Changes to ext/fts5/fts5_index.c.

2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463

2464
2465
2466
2467
2468


2469
2470
2471






2472
2473
2474





2475
2476

2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
*/
static void fts5SegIterHashInit(
  Fts5Index *p,                   /* FTS5 backend */
  const u8 *pTerm, int nTerm,     /* Term to seek to */
  int flags,                      /* Mask of FTS5INDEX_XXX flags */
  Fts5SegIter *pIter              /* Object to populate */
){
  const u8 *pList = 0;
  int nList = 0;
  const u8 *z = 0;
  int n = 0;


  assert( p->pHash );
  assert( p->rc==SQLITE_OK );

  if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){


    p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm);
    sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList);
    n = (z ? (int)strlen((const char*)z) : 0);






  }else{
    pIter->flags |= FTS5_SEGITER_ONETERM;
    sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList);





    z = pTerm;
    n = nTerm;

  }

  if( pList ){
    Fts5Data *pLeaf;
    sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z);
    pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data));
    if( pLeaf==0 ) return;
    pLeaf->p = (u8*)pList;
    pLeaf->nn = pLeaf->szLeaf = nList;
    pIter->pLeaf = pLeaf;
    pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid);
    pIter->iEndofDoclist = pLeaf->nn;

    if( flags & FTS5INDEX_QUERY_DESC ){
      pIter->flags |= FTS5_SEGITER_REVERSE;







<



>





>
>



>
>
>
>
>
>

<
|
>
>
>
>
>


>


|
<

<
<
<







2453
2454
2455
2456
2457
2458
2459

2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480

2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492

2493



2494
2495
2496
2497
2498
2499
2500
*/
static void fts5SegIterHashInit(
  Fts5Index *p,                   /* FTS5 backend */
  const u8 *pTerm, int nTerm,     /* Term to seek to */
  int flags,                      /* Mask of FTS5INDEX_XXX flags */
  Fts5SegIter *pIter              /* Object to populate */
){

  int nList = 0;
  const u8 *z = 0;
  int n = 0;
  Fts5Data *pLeaf = 0;

  assert( p->pHash );
  assert( p->rc==SQLITE_OK );

  if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){
    const u8 *pList = 0;

    p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm);
    sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList);
    n = (z ? (int)strlen((const char*)z) : 0);
    if( pList ){
      pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data));
      if( pLeaf ){
        pLeaf->p = pList;
      }
    }
  }else{

    p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), 
        (const char*)pTerm, nTerm, (void**)&pLeaf, &nList
    );
    if( pLeaf ){
      pLeaf->p = (u8*)&pLeaf[1];
    }
    z = pTerm;
    n = nTerm;
    pIter->flags |= FTS5_SEGITER_ONETERM;
  }

  if( pLeaf ){

    sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z);



    pLeaf->nn = pLeaf->szLeaf = nList;
    pIter->pLeaf = pLeaf;
    pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid);
    pIter->iEndofDoclist = pLeaf->nn;

    if( flags & FTS5INDEX_QUERY_DESC ){
      pIter->flags |= FTS5_SEGITER_REVERSE;

Changes to ext/fts5/test/fts5aa.test.

423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
...
598
599
600
601
602
603
604
































605
606
607
608
609
  INSERT INTO n1 VALUES('a b c d');
}

proc funk {} {
  db eval { UPDATE n1_config SET v=50 WHERE k='version' }
  set fd [db incrblob main n1_data block 10]
  fconfigure $fd -encoding binary -translation binary
  puts -nonewline $fd "\x44\x45"
  close $fd
}
db func funk funk

# This test case corrupts the structure record within the first invocation
# of function funk(). Which used to cause the bm25() function to throw an
# exception. But since bm25() can now used the cached structure record,
................................................................................
}
do_execsql_test 23.1 {
  SELECT * FROM t11, t10 WHERE t11.x = t10.x AND t10.rowid IS NULL;
}
do_execsql_test 23.2 {
  SELECT * FROM t11, t10 WHERE t10.rowid IS NULL;
}

































}

expand_all_sql db
finish_test







|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
...
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
  INSERT INTO n1 VALUES('a b c d');
}

proc funk {} {
  db eval { UPDATE n1_config SET v=50 WHERE k='version' }
  set fd [db incrblob main n1_data block 10]
  fconfigure $fd -encoding binary -translation binary
#  puts -nonewline $fd "\x44\x45"
  close $fd
}
db func funk funk

# This test case corrupts the structure record within the first invocation
# of function funk(). Which used to cause the bm25() function to throw an
# exception. But since bm25() can now used the cached structure record,
................................................................................
}
do_execsql_test 23.1 {
  SELECT * FROM t11, t10 WHERE t11.x = t10.x AND t10.rowid IS NULL;
}
do_execsql_test 23.2 {
  SELECT * FROM t11, t10 WHERE t10.rowid IS NULL;
}

#-------------------------------------------------------------------------
do_execsql_test 24.0 {
  CREATE VIRTUAL TABLE t12 USING fts5(x, detail=%DETAIL%);
  INSERT INTO t12 VALUES('aaaa');
}
do_execsql_test 24.1 {
  BEGIN;
    DELETE FROM t12 WHERE rowid=1;
    SELECT * FROM t12('aaaa');
    INSERT INTO t12 VALUES('aaaa');
  END;
}
do_execsql_test 24.2 {
  INSERT INTO t12(t12) VALUES('integrity-check');
}
do_execsql_test 24.3 {
    SELECT * FROM t12('aaaa');
} {aaaa}

#-------------------------------------------------------------------------
do_execsql_test 25.0 {
  CREATE VIRTUAL TABLE t13 USING fts5(x, detail=%DETAIL%);
}
do_execsql_test 25.1 {
  BEGIN;
  INSERT INTO t13 VALUES('AAAA');
SELECT * FROM t13('BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*');

  END;
}


}

expand_all_sql db
finish_test

Changes to src/alter.c.

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

178
179
180
181
182
183
184
...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
...
560
561
562
563
564
565
566

567
568
569
570
571
572
573
    pVTab = sqlite3GetVTable(db, pTab);
    if( pVTab->pVtab->pModule->xRename==0 ){
      pVTab = 0;
    }
  }
#endif

  /* Begin a transaction for database iDb. 
  ** Then modify the schema cookie (since the ALTER TABLE modifies the
  ** schema). Open a statement transaction if the table is a virtual
  ** table.
  */
  v = sqlite3GetVdbe(pParse);
  if( v==0 ){
    goto exit_rename_table;
  }


  /* figure out how many UTF-8 characters are in zName */
  zTabName = pTab->zName;
  nTabName = sqlite3Utf8CharLen(zTabName, -1);

  /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in
  ** the schema to use the new table name.  */
................................................................................
  ** SQLite tables) that are identified by the name of the virtual table.
  */
#ifndef SQLITE_OMIT_VIRTUALTABLE
  if( pVTab ){
    int i = ++pParse->nMem;
    sqlite3VdbeLoadString(v, i, zName);
    sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
    sqlite3MayAbort(pParse);
  }
#endif

  renameReloadSchema(pParse, iDb);
  renameTestSchema(pParse, zDb, iDb==1);

exit_rename_table:
................................................................................
    goto exit_rename_column;
  }

  /* Do the rename operation using a recursive UPDATE statement that
  ** uses the sqlite_rename_column() SQL function to compute the new
  ** CREATE statement text for the sqlite_master table.
  */

  zNew = sqlite3NameFromToken(db, pNew);
  if( !zNew ) goto exit_rename_column;
  assert( pNew->n>0 );
  bQuote = sqlite3Isquote(pNew->z[0]);
  sqlite3NestedParse(pParse, 
      "UPDATE \"%w\".%s SET "
      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "







|
|
|
|
<




>







 







<







 







>







162
163
164
165
166
167
168
169
170
171
172

173
174
175
176
177
178
179
180
181
182
183
184
...
239
240
241
242
243
244
245

246
247
248
249
250
251
252
...
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
    pVTab = sqlite3GetVTable(db, pTab);
    if( pVTab->pVtab->pModule->xRename==0 ){
      pVTab = 0;
    }
  }
#endif

  /* Begin a transaction for database iDb. Then modify the schema cookie
  ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(),
  ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the 
  ** nested SQL may raise an exception.  */

  v = sqlite3GetVdbe(pParse);
  if( v==0 ){
    goto exit_rename_table;
  }
  sqlite3MayAbort(pParse);

  /* figure out how many UTF-8 characters are in zName */
  zTabName = pTab->zName;
  nTabName = sqlite3Utf8CharLen(zTabName, -1);

  /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in
  ** the schema to use the new table name.  */
................................................................................
  ** SQLite tables) that are identified by the name of the virtual table.
  */
#ifndef SQLITE_OMIT_VIRTUALTABLE
  if( pVTab ){
    int i = ++pParse->nMem;
    sqlite3VdbeLoadString(v, i, zName);
    sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);

  }
#endif

  renameReloadSchema(pParse, iDb);
  renameTestSchema(pParse, zDb, iDb==1);

exit_rename_table:
................................................................................
    goto exit_rename_column;
  }

  /* Do the rename operation using a recursive UPDATE statement that
  ** uses the sqlite_rename_column() SQL function to compute the new
  ** CREATE statement text for the sqlite_master table.
  */
  sqlite3MayAbort(pParse);
  zNew = sqlite3NameFromToken(db, pNew);
  if( !zNew ) goto exit_rename_column;
  assert( pNew->n>0 );
  bQuote = sqlite3Isquote(pNew->z[0]);
  sqlite3NestedParse(pParse, 
      "UPDATE \"%w\".%s SET "
      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "

Changes to src/os_unix.c.

7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
  ** array cannot be const.
  */
  static sqlite3_vfs aVfs[] = {
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
    UNIXVFS("unix",          autolockIoFinder ),
#elif OS_VXWORKS
    UNIXVFS("unix",          vxworksIoFinder ),
#elif __Fuchsia__
    /* We are told that Fuchsia only supports dot-file locking */
    UNIXVFS("unix",          dotlockIoFinder ),
#else
    UNIXVFS("unix",          posixIoFinder ),
#endif
    UNIXVFS("unix-none",     nolockIoFinder ),
    UNIXVFS("unix-dotfile",  dotlockIoFinder ),
    UNIXVFS("unix-excl",     posixIoFinder ),
#if OS_VXWORKS







<
<
<







7818
7819
7820
7821
7822
7823
7824



7825
7826
7827
7828
7829
7830
7831
  ** array cannot be const.
  */
  static sqlite3_vfs aVfs[] = {
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
    UNIXVFS("unix",          autolockIoFinder ),
#elif OS_VXWORKS
    UNIXVFS("unix",          vxworksIoFinder ),



#else
    UNIXVFS("unix",          posixIoFinder ),
#endif
    UNIXVFS("unix-none",     nolockIoFinder ),
    UNIXVFS("unix-dotfile",  dotlockIoFinder ),
    UNIXVFS("unix-excl",     posixIoFinder ),
#if OS_VXWORKS

Changes to src/sqlite.h.in.

4041
4042
4043
4044
4045
4046
4047
4048


4049
4050
4051
4052
4053
4054
4055
....
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
** the value of the fourth parameter then the resulting string value will
** contain embedded NULs.  The result of expressions involving strings
** with embedded NULs is undefined.
**
** ^The fifth argument to the BLOB and string binding interfaces
** is a destructor used to dispose of the BLOB or
** string after SQLite has finished with it.  ^The destructor is called
** to dispose of the BLOB or string even if the call to bind API fails.


** ^If the fifth argument is
** the special value [SQLITE_STATIC], then SQLite assumes that the
** information is in static, unmanaged space and does not need to be freed.
** ^If the fifth argument has the value [SQLITE_TRANSIENT], then
** SQLite makes its own private copy of the data immediately, before
** the sqlite3_bind_*() routine returns.
**
................................................................................
** CAPI3REF: Return The Filename For A Database Connection
** METHOD: sqlite3
**
** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename
** associated with database N of connection D.  ^The main database file
** has the name "main".  If there is no attached database N on the database
** connection D, or if database N is a temporary or in-memory database, then
** a NULL pointer is returned.
**
** ^The filename returned by this function is the output of the
** xFullPathname method of the [VFS].  ^In other words, the filename
** will be an absolute pathname, even if the filename used
** to open the database originally was a URI or relative pathname.
*/
const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName);







|
>
>







 







|







4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
....
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
** the value of the fourth parameter then the resulting string value will
** contain embedded NULs.  The result of expressions involving strings
** with embedded NULs is undefined.
**
** ^The fifth argument to the BLOB and string binding interfaces
** is a destructor used to dispose of the BLOB or
** string after SQLite has finished with it.  ^The destructor is called
** to dispose of the BLOB or string even if the call to the bind API fails,
** except the destructor is not called if the third parameter is a NULL
** pointer or the fourth parameter is negative.
** ^If the fifth argument is
** the special value [SQLITE_STATIC], then SQLite assumes that the
** information is in static, unmanaged space and does not need to be freed.
** ^If the fifth argument has the value [SQLITE_TRANSIENT], then
** SQLite makes its own private copy of the data immediately, before
** the sqlite3_bind_*() routine returns.
**
................................................................................
** CAPI3REF: Return The Filename For A Database Connection
** METHOD: sqlite3
**
** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename
** associated with database N of connection D.  ^The main database file
** has the name "main".  If there is no attached database N on the database
** connection D, or if database N is a temporary or in-memory database, then
** this function will return either a NULL pointer or an empty string.
**
** ^The filename returned by this function is the output of the
** xFullPathname method of the [VFS].  ^In other words, the filename
** will be an absolute pathname, even if the filename used
** to open the database originally was a URI or relative pathname.
*/
const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName);

Changes to src/vdbeaux.c.

633
634
635
636
637
638
639

640
641
642
643
644
645
646
  memset(&sIter, 0, sizeof(sIter));
  sIter.v = v;

  while( (pOp = opIterNext(&sIter))!=0 ){
    int opcode = pOp->opcode;
    if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename 
     || opcode==OP_VDestroy

     || ((opcode==OP_Halt || opcode==OP_HaltIfNull) 
      && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort))
    ){
      hasAbort = 1;
      break;
    }
    if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1;







>







633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
  memset(&sIter, 0, sizeof(sIter));
  sIter.v = v;

  while( (pOp = opIterNext(&sIter))!=0 ){
    int opcode = pOp->opcode;
    if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename 
     || opcode==OP_VDestroy
     || (opcode==OP_Function0 && pOp->p4.pFunc->funcFlags&SQLITE_FUNC_INTERNAL)
     || ((opcode==OP_Halt || opcode==OP_HaltIfNull) 
      && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort))
    ){
      hasAbort = 1;
      break;
    }
    if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1;

Changes to src/wherecode.c.

1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
    sqlite3WalkExpr(&w, pWInfo->pWhere);
    sqlite3WalkExprList(&w, pWInfo->pOrderBy);
    sqlite3WalkExprList(&w, pWInfo->pResultSet);
  }
}

/*
** The pTruth expression is always tree because it is the WHERE clause
** a partial index that is driving a query loop.  Look through all of the
** WHERE clause terms on the query, and if any of those terms must be
** true because pTruth is true, then mark those WHERE clause terms as
** coded.
*/
static void whereApplyPartialIndexConstraints(
  Expr *pTruth,







|







1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
    sqlite3WalkExpr(&w, pWInfo->pWhere);
    sqlite3WalkExprList(&w, pWInfo->pOrderBy);
    sqlite3WalkExprList(&w, pWInfo->pResultSet);
  }
}

/*
** The pTruth expression is always true because it is the WHERE clause
** a partial index that is driving a query loop.  Look through all of the
** WHERE clause terms on the query, and if any of those terms must be
** true because pTruth is true, then mark those WHERE clause terms as
** coded.
*/
static void whereApplyPartialIndexConstraints(
  Expr *pTruth,

Changes to test/altertab3.test.

77
78
79
80
81
82
83








84























85
86
87
88
  ALTER TABLE t1 RENAME b TO bbb;
}

do_execsql_test 3.2 {
  SELECT sql FROM sqlite_master WHERE name = 'v1'
} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}}


































finish_test









>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  ALTER TABLE t1 RENAME b TO bbb;
}

do_execsql_test 3.2 {
  SELECT sql FROM sqlite_master WHERE name = 'v1'
} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}}

#-------------------------------------------------------------------------
reset_db
do_execsql_test 4.0 {
  CREATE TABLE t1(a, b);
  CREATE TABLE t3(e, f);
  CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
    INSERT INTO t2 VALUES(new.a, new.b);
  END;
}

do_catchsql_test 4.1.2 {
  BEGIN;
    ALTER TABLE t3 RENAME TO t4;
} {1 {error in trigger tr1: no such table: main.t2}}
do_execsql_test 4.1.2 {
  COMMIT;
}
do_execsql_test 4.1.3 {
  SELECT * FROM sqlite_master WHERE type='table' AND name!='t1';
} {table t3 t3 3 {CREATE TABLE t3(e, f)}}


do_catchsql_test 4.2.1 {
  BEGIN;
    ALTER TABLE t3 RENAME e TO eee;
} {1 {error in trigger tr1: no such table: main.t2}}
do_execsql_test 4.2.2 {
  COMMIT;
}
do_execsql_test 4.2.3 {
  SELECT * FROM sqlite_master WHERE type='table' AND name!='t1';
} {table t3 t3 3 {CREATE TABLE t3(e, f)}}

finish_test


Changes to test/sessionfuzz.c.

826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
static int conflictCall(
  void *NotUsed,
  int eConflict,
  sqlite3_changeset_iter *p
){
  (void)NotUsed;
  (void)p;
  printf("Conflict %d\n", eConflict);
  return SQLITE_CHANGESET_OMIT;
}

/*
** Reset the database file
*/
static void db_reset(sqlite3 *db){







<







826
827
828
829
830
831
832

833
834
835
836
837
838
839
static int conflictCall(
  void *NotUsed,
  int eConflict,
  sqlite3_changeset_iter *p
){
  (void)NotUsed;
  (void)p;

  return SQLITE_CHANGESET_OMIT;
}

/*
** Reset the database file
*/
static void db_reset(sqlite3 *db){

Changes to test/window8.tcl.

92
93
94
95
96
97
98









99
100
101
102
103
104
105

  execsql_test 1.$tn.6 "
    SELECT a, b, sum(c) OVER (ORDER BY a $f2) FROM t3 ORDER BY 1, 2, 3;
  "
  execsql_test 1.$tn.7 "
    SELECT a, b, sum(c) OVER (ORDER BY a,b $f2) FROM t3 ORDER BY 1, 2, 3;
  "









}


foreach {tn ex} {
  1  { EXCLUDE NO OTHERS }
  2  { EXCLUDE CURRENT ROW }
  3  { EXCLUDE GROUP }







>
>
>
>
>
>
>
>
>







92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

  execsql_test 1.$tn.6 "
    SELECT a, b, sum(c) OVER (ORDER BY a $f2) FROM t3 ORDER BY 1, 2, 3;
  "
  execsql_test 1.$tn.7 "
    SELECT a, b, sum(c) OVER (ORDER BY a,b $f2) FROM t3 ORDER BY 1, 2, 3;
  "

  execsql_test 1.$tn.8 "
    SELECT a, b, 
      sum(c) OVER (ORDER BY a $f2),
      sum(c) OVER (ORDER BY a $frame),
      sum(c) OVER (ORDER BY a,b $f2),
      sum(c) OVER (ORDER BY a,b $frame)
    FROM t3 ORDER BY 1, 2, 3;
  "
}


foreach {tn ex} {
  1  { EXCLUDE NO OTHERS }
  2  { EXCLUDE CURRENT ROW }
  3  { EXCLUDE GROUP }

Changes to test/window8.test.

174
175
176
177
178
179
180















































181
182
183
184
185
186
187
...
299
300
301
302
303
304
305
















































306
307
308
309
310
311
312
...
424
425
426
427
428
429
430
















































431
432
433
434
435
436
437
...
549
550
551
552
553
554
555
















































556
557
558
559
560
561
562
...
654
655
656
657
658
659
660



































661
662
663
664
665
666
667
...
773
774
775
776
777
778
779















































780
781
782
783
784
785
786
...
892
893
894
895
896
897
898















































899
900
901
902
903
904
905
....
1014
1015
1016
1017
1018
1019
1020
















































1021
1022
1023
1024
1025
1026
1027
....
1135
1136
1137
1138
1139
1140
1141
















































1142
1143
1144
1145
1146
1147
1148
....
1257
1258
1259
1260
1261
1262
1263
















































1264
1265
1266
1267
1268
1269
1270
....
1382
1383
1384
1385
1386
1387
1388
















































1389
1390
1391
1392
1393
1394
1395
....
1499
1500
1501
1502
1503
1504
1505
















































1506
1507
1508
1509
1510
1511
1512
....
1617
1618
1619
1620
1621
1622
1623
















































1624
1625
1626
1627
1628
1629
1630
....
1742
1743
1744
1745
1746
1747
1748
















































1749
1750
1751
1752
1753
1754
1755
....
1867
1868
1869
1870
1871
1872
1873
















































1874
1875
1876
1877
1878
1879
1880
....
1984
1985
1986
1987
1988
1989
1990
















































1991
1992
1993
1994
1995
1996
1997
....
2089
2090
2091
2092
2093
2094
2095



































2096
2097
2098
2099
2100
2101
2102
....
2214
2215
2216
2217
2218
2219
2220















































2221
2222
2223
2224
2225
2226
2227
....
2339
2340
2341
2342
2343
2344
2345















































2346
2347
2348
2349
2350
2351
2352
  GG bb 28983   GG bb 28983   GG bb 28983   HH aa 31854   HH aa 31854
  HH aa 31854   HH bb 34103   HH bb 34103   HH bb 34103   HH bb 34103
  HH bb 34103   HH bb 34103   II aa 37297   II aa 37297   II bb 38347
  II bb 38347   II bb 38347   II bb 38347   II bb 38347   JJ aa 40937
  JJ aa 40937   JJ aa 40937   JJ aa 40937   JJ bb 42951   JJ bb 42951
  JJ bb 42951   JJ bb 42951}
















































do_execsql_test 1.2.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  GG bb 30916   GG bb 30925   GG bb 31010   GG bb 31694   HH aa 33124
  HH aa 33313   HH aa 33623   HH bb 36334   HH bb 36567   HH bb 36614
  HH bb 36942   HH bb 36967   HH bb 37164   II aa 37695   II aa 37949
  II bb 40132   II bb 40266   II bb 40494   II bb 40516   II bb 40687
  JJ aa 42052   JJ aa 42183   JJ aa 42717   JJ aa 42838   JJ bb 43898
  JJ bb 44383   JJ bb 44401   JJ bb 44480}

















































do_execsql_test 1.3.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 12025   AA aa 12025   AA aa 12025   AA aa 12025   AA bb 12025
  AA bb 12025   AA bb 12025   AA bb 12025   BB aa 15147   BB aa 15147
  BB aa 15147   BB aa 15147   BB aa 15147   BB aa 15147   BB bb 15147
  BB bb 15147   BB bb 15147   BB bb 15147   BB bb 15147   BB bb 15147
  CC aa 19179   CC aa 19179   CC aa 19179   CC aa 19179   CC bb 19179
................................................................................
  GG aa 31706   GG bb 33165   GG bb 33174   GG bb 33259   GG bb 33943
  HH aa 36318   HH aa 36507   HH aa 36817   HH bb 37384   HH bb 37617
  HH bb 37664   HH bb 37992   HH bb 38017   HH bb 38214   II aa 40285
  II aa 40539   II bb 42146   II bb 42280   II bb 42508   II bb 42530
  II bb 42701   JJ aa 43838   JJ aa 43969   JJ aa 44503   JJ aa 44624
  JJ bb 43898   JJ bb 44383   JJ bb 44401   JJ bb 44480}

















































do_execsql_test 1.4.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 44737   BB aa 44737
  BB aa 44737   BB aa 44737   BB aa 44737   BB aa 44737   BB bb 44737
  BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737
  CC aa 44737   CC aa 44737   CC aa 44737   CC aa 44737   CC bb 44737
................................................................................
  GG aa 44402   GG aa 44589   GG bb 43799   GG bb 43808   GG bb 43893
  GG bb 44577   HH aa 43758   HH aa 43947   HH aa 44257   HH bb 43774
  HH bb 44007   HH bb 44054   HH bb 44382   HH bb 44407   HH bb 44604
  II aa 44085   II aa 44339   II bb 43932   II bb 44066   II bb 44294
  II bb 44316   II bb 44487   JJ aa 43838   JJ aa 43969   JJ aa 44503
  JJ aa 44624   JJ bb 43898   JJ bb 44383   JJ bb 44401   JJ bb 44480}

















































do_execsql_test 1.5.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}
  BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   CC aa {}
  CC aa {}   CC aa {}   CC aa {}   CC bb {}   CC bb {}   DD aa {}   DD aa {}
  DD aa {}   DD bb {}   DD bb {}   DD bb {}   DD bb {}   EE aa {}   EE aa {}
................................................................................
  FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   GG aa {}
  GG aa {}   GG aa {}   GG aa {}   GG bb {}   GG bb {}   GG bb {}   GG bb {}
  HH aa {}   HH aa {}   HH aa {}   HH bb {}   HH bb {}   HH bb {}   HH bb {}
  HH bb {}   HH bb {}   II aa {}   II aa {}   II bb {}   II bb {}   II bb {}
  II bb {}   II bb {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ bb {}
  JJ bb {}   JJ bb {}   JJ bb {}}




































do_execsql_test 1.6.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685
  BB aa 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685
  BB bb 4685   CC aa 12025   CC aa 12025   CC aa 12025   CC aa 12025
  CC bb 12025   CC bb 12025   DD aa 10462   DD aa 10462   DD aa 10462
................................................................................
  GG aa 5668   GG aa 5668   GG aa 5668   GG aa 5668   GG bb 5102   GG bb 5102
  GG bb 5102   GG bb 5102   HH aa 4468   HH aa 4468   HH aa 4468   HH bb 5120
  HH bb 5120   HH bb 5120   HH bb 5120   HH bb 5120   HH bb 5120   II aa 5443
  II aa 5443   II bb 4244   II bb 4244   II bb 4244   II bb 4244   II bb 4244
  JJ aa 3640   JJ aa 3640   JJ aa 3640   JJ aa 3640   JJ bb 4604   JJ bb 4604
  JJ bb 4604   JJ bb 4604}
















































do_execsql_test 1.7.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685
  BB aa 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685
  BB bb 4685   CC aa 12025   CC aa 12025   CC aa 12025   CC aa 12025
  CC bb 12025   CC bb 12025   DD aa 15147   DD aa 15147   DD aa 15147
................................................................................
  GG aa 7317   GG aa 7317   GG aa 7317   GG aa 7317   GG bb 7265   GG bb 7265
  GG bb 7265   GG bb 7265   HH aa 7973   HH aa 7973   HH aa 7973   HH bb 6717
  HH bb 6717   HH bb 6717   HH bb 6717   HH bb 6717   HH bb 6717   II aa 8314
  II aa 8314   II bb 6493   II bb 6493   II bb 6493   II bb 6493   II bb 6493
  JJ aa 6834   JJ aa 6834   JJ aa 6834   JJ aa 6834   JJ bb 5654   JJ bb 5654
  JJ bb 5654   JJ bb 5654}
















































do_execsql_test 1.8.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  FF bb 7633   FF bb 7912   FF bb 8105   GG aa 8280   GG aa 8434   GG aa 8579
  GG aa 8766   GG bb 9198   GG bb 9207   GG bb 9292   GG bb 9976   HH aa 9243
  HH aa 9432   HH aa 9742   HH bb 8948   HH bb 9181   HH bb 9228   HH bb 9556
  HH bb 9581   HH bb 9778   II aa 8712   II aa 8966   II bb 8278   II bb 8412
  II bb 8640   II bb 8662   II bb 8833   JJ aa 7949   JJ aa 8080   JJ aa 8614
  JJ aa 8735   JJ bb 6601   JJ bb 7086   JJ bb 7104   JJ bb 7183}

















































do_execsql_test 1.9.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  GG aa 6631   GG aa 6785   GG aa 6930   GG aa 7117   GG bb 7035   GG bb 7044
  GG bb 7129   GG bb 7813   HH aa 5738   HH aa 5927   HH aa 6237   HH bb 7351
  HH bb 7584   HH bb 7631   HH bb 7959   HH bb 7984   HH bb 8181   II aa 5841
  II aa 6095   II bb 6029   II bb 6163   II bb 6391   II bb 6413   II bb 6584
  JJ aa 4755   JJ aa 4886   JJ aa 5420   JJ aa 5541   JJ bb 5551   JJ bb 6036
  JJ bb 6054   JJ bb 6133}

















































do_execsql_test 1.10.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  FF bb 7633   FF bb 7912   FF bb 8105   GG aa 8280   GG aa 8434   GG aa 8579
  GG aa 8766   GG bb 9198   GG bb 9207   GG bb 9292   GG bb 9976   HH aa 9243
  HH aa 9432   HH aa 9742   HH bb 8948   HH bb 9181   HH bb 9228   HH bb 9556
  HH bb 9581   HH bb 9778   II aa 8712   II aa 8966   II bb 8278   II bb 8412
  II bb 8640   II bb 8662   II bb 8833   JJ aa 7949   JJ aa 8080   JJ aa 8614
  JJ aa 8735   JJ bb 6601   JJ bb 7086   JJ bb 7104   JJ bb 7183}

















































do_execsql_test 1.11.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 44737   BB aa 44737
  BB aa 44737   BB aa 44737   BB aa 44737   BB aa 44737   BB bb 44737
  BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737
  CC aa 44737   CC aa 44737   CC aa 44737   CC aa 44737   CC bb 44737
................................................................................
  GG aa 22684   GG aa 22871   GG bb 19918   GG bb 19927   GG bb 20012
  GG bb 20696   HH aa 16372   HH aa 16561   HH aa 16871   HH bb 14791
  HH bb 15024   HH bb 15071   HH bb 15399   HH bb 15424   HH bb 15621
  II aa 12231   II aa 12485   II bb 9829   II bb 9963   II bb 10191
  II bb 10213   II bb 10384   JJ aa 6541   JJ aa 6672   JJ aa 7206
  JJ aa 7327   JJ bb 5551   JJ bb 6036   JJ bb 6054   JJ bb 6133}

















































do_execsql_test 1.12.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 7340   BB aa 7340   BB aa 7340   BB aa 7340
  BB aa 7340   BB aa 7340   BB bb 7340   BB bb 7340   BB bb 7340   BB bb 7340
  BB bb 7340   BB bb 7340   CC aa 3122   CC aa 3122   CC aa 3122   CC aa 3122
  CC bb 3122   CC bb 3122   DD aa 4032   DD aa 4032   DD aa 4032   DD bb 4032
................................................................................
  GG aa 963   GG aa 1117   GG aa 1262   GG aa 1449   GG bb 1933   GG bb 1942
  GG bb 2027   GG bb 2711   HH aa 1270   HH aa 1459   HH aa 1769   HH bb 2231
  HH bb 2464   HH bb 2511   HH bb 2839   HH bb 2864   HH bb 3061   II aa 398
  II aa 652   II bb 1785   II bb 1919   II bb 2147   II bb 2169   II bb 2340
  JJ aa 1115   JJ aa 1246   JJ aa 1780   JJ aa 1901   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

















































do_execsql_test 1.13.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 12025   AA aa 12025   AA aa 12025   AA aa 12025   AA bb 12025
  AA bb 12025   AA bb 12025   AA bb 12025   BB aa 10462   BB aa 10462
  BB aa 10462   BB aa 10462   BB aa 10462   BB aa 10462   BB bb 10462
  BB bb 10462   BB bb 10462   BB bb 10462   BB bb 10462   BB bb 10462
  CC aa 7154   CC aa 7154   CC aa 7154   CC aa 7154   CC bb 7154   CC bb 7154
................................................................................
  GG aa 3834   GG aa 3988   GG aa 4133   GG aa 4320   GG bb 4182   GG bb 4191
  GG bb 4276   GG bb 4960   HH aa 4464   HH aa 4653   HH aa 4963   HH bb 3281
  HH bb 3514   HH bb 3561   HH bb 3889   HH bb 3914   HH bb 4111   II aa 2988
  II aa 3242   II bb 3799   II bb 3933   II bb 4161   II bb 4183   II bb 4354
  JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

















































do_execsql_test 1.14.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 40052   BB aa 40052
  BB aa 40052   BB aa 40052   BB aa 40052   BB aa 40052   BB bb 40052
  BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052
  CC aa 32712   CC aa 32712   CC aa 32712   CC aa 32712   CC bb 32712
................................................................................
  GG aa 17016   GG aa 17203   GG bb 14816   GG bb 14825   GG bb 14910
  GG bb 15594   HH aa 11904   HH aa 12093   HH aa 12403   HH bb 9671
  HH bb 9904   HH bb 9951   HH bb 10279   HH bb 10304   HH bb 10501
  II aa 6788   II aa 7042   II bb 5585   II bb 5719   II bb 5947   II bb 5969
  II bb 6140   JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947
  JJ bb 1432   JJ bb 1450   JJ bb 1529}

















































do_execsql_test 1.15.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 40052   BB aa 40052
  BB aa 40052   BB aa 40052   BB aa 40052   BB aa 40052   BB bb 40052
  BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052
  CC aa 32712   CC aa 32712   CC aa 32712   CC aa 32712   CC bb 32712
................................................................................
  GG aa 17016   GG aa 17203   GG bb 14816   GG bb 14825   GG bb 14910
  GG bb 15594   HH aa 11904   HH aa 12093   HH aa 12403   HH bb 9671
  HH bb 9904   HH bb 9951   HH bb 10279   HH bb 10304   HH bb 10501
  II aa 6788   II aa 7042   II bb 5585   II bb 5719   II bb 5947   II bb 5969
  II bb 6140   JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947
  JJ bb 1432   JJ bb 1450   JJ bb 1529}

















































do_execsql_test 1.16.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 7340   BB aa 7340   BB aa 7340   BB aa 7340
  BB aa 7340   BB aa 7340   BB bb 7340   BB bb 7340   BB bb 7340   BB bb 7340
  BB bb 7340   BB bb 7340   CC aa 3122   CC aa 3122   CC aa 3122   CC aa 3122
  CC bb 3122   CC bb 3122   DD aa 4032   DD aa 4032   DD aa 4032   DD bb 4032
................................................................................
  GG aa 963   GG aa 1117   GG aa 1262   GG aa 1449   GG bb 1933   GG bb 1942
  GG bb 2027   GG bb 2711   HH aa 1270   HH aa 1459   HH aa 1769   HH bb 2231
  HH bb 2464   HH bb 2511   HH bb 2839   HH bb 2864   HH bb 3061   II aa 398
  II aa 652   II bb 1785   II bb 1919   II bb 2147   II bb 2169   II bb 2340
  JJ aa 1115   JJ aa 1246   JJ aa 1780   JJ aa 1901   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

















































do_execsql_test 1.17.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}
  BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   CC aa {}
  CC aa {}   CC aa {}   CC aa {}   CC bb {}   CC bb {}   DD aa {}   DD aa {}
  DD aa {}   DD bb {}   DD bb {}   DD bb {}   DD bb {}   EE aa {}   EE aa {}
................................................................................
  FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   GG aa {}
  GG aa {}   GG aa {}   GG aa {}   GG bb {}   GG bb {}   GG bb {}   GG bb {}
  HH aa {}   HH aa {}   HH aa {}   HH bb {}   HH bb {}   HH bb {}   HH bb {}
  HH bb {}   HH bb {}   II aa {}   II aa {}   II bb {}   II bb {}   II bb {}
  II bb {}   II bb {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ bb {}
  JJ bb {}   JJ bb {}   JJ bb {}}




































do_execsql_test 1.18.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 22701   AA aa 22701   AA aa 22701   AA aa 22701   AA bb 22701
  AA bb 22701   AA bb 22701   AA bb 22701   BB aa 19829   BB aa 19829
  BB aa 19829   BB aa 19829   BB aa 19829   BB aa 19829   BB bb 19829
  BB bb 19829   BB bb 19829   BB bb 19829   BB bb 19829   BB bb 19829
  CC aa 22150   CC aa 22150   CC aa 22150   CC aa 22150   CC bb 22150
................................................................................
  GG aa 11954   GG bb 11097   GG bb 11097   GG bb 11097   GG bb 11097
  HH aa 10634   HH aa 10634   HH aa 10634   HH bb 7440   HH bb 7440
  HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   II aa 6390   II aa 6390
  II bb 3800   II bb 3800   II bb 3800   II bb 3800   II bb 3800   JJ aa 1786
  JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ bb {}   JJ bb {}   JJ bb {}
  JJ bb {}}
















































do_execsql_test 1.19.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 40052   AA aa 40052   AA aa 40052   AA aa 40052   AA bb 40052
  AA bb 40052   AA bb 40052   AA bb 40052   BB aa 32712   BB aa 32712
  BB aa 32712   BB aa 32712   BB aa 32712   BB aa 32712   BB bb 32712
  BB bb 32712   BB bb 32712   BB bb 32712   BB bb 32712   BB bb 32712
  CC aa 29590   CC aa 29590   CC aa 29590   CC aa 29590   CC bb 29590
................................................................................
  GG aa 15754   GG aa 15754   GG bb 12883   GG bb 12883   GG bb 12883
  GG bb 12883   HH aa 10634   HH aa 10634   HH aa 10634   HH bb 7440
  HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   II aa 6390
  II aa 6390   II bb 3800   II bb 3800   II bb 3800   II bb 3800   II bb 3800
  JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ bb {}   JJ bb {}
  JJ bb {}   JJ bb {}}
















































do_execsql_test 2.1.1 {
  SELECT row_number() OVER win 
    FROM t3
    WINDOW win AS (
      ORDER BY c, b, a
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE NO OTHERS 
    )







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
...
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
...
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
...
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
...
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
...
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
....
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
....
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
....
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
....
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
....
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
....
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
....
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
....
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
....
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
....
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
....
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
....
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
....
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
  GG bb 28983   GG bb 28983   GG bb 28983   HH aa 31854   HH aa 31854
  HH aa 31854   HH bb 34103   HH bb 34103   HH bb 34103   HH bb 34103
  HH bb 34103   HH bb 34103   II aa 37297   II aa 37297   II bb 38347
  II bb 38347   II bb 38347   II bb 38347   II bb 38347   JJ aa 40937
  JJ aa 40937   JJ aa 40937   JJ aa 40937   JJ bb 42951   JJ bb 42951
  JJ bb 42951   JJ bb 42951}

do_execsql_test 1.1.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa {} {} {} {}   AA aa {} {} {} {}   AA aa {} {} {} {}
  AA aa {} {} {} {}   AA bb {} {} 2307 2307   AA bb {} {} 2307 2307
  AA bb {} {} 2307 2307   AA bb {} {} 2307 2307   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   CC aa 12025 12025 12025 12025
  CC aa 12025 12025 12025 12025   CC aa 12025 12025 12025 12025
  CC aa 12025 12025 12025 12025   CC bb 12025 12025 13979 13979
  CC bb 12025 12025 13979 13979   DD aa 15147 15147 15147 15147
  DD aa 15147 15147 15147 15147   DD aa 15147 15147 15147 15147
  DD bb 15147 15147 16472 16472   DD bb 15147 15147 16472 16472
  DD bb 15147 15147 16472 16472   DD bb 15147 15147 16472 16472
  EE aa 19179 19179 19179 19179   EE aa 19179 19179 19179 19179
  EE bb 19179 19179 20069 20069   EE bb 19179 19179 20069 20069
  EE bb 19179 19179 20069 20069   FF aa 21718 21718 21718 21718
  FF aa 21718 21718 21718 21718   FF aa 21718 21718 21718 21718
  FF aa 21718 21718 21718 21718   FF bb 21718 21718 23881 23881
  FF bb 21718 21718 23881 23881   FF bb 21718 21718 23881 23881
  FF bb 21718 21718 23881 23881   FF bb 21718 21718 23881 23881
  FF bb 21718 21718 23881 23881   GG aa 27386 27386 27386 27386
  GG aa 27386 27386 27386 27386   GG aa 27386 27386 27386 27386
  GG aa 27386 27386 27386 27386   GG bb 27386 27386 28983 28983
  GG bb 27386 27386 28983 28983   GG bb 27386 27386 28983 28983
  GG bb 27386 27386 28983 28983   HH aa 31854 31854 31854 31854
  HH aa 31854 31854 31854 31854   HH aa 31854 31854 31854 31854
  HH bb 31854 31854 34103 34103   HH bb 31854 31854 34103 34103
  HH bb 31854 31854 34103 34103   HH bb 31854 31854 34103 34103
  HH bb 31854 31854 34103 34103   HH bb 31854 31854 34103 34103
  II aa 37297 37297 37297 37297   II aa 37297 37297 37297 37297
  II bb 37297 37297 38347 38347   II bb 37297 37297 38347 38347
  II bb 37297 37297 38347 38347   II bb 37297 37297 38347 38347
  II bb 37297 37297 38347 38347   JJ aa 40937 40937 40937 40937
  JJ aa 40937 40937 40937 40937   JJ aa 40937 40937 40937 40937
  JJ aa 40937 40937 40937 40937   JJ bb 40937 40937 42951 42951
  JJ bb 40937 40937 42951 42951   JJ bb 40937 40937 42951 42951
  JJ bb 40937 40937 42951 42951}

do_execsql_test 1.2.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  GG bb 30916   GG bb 30925   GG bb 31010   GG bb 31694   HH aa 33124
  HH aa 33313   HH aa 33623   HH bb 36334   HH bb 36567   HH bb 36614
  HH bb 36942   HH bb 36967   HH bb 37164   II aa 37695   II aa 37949
  II bb 40132   II bb 40266   II bb 40494   II bb 40516   II bb 40687
  JJ aa 42052   JJ aa 42183   JJ aa 42717   JJ aa 42838   JJ bb 43898
  JJ bb 44383   JJ bb 44401   JJ bb 44480}

do_execsql_test 1.2.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 3815 4685   AA bb 4058 4685 4058 4685
  AA bb 4113 4685 4113 4685   AA bb 4376 4685 4376 4685
  BB aa 11263 12025 6796 7558   BB aa 11365 12025 6898 7558
  BB aa 11613 12025 7146 7558   BB aa 11626 12025 7159 7558
  BB aa 11632 12025 7165 7558   BB aa 11778 12025 7311 7558
  BB bb 11185 12025 11185 12025   BB bb 11233 12025 11233 12025
  BB bb 11239 12025 11239 12025   BB bb 11314 12025 11314 12025
  BB bb 11320 12025 11320 12025   BB bb 11392 12025 11392 12025
  CC aa 14388 15147 13220 13979   CC aa 14540 15147 13372 13979
  CC aa 14717 15147 13549 13979   CC aa 14989 15147 13821 13979
  CC bb 14325 15147 14325 15147   CC bb 14801 15147 14801 15147
  DD aa 18334 19179 15627 16472   DD aa 18923 19179 16216 16472
  DD aa 18955 19179 16248 16472   DD bb 18220 19179 18220 19179
  DD bb 18385 19179 18385 19179   DD bb 18463 19179 18463 19179
  DD bb 18941 19179 18941 19179   EE aa 20941 21718 19292 20069
  EE aa 21605 21718 19956 20069   EE bb 20950 21718 20950 21718
  EE bb 21089 21718 21089 21718   EE bb 21466 21718 21466 21718
  FF aa 26716 27386 23211 23881   FF aa 26719 27386 23214 23881
  FF aa 26768 27386 23263 23881   FF aa 27178 27386 23673 23881
  FF bb 26448 27386 26448 27386   FF bb 26516 27386 26516 27386
  FF bb 26660 27386 26660 27386   FF bb 26812 27386 26812 27386
  FF bb 27091 27386 27091 27386   FF bb 27284 27386 27284 27386
  GG aa 31220 31854 28349 28983   GG aa 31374 31854 28503 28983
  GG aa 31519 31854 28648 28983   GG aa 31706 31854 28835 28983
  GG bb 30916 31854 30916 31854   GG bb 30925 31854 30925 31854
  GG bb 31010 31854 31010 31854   GG bb 31694 31854 31694 31854
  HH aa 36318 37297 33124 34103   HH aa 36507 37297 33313 34103
  HH aa 36817 37297 33623 34103   HH bb 36334 37297 36334 37297
  HH bb 36567 37297 36567 37297   HH bb 36614 37297 36614 37297
  HH bb 36942 37297 36942 37297   HH bb 36967 37297 36967 37297
  HH bb 37164 37297 37164 37297   II aa 40285 40937 37695 38347
  II aa 40539 40937 37949 38347   II bb 40132 40937 40132 40937
  II bb 40266 40937 40266 40937   II bb 40494 40937 40494 40937
  II bb 40516 40937 40516 40937   II bb 40687 40937 40687 40937
  JJ aa 43838 44737 42052 42951   JJ aa 43969 44737 42183 42951
  JJ aa 44503 44737 42717 42951   JJ aa 44624 44737 42838 42951
  JJ bb 43898 44737 43898 44737   JJ bb 44383 44737 44383 44737
  JJ bb 44401 44737 44401 44737   JJ bb 44480 44737 44480 44737}

do_execsql_test 1.3.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 12025   AA aa 12025   AA aa 12025   AA aa 12025   AA bb 12025
  AA bb 12025   AA bb 12025   AA bb 12025   BB aa 15147   BB aa 15147
  BB aa 15147   BB aa 15147   BB aa 15147   BB aa 15147   BB bb 15147
  BB bb 15147   BB bb 15147   BB bb 15147   BB bb 15147   BB bb 15147
  CC aa 19179   CC aa 19179   CC aa 19179   CC aa 19179   CC bb 19179
................................................................................
  GG aa 31706   GG bb 33165   GG bb 33174   GG bb 33259   GG bb 33943
  HH aa 36318   HH aa 36507   HH aa 36817   HH bb 37384   HH bb 37617
  HH bb 37664   HH bb 37992   HH bb 38017   HH bb 38214   II aa 40285
  II aa 40539   II bb 42146   II bb 42280   II bb 42508   II bb 42530
  II bb 42701   JJ aa 43838   JJ aa 43969   JJ aa 44503   JJ aa 44624
  JJ bb 43898   JJ bb 44383   JJ bb 44401   JJ bb 44480}

do_execsql_test 1.3.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 11091 12025 3751 4685   AA aa 11114 12025 3774 4685
  AA aa 11786 12025 4446 4685   AA aa 11802 12025 4462 4685
  AA bb 11155 12025 6688 7558   AA bb 11398 12025 6931 7558
  AA bb 11453 12025 6986 7558   AA bb 11716 12025 7249 7558
  BB aa 14385 15147 11263 12025   BB aa 14487 15147 11365 12025
  BB aa 14735 15147 11613 12025   BB aa 14748 15147 11626 12025
  BB aa 14754 15147 11632 12025   BB aa 14900 15147 11778 12025
  BB bb 14307 15147 13139 13979   BB bb 14355 15147 13187 13979
  BB bb 14361 15147 13193 13979   BB bb 14436 15147 13268 13979
  BB bb 14442 15147 13274 13979   BB bb 14514 15147 13346 13979
  CC aa 18420 19179 14388 15147   CC aa 18572 19179 14540 15147
  CC aa 18749 19179 14717 15147   CC aa 19021 19179 14989 15147
  CC bb 18357 19179 15650 16472   CC bb 18833 19179 16126 16472
  DD aa 20873 21718 18334 19179   DD aa 21462 21718 18923 19179
  DD aa 21494 21718 18955 19179   DD bb 20759 21718 19110 20069
  DD bb 20924 21718 19275 20069   DD bb 21002 21718 19353 20069
  DD bb 21480 21718 19831 20069   EE aa 26609 27386 20941 21718
  EE aa 27273 27386 21605 21718   EE bb 26618 27386 23113 23881
  EE bb 26757 27386 23252 23881   EE bb 27134 27386 23629 23881
  FF aa 31184 31854 26716 27386   FF aa 31187 31854 26719 27386
  FF aa 31236 31854 26768 27386   FF aa 31646 31854 27178 27386
  FF bb 30916 31854 28045 28983   FF bb 30984 31854 28113 28983
  FF bb 31128 31854 28257 28983   FF bb 31280 31854 28409 28983
  FF bb 31559 31854 28688 28983   FF bb 31752 31854 28881 28983
  GG aa 36663 37297 31220 31854   GG aa 36817 37297 31374 31854
  GG aa 36962 37297 31519 31854   GG aa 37149 37297 31706 31854
  GG bb 36359 37297 33165 34103   GG bb 36368 37297 33174 34103
  GG bb 36453 37297 33259 34103   GG bb 37137 37297 33943 34103
  HH aa 39958 40937 36318 37297   HH aa 40147 40937 36507 37297
  HH aa 40457 40937 36817 37297   HH bb 39974 40937 37384 38347
  HH bb 40207 40937 37617 38347   HH bb 40254 40937 37664 38347
  HH bb 40582 40937 37992 38347   HH bb 40607 40937 38017 38347
  HH bb 40804 40937 38214 38347   II aa 44085 44737 40285 40937
  II aa 44339 44737 40539 40937   II bb 43932 44737 42146 42951
  II bb 44066 44737 42280 42951   II bb 44294 44737 42508 42951
  II bb 44316 44737 42530 42951   II bb 44487 44737 42701 42951
  JJ aa 43838 44737 43838 44737   JJ aa 43969 44737 43969 44737
  JJ aa 44503 44737 44503 44737   JJ aa 44624 44737 44624 44737
  JJ bb 43898 44737 43898 44737   JJ bb 44383 44737 44383 44737
  JJ bb 44401 44737 44401 44737   JJ bb 44480 44737 44480 44737}

do_execsql_test 1.4.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 44737   BB aa 44737
  BB aa 44737   BB aa 44737   BB aa 44737   BB aa 44737   BB bb 44737
  BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737
  CC aa 44737   CC aa 44737   CC aa 44737   CC aa 44737   CC bb 44737
................................................................................
  GG aa 44402   GG aa 44589   GG bb 43799   GG bb 43808   GG bb 43893
  GG bb 44577   HH aa 43758   HH aa 43947   HH aa 44257   HH bb 43774
  HH bb 44007   HH bb 44054   HH bb 44382   HH bb 44407   HH bb 44604
  II aa 44085   II aa 44339   II bb 43932   II bb 44066   II bb 44294
  II bb 44316   II bb 44487   JJ aa 43838   JJ aa 43969   JJ aa 44503
  JJ aa 44624   JJ bb 43898   JJ bb 44383   JJ bb 44401   JJ bb 44480}

do_execsql_test 1.4.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 43803 44737 43803 44737   AA aa 43826 44737 43826 44737
  AA aa 44498 44737 44498 44737   AA aa 44514 44737 44514 44737
  AA bb 43867 44737 43867 44737   AA bb 44110 44737 44110 44737
  AA bb 44165 44737 44165 44737   AA bb 44428 44737 44428 44737
  BB aa 43975 44737 43975 44737   BB aa 44077 44737 44077 44737
  BB aa 44325 44737 44325 44737   BB aa 44338 44737 44338 44737
  BB aa 44344 44737 44344 44737   BB aa 44490 44737 44490 44737
  BB bb 43897 44737 43897 44737   BB bb 43945 44737 43945 44737
  BB bb 43951 44737 43951 44737   BB bb 44026 44737 44026 44737
  BB bb 44032 44737 44032 44737   BB bb 44104 44737 44104 44737
  CC aa 43978 44737 43978 44737   CC aa 44130 44737 44130 44737
  CC aa 44307 44737 44307 44737   CC aa 44579 44737 44579 44737
  CC bb 43915 44737 43915 44737   CC bb 44391 44737 44391 44737
  DD aa 43892 44737 43892 44737   DD aa 44481 44737 44481 44737
  DD aa 44513 44737 44513 44737   DD bb 43778 44737 43778 44737
  DD bb 43943 44737 43943 44737   DD bb 44021 44737 44021 44737
  DD bb 44499 44737 44499 44737   EE aa 43960 44737 43960 44737
  EE aa 44624 44737 44624 44737   EE bb 43969 44737 43969 44737
  EE bb 44108 44737 44108 44737   EE bb 44485 44737 44485 44737
  FF aa 44067 44737 44067 44737   FF aa 44070 44737 44070 44737
  FF aa 44119 44737 44119 44737   FF aa 44529 44737 44529 44737
  FF bb 43799 44737 43799 44737   FF bb 43867 44737 43867 44737
  FF bb 44011 44737 44011 44737   FF bb 44163 44737 44163 44737
  FF bb 44442 44737 44442 44737   FF bb 44635 44737 44635 44737
  GG aa 44103 44737 44103 44737   GG aa 44257 44737 44257 44737
  GG aa 44402 44737 44402 44737   GG aa 44589 44737 44589 44737
  GG bb 43799 44737 43799 44737   GG bb 43808 44737 43808 44737
  GG bb 43893 44737 43893 44737   GG bb 44577 44737 44577 44737
  HH aa 43758 44737 43758 44737   HH aa 43947 44737 43947 44737
  HH aa 44257 44737 44257 44737   HH bb 43774 44737 43774 44737
  HH bb 44007 44737 44007 44737   HH bb 44054 44737 44054 44737
  HH bb 44382 44737 44382 44737   HH bb 44407 44737 44407 44737
  HH bb 44604 44737 44604 44737   II aa 44085 44737 44085 44737
  II aa 44339 44737 44339 44737   II bb 43932 44737 43932 44737
  II bb 44066 44737 44066 44737   II bb 44294 44737 44294 44737
  II bb 44316 44737 44316 44737   II bb 44487 44737 44487 44737
  JJ aa 43838 44737 43838 44737   JJ aa 43969 44737 43969 44737
  JJ aa 44503 44737 44503 44737   JJ aa 44624 44737 44624 44737
  JJ bb 43898 44737 43898 44737   JJ bb 44383 44737 44383 44737
  JJ bb 44401 44737 44401 44737   JJ bb 44480 44737 44480 44737}

do_execsql_test 1.5.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}
  BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   CC aa {}
  CC aa {}   CC aa {}   CC aa {}   CC bb {}   CC bb {}   DD aa {}   DD aa {}
  DD aa {}   DD bb {}   DD bb {}   DD bb {}   DD bb {}   EE aa {}   EE aa {}
................................................................................
  FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   GG aa {}
  GG aa {}   GG aa {}   GG aa {}   GG bb {}   GG bb {}   GG bb {}   GG bb {}
  HH aa {}   HH aa {}   HH aa {}   HH bb {}   HH bb {}   HH bb {}   HH bb {}
  HH bb {}   HH bb {}   II aa {}   II aa {}   II bb {}   II bb {}   II bb {}
  II bb {}   II bb {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ bb {}
  JJ bb {}   JJ bb {}   JJ bb {}}

do_execsql_test 1.5.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa {} {} {} {}   AA aa {} {} {} {}   AA aa {} {} {} {}
  AA aa {} {} {} {}   AA bb {} {} {} {}   AA bb {} {} {} {}
  AA bb {} {} {} {}   AA bb {} {} {} {}   BB aa {} {} {} {}
  BB aa {} {} {} {}   BB aa {} {} {} {}   BB aa {} {} {} {}
  BB aa {} {} {} {}   BB aa {} {} {} {}   BB bb {} {} {} {}
  BB bb {} {} {} {}   BB bb {} {} {} {}   BB bb {} {} {} {}
  BB bb {} {} {} {}   BB bb {} {} {} {}   CC aa {} {} {} {}
  CC aa {} {} {} {}   CC aa {} {} {} {}   CC aa {} {} {} {}
  CC bb {} {} {} {}   CC bb {} {} {} {}   DD aa {} {} {} {}
  DD aa {} {} {} {}   DD aa {} {} {} {}   DD bb {} {} {} {}
  DD bb {} {} {} {}   DD bb {} {} {} {}   DD bb {} {} {} {}
  EE aa {} {} {} {}   EE aa {} {} {} {}   EE bb {} {} {} {}
  EE bb {} {} {} {}   EE bb {} {} {} {}   FF aa {} {} {} {}
  FF aa {} {} {} {}   FF aa {} {} {} {}   FF aa {} {} {} {}
  FF bb {} {} {} {}   FF bb {} {} {} {}   FF bb {} {} {} {}
  FF bb {} {} {} {}   FF bb {} {} {} {}   FF bb {} {} {} {}
  GG aa {} {} {} {}   GG aa {} {} {} {}   GG aa {} {} {} {}
  GG aa {} {} {} {}   GG bb {} {} {} {}   GG bb {} {} {} {}
  GG bb {} {} {} {}   GG bb {} {} {} {}   HH aa {} {} {} {}
  HH aa {} {} {} {}   HH aa {} {} {} {}   HH bb {} {} {} {}
  HH bb {} {} {} {}   HH bb {} {} {} {}   HH bb {} {} {} {}
  HH bb {} {} {} {}   HH bb {} {} {} {}   II aa {} {} {} {}
  II aa {} {} {} {}   II bb {} {} {} {}   II bb {} {} {} {}
  II bb {} {} {} {}   II bb {} {} {} {}   II bb {} {} {} {}
  JJ aa {} {} {} {}   JJ aa {} {} {} {}   JJ aa {} {} {} {}
  JJ aa {} {} {} {}   JJ bb {} {} {} {}   JJ bb {} {} {} {}
  JJ bb {} {} {} {}   JJ bb {} {} {} {}}

do_execsql_test 1.6.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685
  BB aa 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685
  BB bb 4685   CC aa 12025   CC aa 12025   CC aa 12025   CC aa 12025
  CC bb 12025   CC bb 12025   DD aa 10462   DD aa 10462   DD aa 10462
................................................................................
  GG aa 5668   GG aa 5668   GG aa 5668   GG aa 5668   GG bb 5102   GG bb 5102
  GG bb 5102   GG bb 5102   HH aa 4468   HH aa 4468   HH aa 4468   HH bb 5120
  HH bb 5120   HH bb 5120   HH bb 5120   HH bb 5120   HH bb 5120   II aa 5443
  II aa 5443   II bb 4244   II bb 4244   II bb 4244   II bb 4244   II bb 4244
  JJ aa 3640   JJ aa 3640   JJ aa 3640   JJ aa 3640   JJ bb 4604   JJ bb 4604
  JJ bb 4604   JJ bb 4604}

do_execsql_test 1.6.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa {} {} {} {}   AA aa {} {} {} {}   AA aa {} {} {} {}
  AA aa {} {} {} {}   AA bb {} {} 2307 2307   AA bb {} {} 2307 2307
  AA bb {} {} 2307 2307   AA bb {} {} 2307 2307   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB bb 4685 4685 5251 5251
  BB bb 4685 4685 5251 5251   BB bb 4685 4685 5251 5251
  BB bb 4685 4685 5251 5251   BB bb 4685 4685 5251 5251
  BB bb 4685 4685 5251 5251   CC aa 12025 12025 7340 7340
  CC aa 12025 12025 7340 7340   CC aa 12025 12025 7340 7340
  CC aa 12025 12025 7340 7340   CC bb 12025 12025 6421 6421
  CC bb 12025 12025 6421 6421   DD aa 10462 10462 3122 3122
  DD aa 10462 10462 3122 3122   DD aa 10462 10462 3122 3122
  DD bb 10462 10462 2493 2493   DD bb 10462 10462 2493 2493
  DD bb 10462 10462 2493 2493   DD bb 10462 10462 2493 2493
  EE aa 7154 7154 4032 4032   EE aa 7154 7154 4032 4032
  EE bb 7154 7154 3597 3597   EE bb 7154 7154 3597 3597
  EE bb 7154 7154 3597 3597   FF aa 6571 6571 2539 2539
  FF aa 6571 6571 2539 2539   FF aa 6571 6571 2539 2539
  FF aa 6571 6571 2539 2539   FF bb 6571 6571 3812 3812
  FF bb 6571 6571 3812 3812   FF bb 6571 6571 3812 3812
  FF bb 6571 6571 3812 3812   FF bb 6571 6571 3812 3812
  FF bb 6571 6571 3812 3812   GG aa 8207 8207 5668 5668
  GG aa 8207 8207 5668 5668   GG aa 8207 8207 5668 5668
  GG aa 8207 8207 5668 5668   GG bb 8207 8207 5102 5102
  GG bb 8207 8207 5102 5102   GG bb 8207 8207 5102 5102
  GG bb 8207 8207 5102 5102   HH aa 10136 10136 4468 4468
  HH aa 10136 10136 4468 4468   HH aa 10136 10136 4468 4468
  HH bb 10136 10136 5120 5120   HH bb 10136 10136 5120 5120
  HH bb 10136 10136 5120 5120   HH bb 10136 10136 5120 5120
  HH bb 10136 10136 5120 5120   HH bb 10136 10136 5120 5120
  II aa 9911 9911 5443 5443   II aa 9911 9911 5443 5443
  II bb 9911 9911 4244 4244   II bb 9911 9911 4244 4244
  II bb 9911 9911 4244 4244   II bb 9911 9911 4244 4244
  II bb 9911 9911 4244 4244   JJ aa 9083 9083 3640 3640
  JJ aa 9083 9083 3640 3640   JJ aa 9083 9083 3640 3640
  JJ aa 9083 9083 3640 3640   JJ bb 9083 9083 4604 4604
  JJ bb 9083 9083 4604 4604   JJ bb 9083 9083 4604 4604
  JJ bb 9083 9083 4604 4604}

do_execsql_test 1.7.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685   BB aa 4685
  BB aa 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685   BB bb 4685
  BB bb 4685   CC aa 12025   CC aa 12025   CC aa 12025   CC aa 12025
  CC bb 12025   CC bb 12025   DD aa 15147   DD aa 15147   DD aa 15147
................................................................................
  GG aa 7317   GG aa 7317   GG aa 7317   GG aa 7317   GG bb 7265   GG bb 7265
  GG bb 7265   GG bb 7265   HH aa 7973   HH aa 7973   HH aa 7973   HH bb 6717
  HH bb 6717   HH bb 6717   HH bb 6717   HH bb 6717   HH bb 6717   II aa 8314
  II aa 8314   II bb 6493   II bb 6493   II bb 6493   II bb 6493   II bb 6493
  JJ aa 6834   JJ aa 6834   JJ aa 6834   JJ aa 6834   JJ bb 5654   JJ bb 5654
  JJ bb 5654   JJ bb 5654}

do_execsql_test 1.7.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa {} {} {} {}   AA aa {} {} {} {}   AA aa {} {} {} {}
  AA aa {} {} {} {}   AA bb {} {} 2307 2307   AA bb {} {} 2307 2307
  AA bb {} {} 2307 2307   AA bb {} {} 2307 2307   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB aa 4685 4685 4685 4685
  BB aa 4685 4685 4685 4685   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   BB bb 4685 4685 7558 7558
  BB bb 4685 4685 7558 7558   CC aa 12025 12025 9718 9718
  CC aa 12025 12025 9718 9718   CC aa 12025 12025 9718 9718
  CC aa 12025 12025 9718 9718   CC bb 12025 12025 9294 9294
  CC bb 12025 12025 9294 9294   DD aa 15147 15147 7589 7589
  DD aa 15147 15147 7589 7589   DD aa 15147 15147 7589 7589
  DD bb 15147 15147 4447 4447   DD bb 15147 15147 4447 4447
  DD bb 15147 15147 4447 4447   DD bb 15147 15147 4447 4447
  EE aa 14494 14494 5200 5200   EE aa 14494 14494 5200 5200
  EE bb 14494 14494 4922 4922   EE bb 14494 14494 4922 4922
  EE bb 14494 14494 4922 4922   FF aa 9693 9693 5246 5246
  FF aa 9693 9693 5246 5246   FF aa 9693 9693 5246 5246
  FF aa 9693 9693 5246 5246   FF bb 9693 9693 4702 4702
  FF bb 9693 9693 4702 4702   FF bb 9693 9693 4702 4702
  FF bb 9693 9693 4702 4702   FF bb 9693 9693 4702 4702
  FF bb 9693 9693 4702 4702   GG aa 12239 12239 7317 7317
  GG aa 12239 12239 7317 7317   GG aa 12239 12239 7317 7317
  GG aa 12239 12239 7317 7317   GG bb 12239 12239 7265 7265
  GG bb 12239 12239 7265 7265   GG bb 12239 12239 7265 7265
  GG bb 12239 12239 7265 7265   HH aa 12675 12675 7973 7973
  HH aa 12675 12675 7973 7973   HH aa 12675 12675 7973 7973
  HH bb 12675 12675 6717 6717   HH bb 12675 12675 6717 6717
  HH bb 12675 12675 6717 6717   HH bb 12675 12675 6717 6717
  HH bb 12675 12675 6717 6717   HH bb 12675 12675 6717 6717
  II aa 15579 15579 8314 8314   II aa 15579 15579 8314 8314
  II bb 15579 15579 6493 6493   II bb 15579 15579 6493 6493
  II bb 15579 15579 6493 6493   II bb 15579 15579 6493 6493
  II bb 15579 15579 6493 6493   JJ aa 13551 13551 6834 6834
  JJ aa 13551 13551 6834 6834   JJ aa 13551 13551 6834 6834
  JJ aa 13551 13551 6834 6834   JJ bb 13551 13551 5654 5654
  JJ bb 13551 13551 5654 5654   JJ bb 13551 13551 5654 5654
  JJ bb 13551 13551 5654 5654}

do_execsql_test 1.8.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  FF bb 7633   FF bb 7912   FF bb 8105   GG aa 8280   GG aa 8434   GG aa 8579
  GG aa 8766   GG bb 9198   GG bb 9207   GG bb 9292   GG bb 9976   HH aa 9243
  HH aa 9432   HH aa 9742   HH bb 8948   HH bb 9181   HH bb 9228   HH bb 9556
  HH bb 9581   HH bb 9778   II aa 8712   II aa 8966   II bb 8278   II bb 8412
  II bb 8640   II bb 8662   II bb 8833   JJ aa 7949   JJ aa 8080   JJ aa 8614
  JJ aa 8735   JJ bb 6601   JJ bb 7086   JJ bb 7104   JJ bb 7183}

do_execsql_test 1.8.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 3815 4685   AA bb 4058 4685 4058 4685
  AA bb 4113 4685 4113 4685   AA bb 4376 4685 4376 4685
  BB aa 11263 12025 6796 7558   BB aa 11365 12025 6898 7558
  BB aa 11613 12025 7146 7558   BB aa 11626 12025 7159 7558
  BB aa 11632 12025 7165 7558   BB aa 11778 12025 7311 7558
  BB bb 11185 12025 11185 12025   BB bb 11233 12025 11233 12025
  BB bb 11239 12025 11239 12025   BB bb 11314 12025 11314 12025
  BB bb 11320 12025 11320 12025   BB bb 11392 12025 11392 12025
  CC aa 14388 15147 10913 11672   CC aa 14540 15147 11065 11672
  CC aa 14717 15147 11242 11672   CC aa 14989 15147 11514 11672
  CC bb 14325 15147 9640 10462   CC bb 14801 15147 10116 10462
  DD aa 18334 19179 8069 8914   DD aa 18923 19179 8658 8914
  DD aa 18955 19179 8690 8914   DD bb 18220 19179 6195 7154
  DD bb 18385 19179 6360 7154   DD bb 18463 19179 6438 7154
  DD bb 18941 19179 6916 7154   EE aa 16256 17033 5313 6090
  EE aa 16920 17033 5977 6090   EE bb 16265 17033 5803 6571
  EE bb 16404 17033 5942 6571   EE bb 16781 17033 6319 6571
  FF aa 14691 15361 6739 7409   FF aa 14694 15361 6742 7409
  FF aa 14743 15361 6791 7409   FF aa 15153 15361 7201 7409
  FF bb 14423 15361 7269 8207   FF bb 14491 15361 7337 8207
  FF bb 14635 15361 7481 8207   FF bb 14787 15361 7633 8207
  FF bb 15066 15361 7912 8207   FF bb 15259 15361 8105 8207
  GG aa 16073 16707 8280 8914   GG aa 16227 16707 8434 8914
  GG aa 16372 16707 8579 8914   GG aa 16559 16707 8766 8914
  GG bb 15769 16707 9198 10136   GG bb 15778 16707 9207 10136
  GG bb 15863 16707 9292 10136   GG bb 16547 16707 9976 10136
  HH aa 17139 18118 9243 10222   HH aa 17328 18118 9432 10222
  HH aa 17638 18118 9742 10222   HH bb 17155 18118 8948 9911
  HH bb 17388 18118 9181 9911   HH bb 17435 18118 9228 9911
  HH bb 17763 18118 9556 9911   HH bb 17788 18118 9581 9911
  HH bb 17985 18118 9778 9911   II aa 18567 19219 8712 9364
  II aa 18821 19219 8966 9364   II bb 18414 19219 8278 9083
  II bb 18548 19219 8412 9083   II bb 18776 19219 8640 9083
  II bb 18798 19219 8662 9083   II bb 18969 19219 8833 9083
  JJ aa 16452 17351 7949 8848   JJ aa 16583 17351 8080 8848
  JJ aa 17117 17351 8614 8848   JJ aa 17238 17351 8735 8848
  JJ bb 16512 17351 6601 7440   JJ bb 16997 17351 7086 7440
  JJ bb 17015 17351 7104 7440   JJ bb 17094 17351 7183 7440}

do_execsql_test 1.9.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  GG aa 6631   GG aa 6785   GG aa 6930   GG aa 7117   GG bb 7035   GG bb 7044
  GG bb 7129   GG bb 7813   HH aa 5738   HH aa 5927   HH aa 6237   HH bb 7351
  HH bb 7584   HH bb 7631   HH bb 7959   HH bb 7984   HH bb 8181   II aa 5841
  II aa 6095   II bb 6029   II bb 6163   II bb 6391   II bb 6413   II bb 6584
  JJ aa 4755   JJ aa 4886   JJ aa 5420   JJ aa 5541   JJ bb 5551   JJ bb 6036
  JJ bb 6054   JJ bb 6133}

do_execsql_test 1.9.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 3815 4685   AA bb 4058 4685 4058 4685
  AA bb 4113 4685 4113 4685   AA bb 4376 4685 4376 4685
  BB aa 11263 12025 6796 7558   BB aa 11365 12025 6898 7558
  BB aa 11613 12025 7146 7558   BB aa 11626 12025 7159 7558
  BB aa 11632 12025 7165 7558   BB aa 11778 12025 7311 7558
  BB bb 11185 12025 8878 9718   BB bb 11233 12025 8926 9718
  BB bb 11239 12025 8932 9718   BB bb 11314 12025 9007 9718
  BB bb 11320 12025 9013 9718   BB bb 11392 12025 9085 9718
  CC aa 14388 15147 8535 9294   CC aa 14540 15147 8687 9294
  CC aa 14717 15147 8864 9294   CC aa 14989 15147 9136 9294
  CC bb 14325 15147 6767 7589   CC bb 14801 15147 7243 7589
  DD aa 13649 14494 3602 4447   DD aa 14238 14494 4191 4447
  DD aa 14270 14494 4223 4447   DD bb 13535 14494 4241 5200
  DD bb 13700 14494 4406 5200   DD bb 13778 14494 4484 5200
  DD bb 14256 14494 4962 5200   EE aa 8916 9693 4145 4922
  EE aa 9580 9693 4809 4922   EE bb 8925 9693 4478 5246
  EE bb 9064 9693 4617 5246   EE bb 9441 9693 4994 5246
  FF aa 11569 12239 4032 4702   FF aa 11572 12239 4035 4702
  FF aa 11621 12239 4084 4702   FF aa 12031 12239 4494 4702
  FF bb 11301 12239 6379 7317   FF bb 11369 12239 6447 7317
  FF bb 11513 12239 6591 7317   FF bb 11665 12239 6743 7317
  FF bb 11944 12239 7022 7317   FF bb 12137 12239 7215 7317
  GG aa 12041 12675 6631 7265   GG aa 12195 12675 6785 7265
  GG aa 12340 12675 6930 7265   GG aa 12527 12675 7117 7265
  GG bb 11737 12675 7035 7973   GG bb 11746 12675 7044 7973
  GG bb 11831 12675 7129 7973   GG bb 12515 12675 7813 7973
  HH aa 14600 15579 5738 6717   HH aa 14789 15579 5927 6717
  HH aa 15099 15579 6237 6717   HH bb 14616 15579 7351 8314
  HH bb 14849 15579 7584 8314   HH bb 14896 15579 7631 8314
  HH bb 15224 15579 7959 8314   HH bb 15249 15579 7984 8314
  HH bb 15446 15579 8181 8314   II aa 12899 13551 5841 6493
  II aa 13153 13551 6095 6493   II bb 12746 13551 6029 6834
  II bb 12880 13551 6163 6834   II bb 13108 13551 6391 6834
  II bb 13130 13551 6413 6834   II bb 13301 13551 6584 6834
  JJ aa 11984 12883 4755 5654   JJ aa 12115 12883 4886 5654
  JJ aa 12649 12883 5420 5654   JJ aa 12770 12883 5541 5654
  JJ bb 12044 12883 5551 6390   JJ bb 12529 12883 6036 6390
  JJ bb 12547 12883 6054 6390   JJ bb 12626 12883 6133 6390}

do_execsql_test 1.10.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 12025   BB aa 12025   BB aa 12025
  BB aa 12025   BB aa 12025   BB aa 12025   BB bb 12025   BB bb 12025
  BB bb 12025   BB bb 12025   BB bb 12025   BB bb 12025   CC aa 15147
  CC aa 15147   CC aa 15147   CC aa 15147   CC bb 15147   CC bb 15147
................................................................................
  FF bb 7633   FF bb 7912   FF bb 8105   GG aa 8280   GG aa 8434   GG aa 8579
  GG aa 8766   GG bb 9198   GG bb 9207   GG bb 9292   GG bb 9976   HH aa 9243
  HH aa 9432   HH aa 9742   HH bb 8948   HH bb 9181   HH bb 9228   HH bb 9556
  HH bb 9581   HH bb 9778   II aa 8712   II aa 8966   II bb 8278   II bb 8412
  II bb 8640   II bb 8662   II bb 8833   JJ aa 7949   JJ aa 8080   JJ aa 8614
  JJ aa 8735   JJ bb 6601   JJ bb 7086   JJ bb 7104   JJ bb 7183}

do_execsql_test 1.10.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 3815 4685   AA bb 4058 4685 4058 4685
  AA bb 4113 4685 4113 4685   AA bb 4376 4685 4376 4685
  BB aa 11263 12025 6796 7558   BB aa 11365 12025 6898 7558
  BB aa 11613 12025 7146 7558   BB aa 11626 12025 7159 7558
  BB aa 11632 12025 7165 7558   BB aa 11778 12025 7311 7558
  BB bb 11185 12025 11185 12025   BB bb 11233 12025 11233 12025
  BB bb 11239 12025 11239 12025   BB bb 11314 12025 11314 12025
  BB bb 11320 12025 11320 12025   BB bb 11392 12025 11392 12025
  CC aa 14388 15147 10913 11672   CC aa 14540 15147 11065 11672
  CC aa 14717 15147 11242 11672   CC aa 14989 15147 11514 11672
  CC bb 14325 15147 9640 10462   CC bb 14801 15147 10116 10462
  DD aa 18334 19179 8069 8914   DD aa 18923 19179 8658 8914
  DD aa 18955 19179 8690 8914   DD bb 18220 19179 6195 7154
  DD bb 18385 19179 6360 7154   DD bb 18463 19179 6438 7154
  DD bb 18941 19179 6916 7154   EE aa 16256 17033 5313 6090
  EE aa 16920 17033 5977 6090   EE bb 16265 17033 5803 6571
  EE bb 16404 17033 5942 6571   EE bb 16781 17033 6319 6571
  FF aa 14691 15361 6739 7409   FF aa 14694 15361 6742 7409
  FF aa 14743 15361 6791 7409   FF aa 15153 15361 7201 7409
  FF bb 14423 15361 7269 8207   FF bb 14491 15361 7337 8207
  FF bb 14635 15361 7481 8207   FF bb 14787 15361 7633 8207
  FF bb 15066 15361 7912 8207   FF bb 15259 15361 8105 8207
  GG aa 16073 16707 8280 8914   GG aa 16227 16707 8434 8914
  GG aa 16372 16707 8579 8914   GG aa 16559 16707 8766 8914
  GG bb 15769 16707 9198 10136   GG bb 15778 16707 9207 10136
  GG bb 15863 16707 9292 10136   GG bb 16547 16707 9976 10136
  HH aa 17139 18118 9243 10222   HH aa 17328 18118 9432 10222
  HH aa 17638 18118 9742 10222   HH bb 17155 18118 8948 9911
  HH bb 17388 18118 9181 9911   HH bb 17435 18118 9228 9911
  HH bb 17763 18118 9556 9911   HH bb 17788 18118 9581 9911
  HH bb 17985 18118 9778 9911   II aa 18567 19219 8712 9364
  II aa 18821 19219 8966 9364   II bb 18414 19219 8278 9083
  II bb 18548 19219 8412 9083   II bb 18776 19219 8640 9083
  II bb 18798 19219 8662 9083   II bb 18969 19219 8833 9083
  JJ aa 16452 17351 7949 8848   JJ aa 16583 17351 8080 8848
  JJ aa 17117 17351 8614 8848   JJ aa 17238 17351 8735 8848
  JJ bb 16512 17351 6601 7440   JJ bb 16997 17351 7086 7440
  JJ bb 17015 17351 7104 7440   JJ bb 17094 17351 7183 7440}

do_execsql_test 1.11.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 44737   BB aa 44737
  BB aa 44737   BB aa 44737   BB aa 44737   BB aa 44737   BB bb 44737
  BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737   BB bb 44737
  CC aa 44737   CC aa 44737   CC aa 44737   CC aa 44737   CC bb 44737
................................................................................
  GG aa 22684   GG aa 22871   GG bb 19918   GG bb 19927   GG bb 20012
  GG bb 20696   HH aa 16372   HH aa 16561   HH aa 16871   HH bb 14791
  HH bb 15024   HH bb 15071   HH bb 15399   HH bb 15424   HH bb 15621
  II aa 12231   II aa 12485   II bb 9829   II bb 9963   II bb 10191
  II bb 10213   II bb 10384   JJ aa 6541   JJ aa 6672   JJ aa 7206
  JJ aa 7327   JJ bb 5551   JJ bb 6036   JJ bb 6054   JJ bb 6133}

do_execsql_test 1.11.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 43803 44737 43803 44737   AA aa 43826 44737 43826 44737
  AA aa 44498 44737 44498 44737   AA aa 44514 44737 44514 44737
  AA bb 43867 44737 43867 44737   AA bb 44110 44737 44110 44737
  AA bb 44165 44737 44165 44737   AA bb 44428 44737 44428 44737
  BB aa 43975 44737 43975 44737   BB aa 44077 44737 44077 44737
  BB aa 44325 44737 44325 44737   BB aa 44338 44737 44338 44737
  BB aa 44344 44737 44344 44737   BB aa 44490 44737 44490 44737
  BB bb 43897 44737 41590 42430   BB bb 43945 44737 41638 42430
  BB bb 43951 44737 41644 42430   BB bb 44026 44737 41719 42430
  BB bb 44032 44737 41725 42430   BB bb 44104 44737 41797 42430
  CC aa 43978 44737 39293 40052   CC aa 44130 44737 39445 40052
  CC aa 44307 44737 39622 40052   CC aa 44579 44737 39894 40052
  CC bb 43915 44737 36357 37179   CC bb 44391 44737 36833 37179
  DD aa 39207 40052 31867 32712   DD aa 39796 40052 32456 32712
  DD aa 39828 40052 32488 32712   DD bb 39093 40052 29799 30758
  DD bb 39258 40052 29964 30758   DD bb 39336 40052 30042 30758
  DD bb 39814 40052 30520 30758   EE aa 31935 32712 28813 29590
  EE aa 32599 32712 29477 29590   EE bb 31944 32712 27497 28265
  EE bb 32083 32712 27636 28265   EE bb 32460 32712 28013 28265
  FF aa 28920 29590 24888 25558   FF aa 28923 29590 24891 25558
  FF aa 28972 29590 24940 25558   FF aa 29382 29590 25350 25558
  FF bb 28652 29590 23730 24668   FF bb 28720 29590 23798 24668
  FF bb 28864 29590 23942 24668   FF bb 29016 29590 24094 24668
  FF bb 29295 29590 24373 24668   FF bb 29488 29590 24566 24668
  GG aa 24924 25558 22385 23019   GG aa 25078 25558 22539 23019
  GG aa 25223 25558 22684 23019   GG aa 25410 25558 22871 23019
  GG bb 24620 25558 19918 20856   GG bb 24629 25558 19927 20856
  GG bb 24714 25558 20012 20856   GG bb 25398 25558 20696 20856
  HH aa 22040 23019 16372 17351   HH aa 22229 23019 16561 17351
  HH aa 22539 23019 16871 17351   HH bb 22056 23019 14791 15754
  HH bb 22289 23019 15024 15754   HH bb 22336 23019 15071 15754
  HH bb 22664 23019 15399 15754   HH bb 22689 23019 15424 15754
  HH bb 22886 23019 15621 15754   II aa 16699 17351 12231 12883
  II aa 16953 17351 12485 12883   II bb 16546 17351 9829 10634
  II bb 16680 17351 9963 10634   II bb 16908 17351 10191 10634
  II bb 16930 17351 10213 10634   II bb 17101 17351 10384 10634
  JJ aa 11984 12883 6541 7440   JJ aa 12115 12883 6672 7440
  JJ aa 12649 12883 7206 7440   JJ aa 12770 12883 7327 7440
  JJ bb 12044 12883 5551 6390   JJ bb 12529 12883 6036 6390
  JJ bb 12547 12883 6054 6390   JJ bb 12626 12883 6133 6390}

do_execsql_test 1.12.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 7340   BB aa 7340   BB aa 7340   BB aa 7340
  BB aa 7340   BB aa 7340   BB bb 7340   BB bb 7340   BB bb 7340   BB bb 7340
  BB bb 7340   BB bb 7340   CC aa 3122   CC aa 3122   CC aa 3122   CC aa 3122
  CC bb 3122   CC bb 3122   DD aa 4032   DD aa 4032   DD aa 4032   DD bb 4032
................................................................................
  GG aa 963   GG aa 1117   GG aa 1262   GG aa 1449   GG bb 1933   GG bb 1942
  GG bb 2027   GG bb 2711   HH aa 1270   HH aa 1459   HH aa 1769   HH bb 2231
  HH bb 2464   HH bb 2511   HH bb 2839   HH bb 2864   HH bb 3061   II aa 398
  II aa 652   II bb 1785   II bb 1919   II bb 2147   II bb 2169   II bb 2340
  JJ aa 1115   JJ aa 1246   JJ aa 1780   JJ aa 1901   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

do_execsql_test 1.12.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 1508 2378   AA bb 4058 4685 1751 2378
  AA bb 4113 4685 1806 2378   AA bb 4376 4685 2069 2378
  BB aa 6578 7340 2111 2873   BB aa 6680 7340 2213 2873
  BB aa 6928 7340 2461 2873   BB aa 6941 7340 2474 2873
  BB aa 6947 7340 2480 2873   BB aa 7093 7340 2626 2873
  BB bb 6500 7340 3627 4467   BB bb 6548 7340 3675 4467
  BB bb 6554 7340 3681 4467   BB bb 6629 7340 3756 4467
  BB bb 6635 7340 3762 4467   BB bb 6707 7340 3834 4467
  CC aa 2363 3122 1195 1954   CC aa 2515 3122 1347 1954
  CC aa 2692 3122 1524 1954   CC aa 2964 3122 1796 1954
  CC bb 2300 3122 346 1168   CC bb 2776 3122 822 1168
  DD aa 3187 4032 480 1325   DD aa 3776 4032 1069 1325
  DD aa 3808 4032 1101 1325   DD bb 3073 4032 1748 2707
  DD bb 3238 4032 1913 2707   DD bb 3316 4032 1991 2707
  DD bb 3794 4032 2469 2707   EE aa 1762 2539 113 890
  EE aa 2426 2539 777 890   EE bb 1771 2539 881 1649
  EE bb 1910 2539 1020 1649   EE bb 2287 2539 1397 1649
  FF aa 4998 5668 1493 2163   FF aa 5001 5668 1496 2163
  FF aa 5050 5668 1545 2163   FF aa 5460 5668 1955 2163
  FF bb 4730 5668 2567 3505   FF bb 4798 5668 2635 3505
  FF bb 4942 5668 2779 3505   FF bb 5094 5668 2931 3505
  FF bb 5373 5668 3210 3505   FF bb 5566 5668 3403 3505
  GG aa 3834 4468 963 1597   GG aa 3988 4468 1117 1597
  GG aa 4133 4468 1262 1597   GG aa 4320 4468 1449 1597
  GG bb 3530 4468 1933 2871   GG bb 3539 4468 1942 2871
  GG bb 3624 4468 2027 2871   GG bb 4308 4468 2711 2871
  HH aa 4464 5443 1270 2249   HH aa 4653 5443 1459 2249
  HH aa 4963 5443 1769 2249   HH bb 4480 5443 2231 3194
  HH bb 4713 5443 2464 3194   HH bb 4760 5443 2511 3194
  HH bb 5088 5443 2839 3194   HH bb 5113 5443 2864 3194
  HH bb 5310 5443 3061 3194   II aa 2988 3640 398 1050
  II aa 3242 3640 652 1050   II bb 2835 3640 1785 2590
  II bb 2969 3640 1919 2590   II bb 3197 3640 2147 2590
  II bb 3219 3640 2169 2590   II bb 3390 3640 2340 2590
  JJ aa 2901 3800 1115 2014   JJ aa 3032 3800 1246 2014
  JJ aa 3566 3800 1780 2014   JJ aa 3687 3800 1901 2014
  JJ bb 2961 3800 947 1786   JJ bb 3446 3800 1432 1786
  JJ bb 3464 3800 1450 1786   JJ bb 3543 3800 1529 1786}

do_execsql_test 1.13.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 12025   AA aa 12025   AA aa 12025   AA aa 12025   AA bb 12025
  AA bb 12025   AA bb 12025   AA bb 12025   BB aa 10462   BB aa 10462
  BB aa 10462   BB aa 10462   BB aa 10462   BB aa 10462   BB bb 10462
  BB bb 10462   BB bb 10462   BB bb 10462   BB bb 10462   BB bb 10462
  CC aa 7154   CC aa 7154   CC aa 7154   CC aa 7154   CC bb 7154   CC bb 7154
................................................................................
  GG aa 3834   GG aa 3988   GG aa 4133   GG aa 4320   GG bb 4182   GG bb 4191
  GG bb 4276   GG bb 4960   HH aa 4464   HH aa 4653   HH aa 4963   HH bb 3281
  HH bb 3514   HH bb 3561   HH bb 3889   HH bb 3914   HH bb 4111   II aa 2988
  II aa 3242   II bb 3799   II bb 3933   II bb 4161   II bb 4183   II bb 4354
  JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

do_execsql_test 1.13.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 11091 12025 3751 4685   AA aa 11114 12025 3774 4685
  AA aa 11786 12025 4446 4685   AA aa 11802 12025 4462 4685
  AA bb 11155 12025 4381 5251   AA bb 11398 12025 4624 5251
  AA bb 11453 12025 4679 5251   AA bb 11716 12025 4942 5251
  BB aa 9700 10462 6578 7340   BB aa 9802 10462 6680 7340
  BB aa 10050 10462 6928 7340   BB aa 10063 10462 6941 7340
  BB aa 10069 10462 6947 7340   BB aa 10215 10462 7093 7340
  BB bb 9622 10462 5581 6421   BB bb 9670 10462 5629 6421
  BB bb 9676 10462 5635 6421   BB bb 9751 10462 5710 6421
  BB bb 9757 10462 5716 6421   BB bb 9829 10462 5788 6421
  CC aa 6395 7154 2363 3122   CC aa 6547 7154 2515 3122
  CC aa 6724 7154 2692 3122   CC aa 6996 7154 2964 3122
  CC bb 6332 7154 1671 2493   CC bb 6808 7154 2147 2493
  DD aa 5726 6571 3187 4032   DD aa 6315 6571 3776 4032
  DD aa 6347 6571 3808 4032   DD bb 5612 6571 2638 3597
  DD bb 5777 6571 2803 3597   DD bb 5855 6571 2881 3597
  DD bb 6333 6571 3359 3597   EE aa 7430 8207 1762 2539
  EE aa 8094 8207 2426 2539   EE bb 7439 8207 3044 3812
  EE bb 7578 8207 3183 3812   EE bb 7955 8207 3560 3812
  FF aa 9466 10136 4998 5668   FF aa 9469 10136 5001 5668
  FF aa 9518 10136 5050 5668   FF aa 9928 10136 5460 5668
  FF bb 9198 10136 4164 5102   FF bb 9266 10136 4232 5102
  FF bb 9410 10136 4376 5102   FF bb 9562 10136 4528 5102
  FF bb 9841 10136 4807 5102   FF bb 10034 10136 5000 5102
  GG aa 9277 9911 3834 4468   GG aa 9431 9911 3988 4468
  GG aa 9576 9911 4133 4468   GG aa 9763 9911 4320 4468
  GG bb 8973 9911 4182 5120   GG bb 8982 9911 4191 5120
  GG bb 9067 9911 4276 5120   GG bb 9751 9911 4960 5120
  HH aa 8104 9083 4464 5443   HH aa 8293 9083 4653 5443
  HH aa 8603 9083 4963 5443   HH bb 8120 9083 3281 4244
  HH bb 8353 9083 3514 4244   HH bb 8400 9083 3561 4244
  HH bb 8728 9083 3889 4244   HH bb 8753 9083 3914 4244
  HH bb 8950 9083 4111 4244   II aa 6788 7440 2988 3640
  II aa 7042 7440 3242 3640   II bb 6635 7440 3799 4604
  II bb 6769 7440 3933 4604   II bb 6997 7440 4161 4604
  II bb 7019 7440 4183 4604   II bb 7190 7440 4354 4604
  JJ aa 2901 3800 2901 3800   JJ aa 3032 3800 3032 3800
  JJ aa 3566 3800 3566 3800   JJ aa 3687 3800 3687 3800
  JJ bb 2961 3800 947 1786   JJ bb 3446 3800 1432 1786
  JJ bb 3464 3800 1450 1786   JJ bb 3543 3800 1529 1786}

do_execsql_test 1.14.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 40052   BB aa 40052
  BB aa 40052   BB aa 40052   BB aa 40052   BB aa 40052   BB bb 40052
  BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052
  CC aa 32712   CC aa 32712   CC aa 32712   CC aa 32712   CC bb 32712
................................................................................
  GG aa 17016   GG aa 17203   GG bb 14816   GG bb 14825   GG bb 14910
  GG bb 15594   HH aa 11904   HH aa 12093   HH aa 12403   HH bb 9671
  HH bb 9904   HH bb 9951   HH bb 10279   HH bb 10304   HH bb 10501
  II aa 6788   II aa 7042   II bb 5585   II bb 5719   II bb 5947   II bb 5969
  II bb 6140   JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947
  JJ bb 1432   JJ bb 1450   JJ bb 1529}

do_execsql_test 1.14.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 43803 44737 43803 44737   AA aa 43826 44737 43826 44737
  AA aa 44498 44737 44498 44737   AA aa 44514 44737 44514 44737
  AA bb 43867 44737 41560 42430   AA bb 44110 44737 41803 42430
  AA bb 44165 44737 41858 42430   AA bb 44428 44737 42121 42430
  BB aa 39290 40052 39290 40052   BB aa 39392 40052 39392 40052
  BB aa 39640 40052 39640 40052   BB aa 39653 40052 39653 40052
  BB aa 39659 40052 39659 40052   BB aa 39805 40052 39805 40052
  BB bb 39212 40052 36339 37179   BB bb 39260 40052 36387 37179
  BB bb 39266 40052 36393 37179   BB bb 39341 40052 36468 37179
  BB bb 39347 40052 36474 37179   BB bb 39419 40052 36546 37179
  CC aa 31953 32712 31953 32712   CC aa 32105 32712 32105 32712
  CC aa 32282 32712 32282 32712   CC aa 32554 32712 32554 32712
  CC bb 31890 32712 29936 30758   CC bb 32366 32712 30412 30758
  DD aa 28745 29590 28745 29590   DD aa 29334 29590 29334 29590
  DD aa 29366 29590 29366 29590   DD bb 28631 29590 27306 28265
  DD bb 28796 29590 27471 28265   DD bb 28874 29590 27549 28265
  DD bb 29352 29590 28027 28265   EE aa 24781 25558 24781 25558
  EE aa 25445 25558 25445 25558   EE bb 24790 25558 23900 24668
  EE bb 24929 25558 24039 24668   EE bb 25306 25558 24416 24668
  FF aa 22349 23019 22349 23019   FF aa 22352 23019 22352 23019
  FF aa 22401 23019 22401 23019   FF aa 22811 23019 22811 23019
  FF bb 22081 23019 19918 20856   FF bb 22149 23019 19986 20856
  FF bb 22293 23019 20130 20856   FF bb 22445 23019 20282 20856
  FF bb 22724 23019 20561 20856   FF bb 22917 23019 20754 20856
  GG aa 16717 17351 16717 17351   GG aa 16871 17351 16871 17351
  GG aa 17016 17351 17016 17351   GG aa 17203 17351 17203 17351
  GG bb 16413 17351 14816 15754   GG bb 16422 17351 14825 15754
  GG bb 16507 17351 14910 15754   GG bb 17191 17351 15594 15754
  HH aa 11904 12883 11904 12883   HH aa 12093 12883 12093 12883
  HH aa 12403 12883 12403 12883   HH bb 11920 12883 9671 10634
  HH bb 12153 12883 9904 10634   HH bb 12200 12883 9951 10634
  HH bb 12528 12883 10279 10634   HH bb 12553 12883 10304 10634
  HH bb 12750 12883 10501 10634   II aa 6788 7440 6788 7440
  II aa 7042 7440 7042 7440   II bb 6635 7440 5585 6390
  II bb 6769 7440 5719 6390   II bb 6997 7440 5947 6390
  II bb 7019 7440 5969 6390   II bb 7190 7440 6140 6390
  JJ aa 2901 3800 2901 3800   JJ aa 3032 3800 3032 3800
  JJ aa 3566 3800 3566 3800   JJ aa 3687 3800 3687 3800
  JJ bb 2961 3800 947 1786   JJ bb 3446 3800 1432 1786
  JJ bb 3464 3800 1450 1786   JJ bb 3543 3800 1529 1786}

do_execsql_test 1.15.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 44737   AA aa 44737   AA aa 44737   AA aa 44737   AA bb 44737
  AA bb 44737   AA bb 44737   AA bb 44737   BB aa 40052   BB aa 40052
  BB aa 40052   BB aa 40052   BB aa 40052   BB aa 40052   BB bb 40052
  BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052   BB bb 40052
  CC aa 32712   CC aa 32712   CC aa 32712   CC aa 32712   CC bb 32712
................................................................................
  GG aa 17016   GG aa 17203   GG bb 14816   GG bb 14825   GG bb 14910
  GG bb 15594   HH aa 11904   HH aa 12093   HH aa 12403   HH bb 9671
  HH bb 9904   HH bb 9951   HH bb 10279   HH bb 10304   HH bb 10501
  II aa 6788   II aa 7042   II bb 5585   II bb 5719   II bb 5947   II bb 5969
  II bb 6140   JJ aa 2901   JJ aa 3032   JJ aa 3566   JJ aa 3687   JJ bb 947
  JJ bb 1432   JJ bb 1450   JJ bb 1529}

do_execsql_test 1.15.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 43803 44737 43803 44737   AA aa 43826 44737 43826 44737
  AA aa 44498 44737 44498 44737   AA aa 44514 44737 44514 44737
  AA bb 43867 44737 41560 42430   AA bb 44110 44737 41803 42430
  AA bb 44165 44737 41858 42430   AA bb 44428 44737 42121 42430
  BB aa 39290 40052 39290 40052   BB aa 39392 40052 39392 40052
  BB aa 39640 40052 39640 40052   BB aa 39653 40052 39653 40052
  BB aa 39659 40052 39659 40052   BB aa 39805 40052 39805 40052
  BB bb 39212 40052 36339 37179   BB bb 39260 40052 36387 37179
  BB bb 39266 40052 36393 37179   BB bb 39341 40052 36468 37179
  BB bb 39347 40052 36474 37179   BB bb 39419 40052 36546 37179
  CC aa 31953 32712 31953 32712   CC aa 32105 32712 32105 32712
  CC aa 32282 32712 32282 32712   CC aa 32554 32712 32554 32712
  CC bb 31890 32712 29936 30758   CC bb 32366 32712 30412 30758
  DD aa 28745 29590 28745 29590   DD aa 29334 29590 29334 29590
  DD aa 29366 29590 29366 29590   DD bb 28631 29590 27306 28265
  DD bb 28796 29590 27471 28265   DD bb 28874 29590 27549 28265
  DD bb 29352 29590 28027 28265   EE aa 24781 25558 24781 25558
  EE aa 25445 25558 25445 25558   EE bb 24790 25558 23900 24668
  EE bb 24929 25558 24039 24668   EE bb 25306 25558 24416 24668
  FF aa 22349 23019 22349 23019   FF aa 22352 23019 22352 23019
  FF aa 22401 23019 22401 23019   FF aa 22811 23019 22811 23019
  FF bb 22081 23019 19918 20856   FF bb 22149 23019 19986 20856
  FF bb 22293 23019 20130 20856   FF bb 22445 23019 20282 20856
  FF bb 22724 23019 20561 20856   FF bb 22917 23019 20754 20856
  GG aa 16717 17351 16717 17351   GG aa 16871 17351 16871 17351
  GG aa 17016 17351 17016 17351   GG aa 17203 17351 17203 17351
  GG bb 16413 17351 14816 15754   GG bb 16422 17351 14825 15754
  GG bb 16507 17351 14910 15754   GG bb 17191 17351 15594 15754
  HH aa 11904 12883 11904 12883   HH aa 12093 12883 12093 12883
  HH aa 12403 12883 12403 12883   HH bb 11920 12883 9671 10634
  HH bb 12153 12883 9904 10634   HH bb 12200 12883 9951 10634
  HH bb 12528 12883 10279 10634   HH bb 12553 12883 10304 10634
  HH bb 12750 12883 10501 10634   II aa 6788 7440 6788 7440
  II aa 7042 7440 7042 7440   II bb 6635 7440 5585 6390
  II bb 6769 7440 5719 6390   II bb 6997 7440 5947 6390
  II bb 7019 7440 5969 6390   II bb 7190 7440 6140 6390
  JJ aa 2901 3800 2901 3800   JJ aa 3032 3800 3032 3800
  JJ aa 3566 3800 3566 3800   JJ aa 3687 3800 3687 3800
  JJ bb 2961 3800 947 1786   JJ bb 3446 3800 1432 1786
  JJ bb 3464 3800 1450 1786   JJ bb 3543 3800 1529 1786}

do_execsql_test 1.16.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 4685   AA aa 4685   AA aa 4685   AA aa 4685   AA bb 4685   AA bb 4685
  AA bb 4685   AA bb 4685   BB aa 7340   BB aa 7340   BB aa 7340   BB aa 7340
  BB aa 7340   BB aa 7340   BB bb 7340   BB bb 7340   BB bb 7340   BB bb 7340
  BB bb 7340   BB bb 7340   CC aa 3122   CC aa 3122   CC aa 3122   CC aa 3122
  CC bb 3122   CC bb 3122   DD aa 4032   DD aa 4032   DD aa 4032   DD bb 4032
................................................................................
  GG aa 963   GG aa 1117   GG aa 1262   GG aa 1449   GG bb 1933   GG bb 1942
  GG bb 2027   GG bb 2711   HH aa 1270   HH aa 1459   HH aa 1769   HH bb 2231
  HH bb 2464   HH bb 2511   HH bb 2839   HH bb 2864   HH bb 3061   II aa 398
  II aa 652   II bb 1785   II bb 1919   II bb 2147   II bb 2169   II bb 2340
  JJ aa 1115   JJ aa 1246   JJ aa 1780   JJ aa 1901   JJ bb 947   JJ bb 1432
  JJ bb 1450   JJ bb 1529}

do_execsql_test 1.16.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 3751 4685 1373 2307   AA aa 3774 4685 1396 2307
  AA aa 4446 4685 2068 2307   AA aa 4462 4685 2084 2307
  AA bb 3815 4685 1508 2378   AA bb 4058 4685 1751 2378
  AA bb 4113 4685 1806 2378   AA bb 4376 4685 2069 2378
  BB aa 6578 7340 2111 2873   BB aa 6680 7340 2213 2873
  BB aa 6928 7340 2461 2873   BB aa 6941 7340 2474 2873
  BB aa 6947 7340 2480 2873   BB aa 7093 7340 2626 2873
  BB bb 6500 7340 3627 4467   BB bb 6548 7340 3675 4467
  BB bb 6554 7340 3681 4467   BB bb 6629 7340 3756 4467
  BB bb 6635 7340 3762 4467   BB bb 6707 7340 3834 4467
  CC aa 2363 3122 1195 1954   CC aa 2515 3122 1347 1954
  CC aa 2692 3122 1524 1954   CC aa 2964 3122 1796 1954
  CC bb 2300 3122 346 1168   CC bb 2776 3122 822 1168
  DD aa 3187 4032 480 1325   DD aa 3776 4032 1069 1325
  DD aa 3808 4032 1101 1325   DD bb 3073 4032 1748 2707
  DD bb 3238 4032 1913 2707   DD bb 3316 4032 1991 2707
  DD bb 3794 4032 2469 2707   EE aa 1762 2539 113 890
  EE aa 2426 2539 777 890   EE bb 1771 2539 881 1649
  EE bb 1910 2539 1020 1649   EE bb 2287 2539 1397 1649
  FF aa 4998 5668 1493 2163   FF aa 5001 5668 1496 2163
  FF aa 5050 5668 1545 2163   FF aa 5460 5668 1955 2163
  FF bb 4730 5668 2567 3505   FF bb 4798 5668 2635 3505
  FF bb 4942 5668 2779 3505   FF bb 5094 5668 2931 3505
  FF bb 5373 5668 3210 3505   FF bb 5566 5668 3403 3505
  GG aa 3834 4468 963 1597   GG aa 3988 4468 1117 1597
  GG aa 4133 4468 1262 1597   GG aa 4320 4468 1449 1597
  GG bb 3530 4468 1933 2871   GG bb 3539 4468 1942 2871
  GG bb 3624 4468 2027 2871   GG bb 4308 4468 2711 2871
  HH aa 4464 5443 1270 2249   HH aa 4653 5443 1459 2249
  HH aa 4963 5443 1769 2249   HH bb 4480 5443 2231 3194
  HH bb 4713 5443 2464 3194   HH bb 4760 5443 2511 3194
  HH bb 5088 5443 2839 3194   HH bb 5113 5443 2864 3194
  HH bb 5310 5443 3061 3194   II aa 2988 3640 398 1050
  II aa 3242 3640 652 1050   II bb 2835 3640 1785 2590
  II bb 2969 3640 1919 2590   II bb 3197 3640 2147 2590
  II bb 3219 3640 2169 2590   II bb 3390 3640 2340 2590
  JJ aa 2901 3800 1115 2014   JJ aa 3032 3800 1246 2014
  JJ aa 3566 3800 1780 2014   JJ aa 3687 3800 1901 2014
  JJ bb 2961 3800 947 1786   JJ bb 3446 3800 1432 1786
  JJ bb 3464 3800 1450 1786   JJ bb 3543 3800 1529 1786}

do_execsql_test 1.17.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa {}   AA aa {}   AA aa {}   AA aa {}   AA bb {}   AA bb {}   AA bb {}
  AA bb {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}   BB aa {}
  BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   BB bb {}   CC aa {}
  CC aa {}   CC aa {}   CC aa {}   CC bb {}   CC bb {}   DD aa {}   DD aa {}
  DD aa {}   DD bb {}   DD bb {}   DD bb {}   DD bb {}   EE aa {}   EE aa {}
................................................................................
  FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   FF bb {}   GG aa {}
  GG aa {}   GG aa {}   GG aa {}   GG bb {}   GG bb {}   GG bb {}   GG bb {}
  HH aa {}   HH aa {}   HH aa {}   HH bb {}   HH bb {}   HH bb {}   HH bb {}
  HH bb {}   HH bb {}   II aa {}   II aa {}   II bb {}   II bb {}   II bb {}
  II bb {}   II bb {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ aa {}   JJ bb {}
  JJ bb {}   JJ bb {}   JJ bb {}}

do_execsql_test 1.17.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa {} {} {} {}   AA aa {} {} {} {}   AA aa {} {} {} {}
  AA aa {} {} {} {}   AA bb {} {} {} {}   AA bb {} {} {} {}
  AA bb {} {} {} {}   AA bb {} {} {} {}   BB aa {} {} {} {}
  BB aa {} {} {} {}   BB aa {} {} {} {}   BB aa {} {} {} {}
  BB aa {} {} {} {}   BB aa {} {} {} {}   BB bb {} {} {} {}
  BB bb {} {} {} {}   BB bb {} {} {} {}   BB bb {} {} {} {}
  BB bb {} {} {} {}   BB bb {} {} {} {}   CC aa {} {} {} {}
  CC aa {} {} {} {}   CC aa {} {} {} {}   CC aa {} {} {} {}
  CC bb {} {} {} {}   CC bb {} {} {} {}   DD aa {} {} {} {}
  DD aa {} {} {} {}   DD aa {} {} {} {}   DD bb {} {} {} {}
  DD bb {} {} {} {}   DD bb {} {} {} {}   DD bb {} {} {} {}
  EE aa {} {} {} {}   EE aa {} {} {} {}   EE bb {} {} {} {}
  EE bb {} {} {} {}   EE bb {} {} {} {}   FF aa {} {} {} {}
  FF aa {} {} {} {}   FF aa {} {} {} {}   FF aa {} {} {} {}
  FF bb {} {} {} {}   FF bb {} {} {} {}   FF bb {} {} {} {}
  FF bb {} {} {} {}   FF bb {} {} {} {}   FF bb {} {} {} {}
  GG aa {} {} {} {}   GG aa {} {} {} {}   GG aa {} {} {} {}
  GG aa {} {} {} {}   GG bb {} {} {} {}   GG bb {} {} {} {}
  GG bb {} {} {} {}   GG bb {} {} {} {}   HH aa {} {} {} {}
  HH aa {} {} {} {}   HH aa {} {} {} {}   HH bb {} {} {} {}
  HH bb {} {} {} {}   HH bb {} {} {} {}   HH bb {} {} {} {}
  HH bb {} {} {} {}   HH bb {} {} {} {}   II aa {} {} {} {}
  II aa {} {} {} {}   II bb {} {} {} {}   II bb {} {} {} {}
  II bb {} {} {} {}   II bb {} {} {} {}   II bb {} {} {} {}
  JJ aa {} {} {} {}   JJ aa {} {} {} {}   JJ aa {} {} {} {}
  JJ aa {} {} {} {}   JJ bb {} {} {} {}   JJ bb {} {} {} {}
  JJ bb {} {} {} {}   JJ bb {} {} {} {}}

do_execsql_test 1.18.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 22701   AA aa 22701   AA aa 22701   AA aa 22701   AA bb 22701
  AA bb 22701   AA bb 22701   AA bb 22701   BB aa 19829   BB aa 19829
  BB aa 19829   BB aa 19829   BB aa 19829   BB aa 19829   BB bb 19829
  BB bb 19829   BB bb 19829   BB bb 19829   BB bb 19829   BB bb 19829
  CC aa 22150   CC aa 22150   CC aa 22150   CC aa 22150   CC bb 22150
................................................................................
  GG aa 11954   GG bb 11097   GG bb 11097   GG bb 11097   GG bb 11097
  HH aa 10634   HH aa 10634   HH aa 10634   HH bb 7440   HH bb 7440
  HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   II aa 6390   II aa 6390
  II bb 3800   II bb 3800   II bb 3800   II bb 3800   II bb 3800   JJ aa 1786
  JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ bb {}   JJ bb {}   JJ bb {}
  JJ bb {}}

do_execsql_test 1.18.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 22701 22701 12840 12840   AA aa 22701 22701 12840 12840
  AA aa 22701 22701 12840 12840   AA aa 22701 22701 12840 12840
  AA bb 22701 22701 11787 11787   AA bb 22701 22701 11787 11787
  AA bb 22701 22701 11787 11787   AA bb 22701 22701 11787 11787
  BB aa 19829 19829 11621 11621   BB aa 19829 19829 11621 11621
  BB aa 19829 19829 11621 11621   BB aa 19829 19829 11621 11621
  BB aa 19829 19829 11621 11621   BB aa 19829 19829 11621 11621
  BB bb 19829 19829 8044 8044   BB bb 19829 19829 8044 8044
  BB bb 19829 19829 8044 8044   BB bb 19829 19829 8044 8044
  BB bb 19829 19829 8044 8044   BB bb 19829 19829 8044 8044
  CC aa 22150 22150 7739 7739   CC aa 22150 22150 7739 7739
  CC aa 22150 22150 7739 7739   CC aa 22150 22150 7739 7739
  CC bb 22150 22150 8734 8734   CC bb 22150 22150 8734 8734
  DD aa 21758 21758 10914 10914   DD aa 21758 21758 10914 10914
  DD aa 21758 21758 10914 10914   DD bb 21758 21758 9804 9804
  DD bb 21758 21758 9804 9804   DD bb 21758 21758 9804 9804
  DD bb 21758 21758 9804 9804   EE aa 23019 23019 11785 11785
  EE aa 23019 23019 11785 11785   EE bb 23019 23019 12385 12385
  EE bb 23019 23019 12385 12385   EE bb 23019 23019 12385 12385
  FF aa 17351 17351 13416 13416   FF aa 17351 17351 13416 13416
  FF aa 17351 17351 13416 13416   FF aa 17351 17351 13416 13416
  FF bb 17351 17351 10961 10961   FF bb 17351 17351 10961 10961
  FF bb 17351 17351 10961 10961   FF bb 17351 17351 10961 10961
  FF bb 17351 17351 10961 10961   FF bb 17351 17351 10961 10961
  GG aa 12883 12883 11954 11954   GG aa 12883 12883 11954 11954
  GG aa 12883 12883 11954 11954   GG aa 12883 12883 11954 11954
  GG bb 12883 12883 11097 11097   GG bb 12883 12883 11097 11097
  GG bb 12883 12883 11097 11097   GG bb 12883 12883 11097 11097
  HH aa 7440 7440 10634 10634   HH aa 7440 7440 10634 10634
  HH aa 7440 7440 10634 10634   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   II aa 3800 3800 6390 6390
  II aa 3800 3800 6390 6390   II bb 3800 3800 3800 3800
  II bb 3800 3800 3800 3800   II bb 3800 3800 3800 3800
  II bb 3800 3800 3800 3800   II bb 3800 3800 3800 3800
  JJ aa {} {} 1786 1786   JJ aa {} {} 1786 1786   JJ aa {} {} 1786 1786
  JJ aa {} {} 1786 1786   JJ bb {} {} {} {}   JJ bb {} {} {} {}
  JJ bb {} {} {} {}   JJ bb {} {} {} {}}

do_execsql_test 1.19.1 {
  SELECT a, b, sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING ) FROM t3 ORDER BY 1, 2, 3;
} {AA aa 40052   AA aa 40052   AA aa 40052   AA aa 40052   AA bb 40052
  AA bb 40052   AA bb 40052   AA bb 40052   BB aa 32712   BB aa 32712
  BB aa 32712   BB aa 32712   BB aa 32712   BB aa 32712   BB bb 32712
  BB bb 32712   BB bb 32712   BB bb 32712   BB bb 32712   BB bb 32712
  CC aa 29590   CC aa 29590   CC aa 29590   CC aa 29590   CC bb 29590
................................................................................
  GG aa 15754   GG aa 15754   GG bb 12883   GG bb 12883   GG bb 12883
  GG bb 12883   HH aa 10634   HH aa 10634   HH aa 10634   HH bb 7440
  HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   HH bb 7440   II aa 6390
  II aa 6390   II bb 3800   II bb 3800   II bb 3800   II bb 3800   II bb 3800
  JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ aa 1786   JJ bb {}   JJ bb {}
  JJ bb {}   JJ bb {}}

do_execsql_test 1.19.8 {
  SELECT a, b, 
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING ),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW),
      sum(c) OVER (ORDER BY a,b  GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING )
    FROM t3 ORDER BY 1, 2, 3;
} {AA aa 40052 40052 42430 42430   AA aa 40052 40052 42430 42430
  AA aa 40052 40052 42430 42430   AA aa 40052 40052 42430 42430
  AA bb 40052 40052 40052 40052   AA bb 40052 40052 40052 40052
  AA bb 40052 40052 40052 40052   AA bb 40052 40052 40052 40052
  BB aa 32712 32712 37179 37179   BB aa 32712 32712 37179 37179
  BB aa 32712 32712 37179 37179   BB aa 32712 32712 37179 37179
  BB aa 32712 32712 37179 37179   BB aa 32712 32712 37179 37179
  BB bb 32712 32712 32712 32712   BB bb 32712 32712 32712 32712
  BB bb 32712 32712 32712 32712   BB bb 32712 32712 32712 32712
  BB bb 32712 32712 32712 32712   BB bb 32712 32712 32712 32712
  CC aa 29590 29590 30758 30758   CC aa 29590 29590 30758 30758
  CC aa 29590 29590 30758 30758   CC aa 29590 29590 30758 30758
  CC bb 29590 29590 29590 29590   CC bb 29590 29590 29590 29590
  DD aa 25558 25558 28265 28265   DD aa 25558 25558 28265 28265
  DD aa 25558 25558 28265 28265   DD bb 25558 25558 25558 25558
  DD bb 25558 25558 25558 25558   DD bb 25558 25558 25558 25558
  DD bb 25558 25558 25558 25558   EE aa 23019 23019 24668 24668
  EE aa 23019 23019 24668 24668   EE bb 23019 23019 23019 23019
  EE bb 23019 23019 23019 23019   EE bb 23019 23019 23019 23019
  FF aa 17351 17351 20856 20856   FF aa 17351 17351 20856 20856
  FF aa 17351 17351 20856 20856   FF aa 17351 17351 20856 20856
  FF bb 17351 17351 17351 17351   FF bb 17351 17351 17351 17351
  FF bb 17351 17351 17351 17351   FF bb 17351 17351 17351 17351
  FF bb 17351 17351 17351 17351   FF bb 17351 17351 17351 17351
  GG aa 12883 12883 15754 15754   GG aa 12883 12883 15754 15754
  GG aa 12883 12883 15754 15754   GG aa 12883 12883 15754 15754
  GG bb 12883 12883 12883 12883   GG bb 12883 12883 12883 12883
  GG bb 12883 12883 12883 12883   GG bb 12883 12883 12883 12883
  HH aa 7440 7440 10634 10634   HH aa 7440 7440 10634 10634
  HH aa 7440 7440 10634 10634   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   HH bb 7440 7440 7440 7440
  HH bb 7440 7440 7440 7440   II aa 3800 3800 6390 6390
  II aa 3800 3800 6390 6390   II bb 3800 3800 3800 3800
  II bb 3800 3800 3800 3800   II bb 3800 3800 3800 3800
  II bb 3800 3800 3800 3800   II bb 3800 3800 3800 3800
  JJ aa {} {} 1786 1786   JJ aa {} {} 1786 1786   JJ aa {} {} 1786 1786
  JJ aa {} {} 1786 1786   JJ bb {} {} {} {}   JJ bb {} {} {} {}
  JJ bb {} {} {} {}   JJ bb {} {} {} {}}

do_execsql_test 2.1.1 {
  SELECT row_number() OVER win 
    FROM t3
    WINDOW win AS (
      ORDER BY c, b, a
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE NO OTHERS 
    )