--- parser3/src/classes/table.C 2012/06/08 11:44:02 1.288 +++ parser3/src/classes/table.C 2013/02/21 04:27:12 1.291 @@ -21,7 +21,7 @@ #include "pa_vbool.h" #include "pa_array.h" -volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.288 2012/06/08 11:44:02 misha Exp $"; +volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.291 2013/02/21 04:27:12 moko Exp $"; // class @@ -268,20 +268,24 @@ static lsplit_result lsplit(char** strin char *write; write=read=string; char c; - while((c=*read++)) { + // we are enclosed, searching for second encloser + while(c=*read++) { if(c==encloser) { - char n=*read; - if(n==encloser) // double-encloser stands for encloser + if(*read==encloser) // double-encloser stands for encloser read++; - else if(n==delim1 || n==delim2) { - result.delim=n; - read++; - break; - } + else + break; // note: skipping encloser } - *write++=c; } + // we are no longer enclosed, searching for delimiter, skipping extra enclosers + while(c=*read++) { + if(c==delim1 || c==delim2) { + result.delim=c; + break; + } else if(c!=encloser) + *write++=c; + } *write=0; // terminate *string_ref=c? read: 0; result.piece=string; @@ -766,7 +770,7 @@ static void _hash(Request& r, MethodPara Table2hash_value_type value_type=C_HASH; int param_index=params.count()-1; if(param_index>0) { - if(HashStringValue* options=params.as_hash(param_index)){ // options where specified + if(HashStringValue* options=params.as_no_junction(param_index, PARAM_MUST_NOT_BE_CODE).get_hash()){ // can't use .as_has because the 2nd param could be table so .as_hash throws an error --param_index; int valid_options=0; if(Value* vdistinct_code=options->get(sql_distinct_name)) { // $.distinct ? @@ -801,6 +805,9 @@ static void _hash(Request& r, MethodPara } } + if(param_index==2) // options was specified but not as hash + throw Exception(PARSER_RUNTIME, 0, "options must be hash"); + Array value_fields; if(param_index==0){ // list of columns wasn't specified if(value_type==C_STRING) // $.type[string] @@ -973,7 +980,7 @@ static bool _locate_name_value(Table& ta static void _locate(Request& r, MethodParams& params) { Table& table=GET_SELF(r, VTable).table(); - bool result=params[0].get_junction()? + bool result=params[0].get_junction() || (params.count() == 1) ? _locate_expression(table, r, params) : _locate_name_value(table, r, params); r.write_no_lang(VBool::get(result));