* preferred node choose that one, otherwise choose the first one.
*/
if (IsLocatorReplicated(exec_nodes->baselocatortype) &&
- exec_nodes->accesstype == RELATION_ACCESS_READ)
+ (exec_nodes->accesstype == RELATION_ACCESS_READ ||
+ exec_nodes->accesstype == RELATION_ACCESS_READ_FQS))
{
List *tmp_list = exec_nodes->nodeList;
exec_nodes->nodeList = GetPreferredReplicationNode(exec_nodes->nodeList);
if (for_update)
rel_access = RELATION_ACCESS_READ_FOR_UPDATE;
else
- rel_access = RELATION_ACCESS_READ;
+ rel_access = RELATION_ACCESS_READ_FQS;
break;
case CMD_UPDATE:
if (en1->primarynodelist || en2->primarynodelist ||
en1->en_expr || en2->en_expr ||
OidIsValid(en1->en_relid) || OidIsValid(en2->en_relid) ||
- en1->accesstype != RELATION_ACCESS_READ || en2->accesstype != RELATION_ACCESS_READ)
+ (en1->accesstype != RELATION_ACCESS_READ && en1->accesstype != RELATION_ACCESS_READ_FQS) ||
+ (en2->accesstype != RELATION_ACCESS_READ && en2->accesstype != RELATION_ACCESS_READ_FQS))
return NULL;
if (IsExecNodesReplicated(en1) &&
break;
}
if (nodeid < 0)
- return list_make1_int(linitial_int(relNodes));
+ return list_make1_int(list_nth_int(relNodes,
+ ((unsigned int) random()) % list_length(relNodes)));
return list_make1_int(nodeid);
}
{
case LOCATOR_TYPE_REPLICATED:
if (accessType == RELATION_ACCESS_INSERT ||
- accessType == RELATION_ACCESS_UPDATE)
+ accessType == RELATION_ACCESS_UPDATE ||
+ accessType == RELATION_ACCESS_READ_FQS)
{
locator->locatefunc = locate_static;
if (nodeMap == NULL)
typedef enum
{
RELATION_ACCESS_READ, /* SELECT */
+ RELATION_ACCESS_READ_FQS, /* SELECT for FQS */
RELATION_ACCESS_READ_FOR_UPDATE, /* SELECT FOR UPDATE */
RELATION_ACCESS_UPDATE, /* UPDATE OR DELETE */
RELATION_ACCESS_INSERT /* INSERT */