Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

exportToJson fails when CREATE TABLE statement contains nested parentheses

Aperta
#690 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
68/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
android, java, sqlite
Ambito
databases

Direzione di ricerca

Inizia in ExportToJson.java, intorno all’helper modEmbeddedParentheses() usato da exportToJson('full'), e riproduci il malfunzionamento con l’istruzione CREATE TABLE di budgets fornita, che contiene parentesi annidate e allo stesso livello. Traccia le posizioni raccolte delle parentesi aperte e chiuse; il lavoro è concluso quando l’esportazione Android viene completata correttamente per questi schemi senza la StringIndexOutOfBoundsException segnalata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug/fix needs: triage

Plugin version:
capacitor-community/[email protected]

Platform(s):
Android

Current behavior:

exportToJson('full', false); fails when CREATE TABLE statement contains nested parentheses

e.g if this statements are used, export fails

CHECK (isDisabled IN (0, 1))

CHECK (endDate IS NULL OR date(endDate) >= date(startDate))

CHECK ( (isRecurring = 1 AND recurrenceIntervalType IS NOT NULL AND recurrenceIntervalValue IS NOT NULL) OR
                   (isRecurring = 0 AND recurrenceIntervalType IS NULL AND recurrenceIntervalValue IS NULL) ),

Changing those to those below works as workaround, export finishes:

CHECK (isDisabled = 0 OR isDisabled = 1)

CHECK (endDate IS NULL OR endDate >= startDate)

CHECK (isRecurring = 1 AND recurrenceIntervalType IS NOT NULL AND recurrenceIntervalValue IS NOT NULL
                  OR isRecurring = 0 AND recurrenceIntervalType IS NULL AND recurrenceIntervalValue IS NULL),

Exact error messages from android:

Error: exportToJson CreateExportObject: GetTablesFull: begin 919, end 831, length 1121
2026-04-28 23:41:51.380 8687-8752 com.getcap...RetHandler com.myapp.app V *** ERROR ExportToJson: ExportToJson CreateExportObject: GetTablesFull: begin 919, end 831, length 1121
2026-04-28 23:41:51.380 8687-8752 Capacitor com.myapp.app D Sending plugin error: {"save":false,"callbackId":"14032160","pluginId":"CapacitorSQLite","methodName":"exportToJson","success":false,"error":{"message":"ExportToJson: ExportToJson CreateExportObject: GetTablesFull: begin 919, end 831, length 1121"}}
2026-04-28 23:41:51.380 8687-8687 Capacitor/Console com.myapp.app E File: - Line 330 - Msg: [object Object]
2026-04-28 23:41:51.382 8687-8687 Capacitor/Console com.myapp.app E File: https://localhost/settings - Line 961 - Msg: Uncaught (in promise) Error: ExportToJson: ExportToJson CreateExportObject: GetTablesFull: begin 919, end 831, length 1121

Expected behavior:

Export completed without problems.

Steps to reproduce:

Run statement containing nested parentheses and run exportToJson('full')

`CREATE TABLE budgets
         (
           id                        INTEGER PRIMARY KEY AUTOINCREMENT,
           name                      TEXT    NOT NULL,
           amount                    REAL    NOT NULL,
           startDate                 TEXT    NOT NULL,
           endDate                   TEXT    NULL,
           isRecurring               BOOLEAN NOT NULL DEFAULT 0,
           recurrenceIntervalType    TEXT    NULL,
           recurrenceIntervalValue   INTEGER NULL,
           warnNotifThresholdPercent INTEGER NOT NULL DEFAULT 80,
           CHECK (isRecurring IN (0, 1)),
           CHECK ( (isRecurring = 1 AND recurrenceIntervalType IS NOT NULL AND recurrenceIntervalValue IS NOT NULL) OR
                   (isRecurring = 0 AND recurrenceIntervalType IS NULL AND recurrenceIntervalValue IS NULL) ),
           CHECK (recurrenceIntervalType IN ('days', 'weeks', 'months', 'years') OR recurrenceIntervalType IS NULL),
           CHECK (endDate IS NULL OR date(endDate) >= date(startDate))
         );`

Other information:
Claude sonnet analysis of the problem:

The Android plugin's modEmbeddedParentheses() helper in ExportToJson.java iterates through the ( and ) positions it collected from the CREATE TABLE body. When it detects a nested pair (oPars[i+1] < cPars[i]), it advances i inside the loop and the loop advances it again, putting it out of sync. It then tries to fill the "gap" between the two inner groups with substring(cPars[i], oPars[i+1]-1).
For CHECK ( (expr_A) OR (expr_B) ) the inner i points to the close of expr_B (later in string) while i+1 points to the open of expr_B (earlier in string) → begin > end → StringIndexOutOfBoundsException: begin 919, end 831, length 1121.

Or from other prompt

The crash comes from ExportToJson.java (line ~290) inside the modEmbeddedParentheses() helper, which is called for every CREATE TABLE schema during exportToJson('full').
The helper collects all ( positions into oPars and all ) positions into cPars and then tries to pair them up in a single loop. The pairing logic has a flaw: when a table has sibling nested parentheses — i.e., two (or more) inner groups at the same depth — it advances i inside the loop body and outside it, so the "gap between groups" substring is computed as substring(cPars[i], oPars[i+1] - 1) where cPars[i] ends up greater than oPars[i+1] - 1. That triggers Java's StringIndexOutOfBoundsException: begin N, end M, length L.

Capacitor doctor:


💊   Capacitor Doctor  💊 

Latest Dependencies:

  @capacitor/cli: 8.3.1
  @capacitor/core: 8.3.1
  @capacitor/android: 8.3.1
  @capacitor/ios: 8.3.1

Installed Dependencies:

  @capacitor/ios: not installed
  @capacitor/cli: 8.3.1
  @capacitor/core: 8.3.1
  @capacitor/android: 8.3.1

[success] Android looking great! 👌

Lingua principale
Swift
Stelle
661
Fork
158
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di capacitor-community/sqlite

Tutte le issue di capacitor-community/sqlite

Issue simili

Altre issue su Swift

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.