예제 #1
0
void AmendColumnWalker::MutableVisit(Expr *io_expr)
{
	switch (io_expr->GetExprType())
	{
	case Expr::kExprColumnRef:
		{
			Status result;

			ColumnExpr *pColExpr = dynamic_cast<ColumnExpr *>(io_expr);

			PDASSERT(pColExpr);

			if (pColExpr)
			{
				ColumnQualifiedName qualifiedName = pColExpr->GetQualifiedColumnName();
				if (qualifiedName.tableName.empty())
				{
					bool hasMatch = false;
					std::string ownedTableName;
					TableAndColumnSetMap::const_iterator setIter = mTableAndColumnSetMap.begin();

					for (; setIter != mTableAndColumnSetMap.end(); setIter++)
					{
						ColumnNameSet::const_iterator columnIter = setIter->second.begin();

						for (; columnIter != setIter->second.end(); columnIter++)
						{
							if (*columnIter == qualifiedName.columnName)
							{
								if (hasMatch)
								{
									result = Status::kAmbiguousColumn;
									break;
								}
								else
								{
									ownedTableName = setIter->first;
									hasMatch = true;
								}
							}
						}
					}

					if (result.OK())
					{
						if (hasMatch)
						{
							qualifiedName.tableName = ownedTableName;
							pColExpr->SetQualifiedColumnName(qualifiedName);
						}
					}
				}
			}
			break;
		}
	default:
		break;
	}
}