Take a look here:

SELECT resource_tags.id, resource_tags.uuid, resource_tags.key,
resource_tags.value, resource_tags.domain_id, resource_tags.account_id,
resource_tags.resource_id, resource_tags.resource_uuid,
resource_tags.resource_type, resource_tags.customer FROM resource_tags
WHERE  ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
OR resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
)  AND resource_tags.resource_type = 'Account';

+----+--------------------------------------+-------+-------
+-----------+------------+-------------+--------------------
------------------+---------------+----------+
| id | uuid                                 | key   | value | domain_id |
account_id | resource_id | resource_uuid                        |
resource_type | customer |
+----+--------------------------------------+-------+-------
+-----------+------------+-------------+--------------------
------------------+---------------+----------+
|  7 | 95a1a314-2247-4622-a33f-b9b2680bc2e1 | test  | me    |         1 |
       2 |           2 | 3199fc71-cf39-11e7-af5d-dc0ea16ecd7f | Account
  | NULL     |
| 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me    |         1 |
       4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 | Account
  | NULL     |
| 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2   |         1 |
       4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 | Account
  | NULL     |
+----+--------------------------------------+-------+-------
+-----------+------------+-------------+--------------------
------------------+---------------+----------+
3 rows in set, 1 warning (0.01 sec)

Try to figure out why id=7 is selected here?

Because:
resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60'

Matched unintentionally, because mysql converted uuid to int and got 2
which is matched to resource_id of 2 (id=7).

22 нояб. 2017 г. 6:23 ПП пользователь "Rafael Weingärtner" <
rafaelweingart...@gmail.com> написал:

