예제 #1
0
파일: glue.c 프로젝트: att/uwin
/*
 * The rvalue of an equation is a string.  Set values and return.
 */
char *
expr_STRING(char *st, char *cs, int CompoundString)
{
    char s[256];
    int i;
    FontSet *fs = (FontSet *) cs;
    char *FontName = NULL;

    if (fs)
    {
	FontName = fs->fontset.name;
    }

    for (i = 0; *st; i++)
    {
	if ('\\' == *st)
	{
	    st++;
	    while (*st && isdigit(*st))
	    {
		s[i] = s[i] * 10 + *st++ - '0';
	    }

	    if (*st != '\\')
	    {
		__MrmExit(LOC, "String ERROR\n");
	    }
	    st++;
	}
	else
	{
	    s[i] = *st++;
	}
    }

    s[i] = 0;
    st = s;

    if (CompoundString)
    {
	return (char *)CStringNew(st, FontName, 0, 0);
    }
    else
    {
	StripQuotes(st);

	return (char *)CStringNew(st, FontName, 0, 0);
    }
}
예제 #2
0
파일: glue.c 프로젝트: att/uwin
char *
expr_STRING_Compound(char *st, int Separate, int IsAddress)
{
    if (!IsAddress)
    {
	StripQuotes(st);
    }

    return (char *)CStringNew(st, NULL, IsAddress, Separate);
}
예제 #3
0
void gsp_addJoinItem(gsp_sqlparser *parser, gsp_selectStatement* select, char* text){
	if(select!=NULL && select->fromTableList!=NULL){
		gsp_list *items = select->fromTableList;

		gsp_fromTable *item = (gsp_fromTable *)malloc(sizeof(gsp_fromTable));
		gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell));
		gsp_fromTable *lastItem = NULL;
		gsp_listcell *lastCell = NULL;
		gsp_sourcetoken *endToken = NULL;
		gsp_sourcetoken *fromToken = NULL;

		CString* content = CStringNew();
		
		collectMallocMemroy(parser,item);
		collectMallocMemroy(parser, cell);

		fromToken = gsp_getSelectFromToken(select);

		if(select->fromTableList->length>0){
			lastItem = (gsp_fromTable *)gsp_list_last(items);
			lastCell = items->tail;
			endToken = lastItem->fragment.endToken;
		}
		else{
			if(fromToken!=NULL)
				endToken = fromToken;
			else if(select->resultColumnList!=NULL && select->resultColumnList->length>0){
				endToken = (gsp_list_last(select->resultColumnList))->fragment.endToken;
			}
			else{
				endToken = select->selectToken;
			}
		} 

		if(select->fromTableList->length>0)
			CStringAppend(content, "," );
		else if(fromToken == NULL){
			if(startsWithIgnoreCase(trimString(text), "FROM")){
				CStringAppend(content, " " );
			}
			else CStringAppend(content, " FROM " );
		}
		else 
			CStringAppend(content, " " );
		CStringAppend(content, text );

		collectMallocMemroy(parser, content->buffer);

		cell->node = (gsp_node*)item;
		if(lastCell!=NULL){
			cell->pNext = lastCell->pNext;
			cell->pPrev = lastCell->pPrev;
			cell->nodeType = lastCell->nodeType;
		}
		else{
			cell->pPrev = (gsp_node*)select->fromTableList;
			cell->pNext = NULL;
			cell->nodeType = t_gsp_listcell;
		}
		cell->fragment.startToken = NULL;
		cell->fragment.endToken = NULL;
		cell->fragment.text = NULL;

		cell->nextCell = NULL;
		if(lastCell!=NULL){
			lastCell->nextCell = cell;
		}
		else{
			items->head = cell;
		}
		items->tail = cell;
		items->length+=1;
		item->pNext = NULL;
		item->pPrev = NULL;
		item->aliasClause = NULL;
		item->tableExpr = NULL;
		item->functionCall = NULL;
		item->joinExpr = NULL;
		item->aliasClause = NULL;
		item->fromtableType = ets_objectname;
		item->nodeType = t_gsp_join;
		item->fragment.startToken = NULL;
		item->fragment.endToken = NULL;
		item->fragment.text = NULL;

		gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE);		
		adjustNodeTokensPosition((gsp_node*)item, endToken);

		if(lastItem!=NULL){
			item->pPrev = (gsp_node *)lastItem;
			item->pNext = lastItem->pNext;
			lastItem->pNext = (gsp_node*)item;
			if(item->pNext!=NULL)
				item->pNext->pPrev = (gsp_node*)item;
		}
		{
			gsp_node *currentNode = (gsp_node*)select->fromTableList;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_join 
						|| node->nodeType == t_gsp_objectname
						|| node->nodeType == t_gsp_functionCall
						|| node->nodeType == t_gsp_fromTable
						|| node->nodeType == t_gsp_table
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_join 
						|| node->nodeType == t_gsp_objectname
						|| node->nodeType == t_gsp_functionCall
						|| node->nodeType == t_gsp_fromTable
						|| node->nodeType == t_gsp_table
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}
		}

		CStringDeleteWithoutBuffer(content);
	}
}
예제 #4
0
void gsp_addWhereClause( gsp_sqlparser *parser, gsp_base_statement* stmt, char* text )
{
	gsp_selectStatement* select = NULL;
	gsp_updateStatement* update = NULL;
	gsp_deleteStatement* deleteStmt = NULL;
	gsp_whereClause *whereClause = NULL;

	if(stmt->nodeType == t_gsp_selectStatement){
		select = (gsp_selectStatement*)stmt;
		whereClause = select->whereCondition;
	}
	else if(stmt->nodeType == t_gsp_updateStatement){
		update = (gsp_updateStatement*)stmt;
		whereClause = update->whereCondition;
	}
	else if(stmt->nodeType == t_gsp_deleteStatement){
		deleteStmt = (gsp_deleteStatement*)stmt;
		whereClause = deleteStmt->whereCondition;
	}

	if(whereClause!=NULL && whereClause->condition!=NULL){
		gsp_expr *expr = whereClause->condition;
		int startPos = gsp_getNodeStartToken((gsp_node*)expr)->nPosInList;
		int endPos = gsp_getNodeEndToken((gsp_node*)expr)->nPosInList;
		gsp_sourcetoken* endToken = expr->fragment.endToken;
		CString* content = CStringNew();
		char* exprText = gsp_getNodeText((gsp_node*)whereClause->condition);
		CStringAppend(content, exprText);
		if(endsWithIgnoreCase(exprText, " ") || endsWithIgnoreCase(exprText, "\n") || endsWithIgnoreCase(exprText, "\t")){
			CStringAppend(content, "AND " );
		}
		else{
			CStringAppend(content, " AND " );
		}
		CStringAppend(content, text );

		gsp_setNodeText(parser, (gsp_node*)whereClause->condition, content->buffer, FALSE);

		{
			gsp_node *currentNode = (gsp_node*)expr;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInNodeRange(node, startPos, endPos)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = expr->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInNodeRange(node, startPos, endPos)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = expr->fragment.endToken;
				}
				node = temp;
			}
		}
		CStringDeleteWithoutBuffer(content);
	}
	else{
		gsp_sourcetoken *endToken = NULL;
		gsp_node* currentNode = NULL;
		CString* content = CStringNew();
		BOOL isEndTerminate = FALSE;

		if(!startsWithIgnoreCase(trimString(text), "WHERE ")){
			CStringAppend(content, " WHERE ");
		}
		else
			CStringAppend(content, " ");
		CStringAppend(content, text);

		whereClause = (gsp_whereClause *)malloc(sizeof(gsp_whereClause));
		whereClause->nodeType = t_gsp_whereClause;
		whereClause->fragment.startToken = NULL;
		whereClause->fragment.endToken = NULL;
		whereClause->fragment.text = NULL;
		whereClause->condition = NULL;
		whereClause->pNext = NULL;
		whereClause->pPrev = NULL;

		collectMallocMemroy(parser, whereClause);
		collectMallocMemroy(parser, content->buffer);

		gsp_setNodeText(parser, (gsp_node*)whereClause, content->buffer, FALSE);	

		if(select!=NULL){
			if(select->fromTableList!=NULL && select->fromTableList->length>0){
				endToken =  (gsp_list_last(select->fromTableList))->fragment.endToken;
			}
			else if(select->groupByClause!=NULL){
				endToken =  select->groupByClause->fragment.startToken->pPrev;
			}
			else if(select->orderbyClause!=NULL){
				endToken =  select->orderbyClause->fragment.startToken->pPrev;
			}
			else if(select->resultColumnList!=NULL && select->resultColumnList->length>0){
				endToken =  (gsp_list_last(select->resultColumnList))->fragment.endToken;
			}
			else{
				endToken = select->fragment.endToken;
			}
		}
		else if(update!=NULL){
			if(update->resultColumnList!=NULL && update->resultColumnList->length>0){
				endToken =  (gsp_list_last(update->resultColumnList))->fragment.endToken;
			}
			else{
				endToken = select->fragment.endToken;
			}
		}
		else if(deleteStmt!=NULL){
			endToken = deleteStmt->fragment.endToken;
		}

		if(endToken->pNext == NULL)
			isEndTerminate = TRUE;

		adjustNodeTokensPosition((gsp_node*)whereClause, endToken);

		currentNode = (gsp_node *)select;
		{	
			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = whereClause->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = whereClause->fragment.endToken;
				}
				node = temp;
			}

			if(isEndTerminate)
				currentNode->fragment.endToken = whereClause->fragment.endToken;
		}

		select->whereCondition = whereClause;
		CStringDeleteWithoutBuffer(content);	
	}
}
예제 #5
0
void gsp_addHavingClause( gsp_sqlparser *parser, gsp_selectStatement* select, char* text ){
	if(select->groupByClause == NULL)
		return;
	if(select->groupByClause->havingClause !=NULL)
		gsp_removeHavingClause(select);
	{
		gsp_sourcetoken *endToken;
		gsp_node* currentNode;
		CString* content = CStringNew();
		gsp_sourcetoken *havingToken = NULL;
		gsp_sourcetoken *currentToken;
		gsp_expr *havingClause;
		gsp_groupBy* groupby = select->groupByClause;

		if(!startsWithIgnoreCase(trimString(text), "HAVING ")){
			CStringAppend(content, " HAVING ");
		}
		else
			CStringAppend(content, " ");
		CStringAppend(content, text);

		havingClause = (gsp_expr *)malloc(sizeof(gsp_expr));
		havingClause->nodeType = t_gsp_expr;
		havingClause->fragment.startToken = NULL;
		havingClause->fragment.endToken = NULL;
		havingClause->fragment.text = NULL;
		havingClause->pNext = NULL;
		havingClause->pPrev = NULL;

		collectMallocMemroy(parser, havingClause);
		collectMallocMemroy(parser, content->buffer);

		gsp_setNodeText(parser, (gsp_node*)havingClause, content->buffer, FALSE);	

		currentToken = havingClause->fragment.startToken;
		while(currentToken!=havingClause->fragment.endToken){
			if(startsWithIgnoreCase(currentToken->pStr, "HAVING ")){
				havingToken = currentToken;
				break;
			}
			currentToken = currentToken->pNext;
		}
		groupby->stHaving = havingToken;
		groupby->havingClause = havingClause;
		endToken = groupby->fragment.endToken;

		adjustNodeTokensPosition((gsp_node*)havingClause, endToken);

		currentNode = (gsp_node *)groupby;
		{	
			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = havingClause->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = havingClause->fragment.endToken;
				}
				node = temp;
			}

			currentNode->fragment.endToken = havingClause->fragment.endToken;
		}

		if(havingToken!=NULL){
			havingClause->pNext = (gsp_node*)groupby;
			havingClause->pPrev = groupby->pPrev;
		}
		CStringDeleteWithoutBuffer(content);
	}
}
예제 #6
0
void gsp_addGroupBy( gsp_sqlparser *parser, gsp_selectStatement* select, char* text )
{
	gsp_groupBy *groupby = select->groupByClause;

	if(groupby!=NULL && groupby->items!=NULL){
		gsp_list *items = groupby->items;
		gsp_gruopByItem *lastItem = (gsp_gruopByItem *)gsp_list_last(items);
		gsp_listcell *lastCell = items->tail;
		gsp_sourcetoken *endToken = lastItem->fragment.endToken;

		gsp_gruopByItem *item = (gsp_gruopByItem *)malloc(sizeof(gsp_gruopByItem));
		gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell));

		CString* content = CStringNew();
		CStringAppend(content, "," );
		CStringAppend(content, text );

		collectMallocMemroy(parser, item);
		collectMallocMemroy(parser, cell);
		collectMallocMemroy(parser, content->buffer);

		cell->node = (gsp_node*)item;
		cell->pNext = lastCell->pNext;
		cell->pPrev = lastCell->pPrev;
		cell->nodeType = lastCell->nodeType;
		cell->fragment.startToken = NULL;
		cell->fragment.endToken = NULL;
		cell->fragment.text = NULL;

		cell->nextCell = NULL;
		lastCell->nextCell = cell;
		items->tail = cell;
		item->pNext = NULL;
		item->pPrev = NULL;
		item->aliasClause = NULL;
		item->groupingSet = NULL;
		item->rollupCube = NULL;
		item->expr = NULL;
		item->nodeType = t_gsp_gruopByItem;
		item->fragment.startToken = NULL;
		item->fragment.endToken = NULL;
		item->fragment.text = NULL;

		gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE);		
		adjustNodeTokensPosition((gsp_node*)item, endToken);

		item->pPrev = (gsp_node *)lastItem;
		item->pNext = lastItem->pNext;
		lastItem->pNext = (gsp_node*)item;
		if(item->pNext!=NULL)
			item->pNext->pPrev = (gsp_node*)item;

		if(groupby->havingClause == NULL)
		{
			gsp_node *currentNode = (gsp_node*)groupby;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_gruopByItem 
						|| node->nodeType == t_gsp_objectname
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_gruopByItem 
						|| node->nodeType == t_gsp_objectname
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			currentNode->fragment.endToken = item->fragment.endToken;
		}

		CStringDeleteWithoutBuffer(content);
	}
	else{
		gsp_sourcetoken *endToken;
		gsp_node* currentNode;
		CString* content = CStringNew();
		gsp_sourcetoken *havingToken = NULL;
		gsp_sourcetoken *currentToken;
		BOOL isEndTerminate = FALSE;

		if(!startsWithIgnoreCase(trimString(text), "GROUP ")){
			CStringAppend(content, " GROUP BY ");
		}
		else
			CStringAppend(content, " ");
		CStringAppend(content, text);

		groupby = (gsp_groupBy *)malloc(sizeof(gsp_groupBy));
		groupby->nodeType = t_gsp_groupBy;
		groupby->fragment.startToken = NULL;
		groupby->fragment.endToken = NULL;
		groupby->fragment.text = NULL;
		groupby->items = NULL;
		groupby->pNext = NULL;
		groupby->pPrev = NULL;
		groupby->havingClause = NULL;
		groupby->stBy = NULL;
		groupby->stGroup = NULL;
		groupby->stHaving = NULL;

		collectMallocMemroy(parser, groupby);
		collectMallocMemroy(parser, content->buffer);

		gsp_setNodeText(parser, (gsp_node*)groupby, content->buffer, FALSE);	

		currentToken = groupby->fragment.startToken;
		while(currentToken!=groupby->fragment.endToken){
			if(startsWithIgnoreCase(currentToken->pStr, "HAVING ")){
				havingToken = currentToken;
				break;
			}
			currentToken = currentToken->pNext;
		}
		groupby->stHaving = havingToken;

		if(select->orderbyClause!=NULL){
			endToken = select->orderbyClause->fragment.startToken->pPrev;
		}
		else if(select->whereCondition!=NULL){
			endToken = select->whereCondition->fragment.endToken;
		}
		else if(select->fromTableList!=NULL){
			endToken =  (gsp_list_last(select->fromTableList))->fragment.endToken;
		}
		else{
			endToken = select->fragment.endToken;
		}
		if(endToken->pNext == NULL)
			isEndTerminate = TRUE;

		adjustNodeTokensPosition((gsp_node*)groupby, endToken);

		currentNode = (gsp_node *)select;
		{	
			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = groupby->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = groupby->fragment.endToken;
				}
				node = temp;
			}

			if(isEndTerminate)
				currentNode->fragment.endToken = groupby->fragment.endToken;

		}

		if(havingToken!=NULL){
			gsp_expr *havingClause = (gsp_expr *)malloc(sizeof(gsp_expr));
			havingClause->nodeType = t_gsp_expr;
			currentToken = havingToken->pNext;
			while(currentToken!=NULL && strlen(trimString(currentToken->pStr))==0){
				currentToken = currentToken->pNext;
			}
			havingClause->fragment.startToken = currentToken;
			havingClause->fragment.endToken = groupby->fragment.endToken;
			havingClause->fragment.text = NULL;
			havingClause->pNext = (gsp_node*)groupby;
			havingClause->pPrev = (gsp_node*)select;

			collectMallocMemroy(parser, havingClause);
		}
		select->groupByClause = groupby;
		CStringDeleteWithoutBuffer(content);
	}
}
예제 #7
0
void gsp_addOrderBy( gsp_sqlparser *parser, gsp_selectStatement* select, char* text )
{
	gsp_orderBy *orderby = select->orderbyClause;

	if(orderby!=NULL && orderby->items!=NULL){
		gsp_list *items = orderby->items;
		gsp_orderByItem *lastItem = (gsp_orderByItem *)gsp_list_last(items);
		gsp_listcell *lastCell = items->tail;
		gsp_sourcetoken *endToken = lastItem->fragment.endToken;

		gsp_orderByItem *item = (gsp_orderByItem *)malloc(sizeof(gsp_orderByItem));
		gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell));

		CString* content = CStringNew();
		CStringAppend(content, "," );
		CStringAppend(content, text );

		collectMallocMemroy(parser, item);
		collectMallocMemroy(parser, cell);
		collectMallocMemroy(parser, content->buffer);

		cell->node = (gsp_node*)item;
		cell->pNext = lastCell->pNext;
		cell->pPrev = lastCell->pPrev;
		cell->nodeType = lastCell->nodeType;
		cell->fragment.startToken = NULL;
		cell->fragment.endToken = NULL;
		cell->fragment.text = NULL;

		cell->nextCell = NULL;
		lastCell->nextCell = cell;
		items->tail = cell;
		items->length+=1;
		item->pNext = NULL;
		item->pPrev = NULL;
		item->sortToken = NULL;
		item->nodeType = t_gsp_orderByItem;
		item->fragment.startToken = NULL;
		item->fragment.endToken = NULL;
		item->fragment.text = NULL;

		gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE);		
		adjustNodeTokensPosition((gsp_node*)item, endToken);

		item->pPrev = (gsp_node *)lastItem;
		item->pNext = lastItem->pNext;
		lastItem->pNext = (gsp_node*)item;
		if(item->pNext!=NULL)
			item->pNext->pPrev = (gsp_node*)item;

		{
			gsp_node *currentNode = (gsp_node*)orderby;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_orderByItem 
						|| node->nodeType == t_gsp_objectname
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_orderByItem 
						|| node->nodeType == t_gsp_objectname
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			currentNode->fragment.endToken = item->fragment.endToken;
		}

		CStringDeleteWithoutBuffer(content);
	}
	else{
		gsp_sourcetoken *endToken;
		gsp_node* currentNode;
		CString* content = CStringNew();
		BOOL isEndTerminate = FALSE;

		if(!startsWithIgnoreCase(trimString(text), "ORDER ")){
			CStringAppend(content, " ORDER BY ");
		}
		else
			CStringAppend(content, " ");
		CStringAppend(content, text);

		orderby = (gsp_orderBy *)malloc(sizeof(gsp_orderBy));
		orderby->nodeType = t_gsp_orderBy;
		orderby->fragment.startToken = NULL;
		orderby->fragment.endToken = NULL;
		orderby->fragment.text = NULL;
		orderby->items = NULL;
		orderby->pNext = NULL;
		orderby->pPrev = NULL;

		collectMallocMemroy(parser, orderby);
		collectMallocMemroy(parser, content->buffer);

		gsp_setNodeText(parser, (gsp_node*)orderby, content->buffer, FALSE);	

		if(select->groupByClause!=NULL){
			if(select->groupByClause->havingClause!=NULL){
				endToken = select->groupByClause->havingClause->fragment.endToken;
			}
			else{
				endToken = select->groupByClause->fragment.endToken;
			}
		}
		else if(select->whereCondition!=NULL){
			endToken = select->whereCondition->fragment.endToken;
		}
		else if(select->fromTableList!=NULL){
			endToken =  (gsp_list_last(select->fromTableList))->fragment.endToken;
		}
		else{
			endToken = select->fragment.endToken;
		}
		if(endToken->pNext == NULL)
			isEndTerminate = TRUE;

		adjustNodeTokensPosition((gsp_node*)orderby, endToken);

		currentNode = (gsp_node *)select;
		{	
			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = orderby->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = orderby->fragment.endToken;
				}
				node = temp;
			}

			if(isEndTerminate)
				currentNode->fragment.endToken = orderby->fragment.endToken;
		}

		select->orderbyClause = orderby;
		CStringDeleteWithoutBuffer(content);
	}
}
예제 #8
0
void gsp_addResultColumn(gsp_sqlparser *parser, gsp_base_statement* stmt, char* text){

	gsp_selectStatement* select = NULL;
	gsp_updateStatement* update = NULL;
	gsp_list *resultColumnList = NULL;

	if(stmt->nodeType == t_gsp_selectStatement){
		select = (gsp_selectStatement*)stmt;
		resultColumnList = select->resultColumnList;
	}
	else if(stmt->nodeType == t_gsp_updateStatement){
		update = (gsp_updateStatement*)stmt;
		resultColumnList = update->resultColumnList;
	}

	if(resultColumnList!=NULL){
		gsp_list *items = resultColumnList;

		gsp_resultColumn *item = (gsp_resultColumn *)malloc(sizeof(gsp_resultColumn));
		gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell));
		gsp_resultColumn *lastItem = NULL;
		gsp_listcell *lastCell = NULL;
		gsp_sourcetoken *endToken = NULL;

		CString* content = CStringNew();
		if(items->length>0)
			CStringAppend(content, "," );
		else 
			CStringAppend(content, " " );
		CStringAppend(content, text );

		collectMallocMemroy(parser, item);
		collectMallocMemroy(parser, cell);
		collectMallocMemroy(parser, content->buffer);

		if(items->length>0){
			lastItem = (gsp_resultColumn *)gsp_list_last(items);
			lastCell = items->tail;
			endToken = lastItem->fragment.endToken;
		}
		else{
			if(select!=NULL)
				endToken = select->selectToken;
			else if(update!=NULL)
				endToken = update->updateToken;
		} 
		cell->node = (gsp_node*)item;
		if(lastCell!=NULL){
			cell->pNext = lastCell->pNext;
			cell->pPrev = lastCell->pPrev;
			cell->nodeType = lastCell->nodeType;
		}
		else{
			cell->pPrev = (gsp_node*)items;
			cell->pNext = NULL;
			cell->nodeType = t_gsp_listcell;
		}
		cell->fragment.startToken = NULL;
		cell->fragment.endToken = NULL;
		cell->fragment.text = NULL;

		cell->nextCell = NULL;
		if(lastCell!=NULL){
			lastCell->nextCell = cell;
		}
		else{
			items->head = cell;
		}
		items->tail = cell;
		items->length+=1;
		item->pNext = NULL;
		item->pPrev = NULL;
		item->aliasClause = NULL;
		item->expr = NULL;
		item->nodeType = t_gsp_resultColumn;
		item->fragment.startToken = NULL;
		item->fragment.endToken = NULL;
		item->fragment.text = NULL;

		gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE);		
		adjustNodeTokensPosition((gsp_node*)item, endToken);

		if(lastItem!=NULL){
			item->pPrev = (gsp_node *)lastItem;
			item->pNext = lastItem->pNext;
			lastItem->pNext = (gsp_node*)item;
			if(item->pNext!=NULL)
				item->pNext->pPrev = (gsp_node*)item;
		}
		{
			gsp_node *currentNode = (gsp_node*)items;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_resultColumn 
						|| node->nodeType == t_gsp_objectname
						|| node->nodeType == t_gsp_functionCall
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->nodeType == t_gsp_resultColumn 
						|| node->nodeType == t_gsp_objectname
						|| node->nodeType == t_gsp_functionCall
						||node->nodeType == t_gsp_expr)
						continue;
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = item->fragment.endToken;
				}
				node = temp;
			}
		}

		CStringDeleteWithoutBuffer(content);
	}
}