This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 183478
Collapse All | Expand All

(-)db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java (-3 / +46 lines)
Lines 168-174 Link Here
168
                            state = State.ISA_BACK_SLASH_IN_STRING;
168
                            state = State.ISA_BACK_SLASH_IN_STRING;
169
                            break;
169
                            break;
170
                        case '\'': // NOI18N
170
                        case '\'': // NOI18N
171
                            state = State.ISA_QUOTE_IN_STRING;
172
                            break;
173
                    }
174
                    break;
175
                    
176
               case ISA_QUOTE_IN_STRING:
177
                    switch (actChar) {
178
                        case '\'':
179
                            state = State.ISI_STRING;
180
                            break;
181
                        default:
171
                            state = State.INIT;
182
                            state = State.INIT;
183
                            input.backup(1);
172
                            return factory.createToken(SQLTokenId.STRING);
184
                            return factory.createToken(SQLTokenId.STRING);
173
                    }
185
                    }
174
                    break;
186
                    break;
Lines 184-190 Link Here
184
                    if (startQuoteChar != -1) {
196
                    if (startQuoteChar != -1) {
185
                        if (!isEndIdentifierQuoteChar(startQuoteChar, actChar)) {
197
                        if (!isEndIdentifierQuoteChar(startQuoteChar, actChar)) {
186
                            break;
198
                            break;
199
                        } else {
200
                            if (actChar == '"') {
201
                                state = State.ISA_QUOTE_IN_IDENTIFIER;
202
                                break;
187
                        }
203
                        }
204
                        }
188
                    } else {
205
                    } else {
189
                        if (Character.isLetterOrDigit(actChar) || actChar == '_' || actChar == '#') {
206
                        if (Character.isLetterOrDigit(actChar) || actChar == '_' || actChar == '#') {
190
                            break;
207
                            break;
Lines 196-201 Link Here
196
                    startQuoteChar = -1;
213
                    startQuoteChar = -1;
197
                    return factory.createToken(testKeyword(input.readText()));
214
                    return factory.createToken(testKeyword(input.readText()));
198
215
216
                case ISA_QUOTE_IN_IDENTIFIER:
217
                    switch (actChar) {
218
                        case '"':
219
                            state = State.ISI_IDENTIFIER;
220
                            break;
221
                        default:
222
                            state = State.INIT;
223
                            startQuoteChar = -1;
224
                            input.backup(1);
225
                            return factory.createToken(testKeyword(input.readText()));
226
                    }
227
                    break;
228
                    
199
                // If we are after a slash (/).
229
                // If we are after a slash (/).
200
                case ISA_SLASH:
230
                case ISA_SLASH:
201
                    switch (actChar) {
231
                    switch (actChar) {
Lines 309-321 Link Here
309
        SQLTokenId id = null;
339
        SQLTokenId id = null;
310
        PartType part = PartType.COMPLETE;
340
        PartType part = PartType.COMPLETE;
311
        switch (state) {
341
        switch (state) {
342
            case ISA_QUOTE_IN_STRING:
343
                id = SQLTokenId.STRING;
344
                break;
345
346
            case ISA_QUOTE_IN_IDENTIFIER:
347
                id = SQLTokenId.IDENTIFIER;
348
                break;
349
            
312
            case ISI_WHITESPACE:
350
            case ISI_WHITESPACE:
313
                id = SQLTokenId.WHITESPACE;
351
                id = SQLTokenId.WHITESPACE;
314
                break;
352
                break;
315
353
316
            case ISI_IDENTIFIER:
354
            case ISI_IDENTIFIER:
317
                startQuoteChar = -1;
355
                if(startQuoteChar == -1) {
318
                id = testKeyword(input.readText());
356
                id = testKeyword(input.readText());
357
                } else {
358
                    id = SQLTokenId.INCOMPLETE_IDENTIFIER;
359
                }
319
                break;
360
                break;
320
361
321
            case ISI_LINE_COMMENT:
362
            case ISI_LINE_COMMENT:
Lines 397-403 Link Here
397
    }
438
    }
398
439
399
    public static boolean isEndIdentifierQuoteChar(int start, int end) {
440
    public static boolean isEndIdentifierQuoteChar(int start, int end) {
400
        return end == getMatchingQuote(start);
441
        return isStartIdentifierQuoteChar(start) && end == getMatchingQuote(start);
401
    }
442
    }
402
443
403
    private static SQLTokenId testKeyword(CharSequence value) {
444
    private static SQLTokenId testKeyword(CharSequence value) {
Lines 425-430 Link Here
425
        ISI_INT, // integer number
466
        ISI_INT, // integer number
426
        ISI_DOUBLE, // double number
467
        ISI_DOUBLE, // double number
427
        ISA_DOT, // after '.'
468
        ISA_DOT, // after '.'
428
        ISA_BACK_SLASH_IN_STRING // after \ in string
469
        ISA_BACK_SLASH_IN_STRING, // after \ in string
470
        ISA_QUOTE_IN_STRING,        // encountered quote in string - could be sql99 escape
471
        ISA_QUOTE_IN_IDENTIFIER     // encountered quote in identifier - could be sql99 escape
429
    }
472
    }
430
}
473
}
(-)db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLTokenId.java (+1 lines)
Lines 66-71 Link Here
66
    BLOCK_COMMENT("sql-block-comment"), // NOI18N
66
    BLOCK_COMMENT("sql-block-comment"), // NOI18N
67
    STRING("sql-string-literal"), // NOI18N
67
    STRING("sql-string-literal"), // NOI18N
68
    INCOMPLETE_STRING("sql-errors"), // NOI18N
68
    INCOMPLETE_STRING("sql-errors"), // NOI18N
69
    INCOMPLETE_IDENTIFIER("sql-errors"), // NOI18N
69
    IDENTIFIER("sql-identifier"), // NOI18N
70
    IDENTIFIER("sql-identifier"), // NOI18N
70
    OPERATOR("sql-operator"), // NOI18N
71
    OPERATOR("sql-operator"), // NOI18N
71
    LPAREN("sql-operator"), // NOI18N
72
    LPAREN("sql-operator"), // NOI18N
(-)db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java (+41 lines)
Lines 80-85 Link Here
80
                SQLTokenId.WHITESPACE);
80
                SQLTokenId.WHITESPACE);
81
    }
81
    }
