~drizzle-trunk/drizzle/development

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/***********************************************************************
Comparison services for records

(c) 1994-1996 Innobase Oy

Created 7/1/1994 Heikki Tuuri
************************************************************************/

/*****************************************************************
This function is used to compare two data fields for which we know the
data type. */
UNIV_INLINE
int
cmp_data_data(
/*==========*/
				/* out: 1, 0, -1, if data1 is greater, equal,
				less than data2, respectively */
	ulint		mtype,	/* in: main type */
	ulint		prtype,	/* in: precise type */
	byte*		data1,	/* in: data field (== a pointer to a memory
				buffer) */
	ulint		len1,	/* in: data field length or UNIV_SQL_NULL */
	byte*		data2,	/* in: data field (== a pointer to a memory
				buffer) */
	ulint		len2)	/* in: data field length or UNIV_SQL_NULL */
{
	return(cmp_data_data_slow(mtype, prtype, data1, len1, data2, len2));
}

/*****************************************************************
This function is used to compare two dfields where at least the first
has its data type field set. */
UNIV_INLINE
int
cmp_dfield_dfield(
/*==============*/
				/* out: 1, 0, -1, if dfield1 is greater, equal,
				less than dfield2, respectively */
	dfield_t*	dfield1,/* in: data field; must have type field set */
	dfield_t*	dfield2)/* in: data field */
{
	const dtype_t*	type;

	ut_ad(dfield_check_typed(dfield1));

	type = dfield_get_type(dfield1);

	return(cmp_data_data(type->mtype, type->prtype,
			     dfield_get_data(dfield1),
			     dfield_get_len(dfield1),
			     dfield_get_data(dfield2),
			     dfield_get_len(dfield2)));
}

/*****************************************************************
This function is used to compare two physical records. Only the common
first fields are compared. */
UNIV_INLINE
int
cmp_rec_rec(
/*========*/
				/* out: 1, 0 , -1 if rec1 is greater, equal,
				less, respectively, than rec2; only the common
				first fields are compared */
	rec_t*		rec1,	/* in: physical record */
	rec_t*		rec2,	/* in: physical record */
	const ulint*	offsets1,/* in: rec_get_offsets(rec1, index) */
	const ulint*	offsets2,/* in: rec_get_offsets(rec2, index) */
	dict_index_t*	index)	/* in: data dictionary index */
{
	ulint	match_f		= 0;
	ulint	match_b		= 0;

	return(cmp_rec_rec_with_match(rec1, rec2, offsets1, offsets2, index,
				      &match_f, &match_b));
}