{"record":{"id":"b14ad70e542958be","repo":"greenrobot/greenDAO","slug":"illegal-parameter-index","errorCode":null,"errorMessage":"Illegal parameter index: ","messagePattern":"Illegal parameter index: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"DaoCore/src/main/java/org/greenrobot/greendao/query/AbstractQueryWithLimit.java","lineNumber":44,"sourceCode":"// TODO Query for PKs/ROW IDs\nabstract class AbstractQueryWithLimit<T> extends AbstractQuery<T> {\n    protected final int limitPosition;\n    protected final int offsetPosition;\n\n    protected AbstractQueryWithLimit(AbstractDao<T, ?> dao, String sql, String[] initialValues, int limitPosition,\n                                     int offsetPosition) {\n        super(dao, sql, initialValues);\n        this.limitPosition = limitPosition;\n        this.offsetPosition = offsetPosition;\n    }\n\n    /**\n     * Sets the parameter (0 based) using the position in which it was added during building the query. Note: all\n     * standard WHERE parameters come first. After that come the WHERE parameters of joins (if any).\n     */\n    public AbstractQueryWithLimit<T> setParameter(int index, Object parameter) {\n        if (index >= 0 && (index == limitPosition || index == offsetPosition)) {\n            throw new IllegalArgumentException(\"Illegal parameter index: \" + index);\n        }\n        return (AbstractQueryWithLimit<T>) super.setParameter(index, parameter);\n    }\n\n    /**\n     * Sets the limit of the maximum number of results returned by this Query. {@link\n     * org.greenrobot.greendao.query.QueryBuilder#limit(int)} must\n     * have been called on the QueryBuilder that created this Query object.\n     */\n    public void setLimit(int limit) {\n        checkThread();\n        if (limitPosition == -1) {\n            throw new IllegalStateException(\"Limit must be set with QueryBuilder before it can be used here\");\n        }\n        parameters[limitPosition] = Integer.toString(limit);\n    }\n\n    /**","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/greenrobot/greenDAO/blob/0bbb338e17c4cf28aba5aae62d42f73f50186157/DaoCore/src/main/java/org/greenrobot/greendao/query/AbstractQueryWithLimit.java#L26-L62","documentation":"Query objects built with QueryBuilder.limit()/offset() reserve special parameter positions for LIMIT/OFFSET. setParameter(index) throws IllegalArgumentException when the given index targets the reserved limit or offset position, since those slots hold SQL limit/offset values, not WHERE parameters.","triggerScenarios":"Calling query.setParameter(limitPosition, ...) or setParameter(offsetPosition, ...), e.g. assuming indexes cover all parameters including limit/offset added via QueryBuilder.limit()/offset().","commonSituations":"Iterating over a parameter count that includes limit/offset slots; reusing a generic parameter-binding helper against a query built with limit/offset.","solutions":["Skip the limit/offset positions when binding WHERE parameters; only bind indexes below the WHERE parameter count","Use setLimit(int)/setOffset(int) to change limit/offset values instead of setParameter","Check AbstractQueryWithLimit's limitPosition/offsetPosition (or count only WHERE parameters) before binding"],"exampleFix":"// before\nfor (int i = 0; i < parameters.length; i++) { query.setParameter(i, values[i]); } // may hit limit position\n// after\nfor (int i = 0; i < whereParameterCount; i++) { query.setParameter(i, values[i]); }\nquery.setLimit(20);","handlingStrategy":"validation","validationCode":"if (index == limitPosition || index == offsetPosition) {\n    throw new IllegalArgumentException(\"index \" + index + \" is reserved for LIMIT/OFFSET\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    query.setParameter(index, value);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Illegal parameter index\")) {\n        // adjust index mapping to exclude limit/offset slots\n    }\n}","preventionTips":["Track the WHERE-parameter count separately from limit/offset positions","Use setLimit/setOffset instead of setParameter for those values","Don't iterate over raw parameter arrays including reserved slots"],"tags":["greendao","orm","query","parameters"],"backgroundTag":"invalid-argument-value","analyzedSha":"0bbb338e17c4cf28aba5aae62d42f73f50186157","analyzedAt":"2026-09-08T03:22:36.050Z","contentChangedAt":"2026-09-08T03:22:36.050Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}