@@ -476,15 +476,15 @@ bool Expr_parser_base::parse_schema_ident(Token::Type (*types)[2])
476
476
}
477
477
478
478
479
- void Expr_parser_base::parse_column_ident (Path_prc *prc)
479
+ void Expr_parser_base::parse_column_ident (Processor *prc)
480
480
{
481
481
if (!parse_schema_ident ())
482
482
parse_error (" Expected a column identifier" );
483
483
parse_column_ident1 (prc);
484
484
}
485
485
486
486
487
- void Expr_parser_base::parse_column_ident1 (Path_prc *prc)
487
+ void Expr_parser_base::parse_column_ident1 (Processor *prc)
488
488
{
489
489
/*
490
490
Note: at this point we assume that an (possibly schema qualified) identifier
@@ -512,8 +512,27 @@ void Expr_parser_base::parse_column_ident1(Path_prc *prc)
512
512
m_col_ref.set (table->name ());
513
513
}
514
514
515
- if (consume_token (Token::ARROW) || consume_token (Token::ARROW2))
515
+ auto t = peek_token ();
516
+
517
+ Safe_prc<Processor> sprc (prc);
518
+
519
+ if (t && (t->get_type () == Token::ARROW || t->get_type () == Token::ARROW2))
516
520
{
521
+ Safe_prc<cdk::Expr_processor::Args_prc> args = nullptr ;
522
+ if (t->get_type () == Token::ARROW2)
523
+ {
524
+ Table_ref json_unquote;
525
+ json_unquote.set (" JSON_UNQUOTE" );
526
+ args =sprc->scalar ()->call (json_unquote);
527
+ args->list_begin ();
528
+ // Will override previous processor, so from now on, this will be the one
529
+ // used
530
+ sprc = args->list_el ();
531
+ }
532
+
533
+ consume_token ();
534
+
535
+ cdk::Doc_path_storage path;
517
536
518
537
if (Token_base::cur_token_type_in ({ Token::QSTRING, Token::QQSTRING }))
519
538
{
@@ -522,16 +541,23 @@ void Expr_parser_base::parse_column_ident1(Path_prc *prc)
522
541
It last = toks.end ();
523
542
Expr_parser_base path_parser (first, last, m_parser_mode);
524
543
// TODO: Translate parse errors
525
- path_parser.parse_document_field (prc , true );
544
+ path_parser.parse_document_field (&path , true );
526
545
if (first != last)
527
546
parse_error (" Unexpected characters in a quoted path component" );
528
547
}
529
548
else
530
549
{
531
- parse_document_field (prc , true );
550
+ parse_document_field (&path , true );
532
551
}
533
- }
534
552
553
+ sprc->scalar ()->ref (m_col_ref,&path);
554
+
555
+ args->list_end ();
556
+ }
557
+ else
558
+ {
559
+ sprc->scalar ()->ref (m_col_ref,nullptr );
560
+ }
535
561
}
536
562
537
563
@@ -1108,13 +1134,13 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1108
1134
if (!prc)
1109
1135
prc = stored.reset (new Stored_any ());
1110
1136
1111
- Safe_prc<Processor::Scalar_prc > sprc (prc-> scalar () );
1137
+ Safe_prc<Processor> sprc (prc);
1112
1138
1113
1139
// parameters, nullary operators, CAST
1114
1140
1115
1141
if (consume_token (Token::COLON))
1116
1142
{
1117
- sprc->param (consume_token_throw (
1143
+ sprc->scalar ()-> param (consume_token_throw (
1118
1144
Token::WORD,
1119
1145
" Expected parameter name after ':'"
1120
1146
).get_text ());
@@ -1123,12 +1149,12 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1123
1149
1124
1150
if (consume_token (Op::STAR))
1125
1151
{
1126
- sprc->op (Op::name (Op::STAR));
1152
+ sprc->scalar ()-> op (Op::name (Op::STAR));
1127
1153
// NOTE: arguments processor is ignored as there are no arguments
1128
1154
return stored.release ();
1129
1155
}
1130
1156
1131
- if (parse_cast (sprc ))
1157
+ if (parse_cast (prc-> scalar () ))
1132
1158
{
1133
1159
return stored.release ();
1134
1160
}
@@ -1153,21 +1179,21 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1153
1179
break ;
1154
1180
}
1155
1181
// otherwise report as unary operator
1156
- argsp = sprc->op (Op::name (op));
1182
+ argsp = sprc->scalar ()-> op (Op::name (op));
1157
1183
break ;
1158
1184
}
1159
1185
1160
1186
case Op::NEG:
1161
1187
consume_token ();
1162
- argsp = sprc->op (Op::name (Op::NEG));
1188
+ argsp = sprc->scalar ()-> op (Op::name (Op::NEG));
1163
1189
break ;
1164
1190
case Op::NOT:
1165
1191
consume_token ();
1166
- argsp = sprc->op (Op::name (Op::NOT));
1192
+ argsp = sprc->scalar ()-> op (Op::name (Op::NOT));
1167
1193
break ;
1168
1194
case Op::BITNEG:
1169
1195
consume_token ();
1170
- argsp = sprc->op (Op::name (Op::BITNEG));
1196
+ argsp = sprc->scalar ()-> op (Op::name (Op::BITNEG));
1171
1197
break ;
1172
1198
1173
1199
default :
@@ -1195,13 +1221,13 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1195
1221
{
1196
1222
1197
1223
case Keyword::L_NULL:
1198
- sprc->val ()->null ();
1224
+ sprc->scalar ()-> val ()->null ();
1199
1225
consume_token ();
1200
1226
return stored.release ();
1201
1227
1202
1228
case Keyword::L_TRUE:
1203
1229
case Keyword::L_FALSE:
1204
- sprc->val ()->yesno (Keyword::L_TRUE == kw);
1230
+ sprc->scalar ()-> val ()->yesno (Keyword::L_TRUE == kw);
1205
1231
consume_token ();
1206
1232
return stored.release ();
1207
1233
@@ -1219,44 +1245,44 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1219
1245
case Token::QSTRING:
1220
1246
if (m_strings_as_blobs)
1221
1247
{
1222
- sprc->val ()->value (
1248
+ sprc->scalar ()-> val ()->value (
1223
1249
cdk::TYPE_BYTES, Format_info (), consume_token ()->get_bytes ()
1224
1250
);
1225
1251
}
1226
1252
else
1227
- sprc->val ()->str (consume_token ()->get_text ());
1253
+ sprc->scalar ()-> val ()->str (consume_token ()->get_text ());
1228
1254
return stored.release ();
1229
1255
1230
1256
case Token::NUMBER:
1231
1257
{
1232
1258
double val = strtod (consume_token ()->get_utf8 ());
1233
- sprc->val ()->num (neg ? -val : val);
1259
+ sprc->scalar ()-> val ()->num (neg ? -val : val);
1234
1260
return stored.release ();
1235
1261
}
1236
1262
1237
1263
case Token::INTEGER:
1238
1264
if (neg)
1239
1265
{
1240
1266
int64_t val = strtoi (consume_token ()->get_utf8 ());
1241
- sprc->val ()->num (-val);
1267
+ sprc->scalar ()-> val ()->num (-val);
1242
1268
}
1243
1269
else
1244
1270
{
1245
1271
uint64_t val = strtoui (consume_token ()->get_utf8 ());
1246
- sprc->val ()->num (val);
1272
+ sprc->scalar ()-> val ()->num (val);
1247
1273
}
1248
1274
return stored.release ();
1249
1275
1250
1276
case Token::HEX:
1251
1277
if (neg)
1252
1278
{
1253
1279
int64_t val = strtoi (consume_token ()->get_utf8 (), 16 );
1254
- sprc->val ()->num (-val);
1280
+ sprc->scalar ()-> val ()->num (-val);
1255
1281
}
1256
1282
else
1257
1283
{
1258
1284
uint64_t val = strtoui (consume_token ()->get_utf8 (), 16 );
1259
- sprc->val ()->num (val);
1285
+ sprc->scalar ()-> val ()->num (val);
1260
1286
}
1261
1287
return stored.release ();
1262
1288
@@ -1315,7 +1341,7 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1315
1341
{
1316
1342
assert (m_col_ref.table ());
1317
1343
1318
- if (parse_function_call (*m_col_ref.table (), sprc))
1344
+ if (parse_function_call (*m_col_ref.table (), sprc. scalar () ))
1319
1345
return stored.release ();
1320
1346
}
1321
1347
@@ -1324,8 +1350,6 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1324
1350
a column identifier, possibly followed by a path (in TABLE mode).
1325
1351
*/
1326
1352
1327
- cdk::Doc_path_storage path;
1328
-
1329
1353
if (Parser_mode::TABLE == m_parser_mode)
1330
1354
{
1331
1355
/*
@@ -1341,8 +1365,8 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1341
1365
the processor.
1342
1366
*/
1343
1367
1344
- parse_column_ident1 (&path );
1345
- sprc-> ref (m_col_ref, path. is_empty () ? NULL : &path);
1368
+ parse_column_ident1 (prc );
1369
+
1346
1370
return stored.release ();
1347
1371
}
1348
1372
@@ -1363,6 +1387,8 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1363
1387
field.
1364
1388
*/
1365
1389
1390
+ cdk::Doc_path_storage path;
1391
+
1366
1392
if (m_col_ref.table () && m_col_ref.table ()->schema ())
1367
1393
{
1368
1394
parse_document_field (
@@ -1380,7 +1406,7 @@ Expression* Expr_parser_base::parse_atomic(Processor *prc)
1380
1406
parse_document_field (&path, true );
1381
1407
}
1382
1408
1383
- sprc->ref (path);
1409
+ sprc->scalar ()-> ref (path);
1384
1410
1385
1411
return stored.release ();
1386
1412
}
0 commit comments