82
82
83
    public void testSimpleSQL99Quoting() throws Exception {
84
        TokenSequence<SQLTokenId> seq = getTokenSequence("select -/ from 'a''' + 1, dto");
85
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, SQLTokenId.OPERATOR,
86
                SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.KEYWORD,
87
                SQLTokenId.WHITESPACE, SQLTokenId.STRING, SQLTokenId.WHITESPACE,
88
                SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.INT_LITERAL,
89
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
90
                SQLTokenId.WHITESPACE);
91
        
92
    }
93
94
    public void testQuotedIdentifiersSQL99Quote() throws Exception {
95
        TokenSequence<SQLTokenId> seq = getTokenSequence("select \"\"\"derby\", `mysql`, [mssql], `quo + ted`");
96
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
97
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
98
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
99
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
100
                SQLTokenId.WHITESPACE);
101
    }
102
    
103
    public void testIncompleteIdentifier() throws Exception {
104
        TokenSequence<SQLTokenId> seq = getTokenSequence("select \"\"\"derby\", `mysql`, [mssql], `quo + ted");
105
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
106
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
107
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
108
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.INCOMPLETE_IDENTIFIER);
109
        seq = getTokenSequence("select \"\"\"derby\", `mysql`, [mssql");
110
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
111
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
112
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.INCOMPLETE_IDENTIFIER);
113
        seq = getTokenSequence("select \"\"\"derby\", `mysql`, [mssql]");
114
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
115
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
116
                SQLTokenId.COMMA, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER,
117
                SQLTokenId.WHITESPACE);
118
        seq = getTokenSequence("select \"\"\"derby");
119
        assertTokens(seq, SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, 
120
                SQLTokenId.INCOMPLETE_IDENTIFIER);
121
122
    }
123
   
83
    public void testComments() throws Exception {
124
    public void testComments() throws Exception {
84
        TokenSequence<SQLTokenId> seq = getTokenSequence("-- line comment\n# mysql comment\n/* block \ncomment*/\n#notComment");
125
        TokenSequence<SQLTokenId> seq = getTokenSequence("-- line comment\n# mysql comment\n/* block \ncomment*/\n#notComment");
85
        assertTokens(seq, SQLTokenId.LINE_COMMENT, SQLTokenId.LINE_COMMENT,
126
        assertTokens(seq, SQLTokenId.LINE_COMMENT, SQLTokenId.LINE_COMMENT,

Return to bug 183478