Check that a field is named only once in INSERT or UPDATE statements.
| 10065 | |
| 10066 | // Check that a field is named only once in INSERT or UPDATE statements. |
| 10067 | static void dsqlFieldAppearsOnce(const Array<NestConst<ValueExprNode> >& values, const char* command) |
| 10068 | { |
| 10069 | for (FB_SIZE_T i = 0; i < values.getCount(); ++i) |
| 10070 | { |
| 10071 | const FieldNode* field1 = nodeAs<FieldNode>(values[i]); |
| 10072 | if (!field1) |
| 10073 | continue; |
| 10074 | |
| 10075 | const MetaName& name1 = field1->dsqlField->fld_name; |
| 10076 | |
| 10077 | for (FB_SIZE_T j = i + 1; j < values.getCount(); ++j) |
| 10078 | { |
| 10079 | const FieldNode* field2 = nodeAs<FieldNode>(values[j]); |
| 10080 | if (!field2) |
| 10081 | continue; |
| 10082 | |
| 10083 | const MetaName& name2 = field2->dsqlField->fld_name; |
| 10084 | |
| 10085 | if (name1 == name2) |
| 10086 | { |
| 10087 | string str = field1->dsqlContext->ctx_relation->rel_name.c_str(); |
| 10088 | str += "."; |
| 10089 | str += name1.c_str(); |
| 10090 | |
| 10091 | //// FIXME: line/column is not very accurate for MERGE ... INSERT. |
| 10092 | ERRD_post( |
| 10093 | Arg::Gds(isc_sqlerr) << Arg::Num(-206) << |
| 10094 | Arg::Gds(isc_dsql_no_dup_name) << str << command << |
| 10095 | Arg::Gds(isc_dsql_line_col_error) << |
| 10096 | Arg::Num(values[j]->line) << Arg::Num(values[j]->column)); |
| 10097 | } |
| 10098 | } |
| 10099 | } |
| 10100 | } |
| 10101 | |
| 10102 | static ValueListNode* dsqlPassArray(DsqlCompilerScratch* dsqlScratch, ValueListNode* input) |
| 10103 | { |