> Ah, ok now it makes sense the "IN", I thought you were only talking about
> single values.
>
>
>
> I do not think that the UUID (resource UUID) is the representation of ID
> value in Hexadecimal, if it is we could simply get rid of one of them. I
> really dislike these search criteria...I am not seeing what you are saying.
> Let´s see this in SQL, so we can discuss.
>
> SELECT * FROM resource_tags
> WHERE  (resource_id in (....) OR resource_uuid in (...))
> AND resource_tags.resource_type = 'Account';
>
>
> That is what the programmer who coded that Search criteria seemed to want,
> right? I mean, the developer wanted to select resources that match either
> the ID or UUID field. Also, we may have more than a single value to filter
> in both ID and UUID. I am also assuming that UUID does not necessarily
> represents the ID as a hexadecimal.
>
> The problem seems to be when it is being translated:
>
> > ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
> > OR
> > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-
> 9465-c1bc5440ea60'
> > )
> >
>
> It is not even using an “IN” structure in the SQL. Also, why is the
> resource_id equals the UUID in the filter. Did you check the entity that is
> being sent as an example? Are the fields ID and UUID set with the same
> values?
>
>
>
> P.S. Normally the ID field of entities is not exposed to users via API. The
> field ID in the API is translated to UUID in ACS. The field ID in the
> database is intended as a dummy primary key for the table.
>
>
> On Wed, Nov 22, 2017 at 9:05 AM, Ivan Kudryavtsev <
> kudryavtsev...@bw-sw.com>
> wrote:
>
> > Hi, Rafael, 'IN" because API call assumes that several resourceIds can be
> > provided, so IN solves it, EQ doesn't.
> >
> > But despite semantics ID/UUID you see that ID is integer and UUID is
> string
> > and that comparison does fault positive results, next when object access
> > for caller is checked exception occured and no tag removal happen as a
> > result because int(2) eq '2afcffdsfdsfds-... (UUID)".
> >
> > 2017-11-22 18:01 GMT+07:00 Rafael Weingärtner <
> rafaelweingart...@gmail.com
> > >:
> >
> > > Are ID and UUID set with the same values in that entity? If not, the
> > > criteria seem correct. I mean, it is trying to filter for an ID if it
> > > exists or by UUID if it exists in the entity that is passed as an
> > example.
> > > What I do not understand is that they are using “SearchCriteria.Op.IN
> ”,
> > > but
> > > in my opinion, it should be “SearchCriteria.Op.EQ”.
> > >
> > > On Wed, Nov 22, 2017 at 7:58 AM, Ivan Kudryavtsev <
> > > kudryavtsev...@bw-sw.com>
> > > wrote:
> > >
> > > > Hi, I found interesting behaviour with tags:
> > > >
> > > > mysql> SELECT resource_tags.id, resource_tags.uuid,
> resource_tags.key,
> > > > resource_tags.value, resource_tags.domain_id,
> resource_tags.account_id,
> > > > resource_tags.resource_id, resource_tags.resource_uuid,
> > > > resource_tags.resource_type, resource_tags.customer FROM
> resource_tags
> > > > WHERE  ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-
> > > c1bc5440ea60'
> > > > OR
> > > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-
> > > 9465-c1bc5440ea60'
> > > > )
> > > >  AND resource_tags.resource_type = 'Account';
> > > >
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > | id | uuid                                 | key   | value |
> > domain_id |
> > > > account_id | resource_id | resource_uuid                        |
> > > > resource_type | customer |
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > |  7 | 95a1a314-2247-4622-a33f-b9b2680bc2e1 | test  | me    |
> >  1
> > > |
> > > >        2 |           2 | 3199fc71-cf39-11e7-af5d-dc0ea16ecd7f |
> > Account
> > > >   | NULL     |
> > > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me    |
> >  1
> > > |
> > > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> > Account
> > > >   | NULL     |
> > > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2   |
> >  1
> > > |
> > > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> > Account
> > > >   | NULL     |
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > 3 rows in set, 1 warning (0.01 sec)
> > > >
> > > > Don't see that "resource_type" is "account". I just play with it.
> > > >
> > > > Take a look at ID=7. This row is found because:
> > > >
> > > > resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
> when
> > > > right
> > > > part is converted to int. Corresponding code is here:
> > > >
> > > > https://github.com/apache/cloudstack/blob/87ef8137534fa79810
> > 1f65c6691fcf
> > > > 71513ac978/server/src/com/cloud/tags/TaggedResourceManagerIm
> > pl.java#L301
> > > >
> > > > sb.and().op("resourceId", sb.entity().getResourceId(),
> > > > SearchCriteria.Op.IN);
> > > > sb.or("resourceUuid", sb.entity().getResourceUuid(),
> > > SearchCriteria.Op.IN
> > > > );
> > > > sb.cp();
> > > > sb.and("resourceType", sb.entity().getResourceType(),
> > > > SearchCriteria.Op.EQ);
> > > >
> > > > I don't know why the writer uses "resourceId" or "resourceUuid". I
> > > suppose
> > > > it's a bug and code should be transformed to:
> > > >
> > > > sb.and("resourceUuid", sb.entity().getResourceUuid(),
> > > SearchCriteria.Op.IN
> > > > );
> > > > sb.and("resourceType", sb.entity().getResourceType(),
> > > > SearchCriteria.Op.EQ);
> > > >
> > > > Or MySQL query should be transformed to:
> > > >
> > > > mysql> SELECT resource_tags.id, resource_tags.uuid,
> resource_tags.key,
> > > > resource_tags.value, resource_tags.domain_id,
> resource_tags.account_id,
> > > > resource_tags.resource_id, resource_tags.resource_uuid,
> > > > resource_tags.resource_type, resource_tags.customer FROM
> resource_tags
> > > > WHERE  ( concat("%", resource_tags.resource_id) =
> > > > '2a4264fb-9f63-4d4f-9465-c1bc5440ea60' OR
> > > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-
> > > 9465-c1bc5440ea60'
> > > > )
> > > >  AND resource_tags.resource_type = 'Account';
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > | id | uuid                                 | key   | value |
> > domain_id |
> > > > account_id | resource_id | resource_uuid                        |
> > > > resource_type | customer |
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me    |
> >  1
> > > |
> > > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> > Account
> > > >   | NULL     |
> > > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2   |
> >  1
> > > |
> > > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> > Account
> > > >   | NULL     |
> > > > +----+--------------------------------------+-------+-------
> > > > +-----------+------------+-------------+--------------------
> > > > ------------------+---------------+----------+
> > > > 2 rows in set (0.00 sec)
> > > >
> > > > Let me your thoughts and I'll fix it. Right now, obviously it's a
> bug.
> > > >
> > > >
> > > >
> > > > --
> > > > With best regards, Ivan Kudryavtsev
> > > > Bitworks Software, Ltd.
> > > > Cell: +7-923-414-1515
> > > > WWW: http://bitworks.software/ <http://bw-sw.com/>
> > > >
> > >
> > >
> > >
> > > --
> > > Rafael Weingärtner
> > >
> >
> >
> >
> > --
> > With best regards, Ivan Kudryavtsev
> > Bitworks Software, Ltd.
> > Cell: +7-923-414-1515
> > WWW: http://bitworks.software/ <http://bw-sw.com/>
> >
>
>
>
> --
> Rafael Weingärtner
>

Reply via email to