ordering.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * ordering.c
  4.  *   Routines to manipulate and compare merge and path orderings
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.16.2.1 1999/08/02 06:27:08 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <sys/types.h>
  15. #include "postgres.h"
  16. #include "optimizer/ordering.h"
  17. static bool sortops_order_match(Oid *ordering1, Oid *ordering2,
  18. int *better_sort);
  19. /*
  20.  * equal_path_ordering
  21.  *   Returns t iff two path orderings are equal.
  22.  *
  23.  */
  24. bool
  25. pathorder_match(PathOrder *path_ordering1,
  26. PathOrder *path_ordering2,
  27. int *better_sort)
  28. {
  29. *better_sort = 0;
  30. if (path_ordering1 == path_ordering2)
  31. return true;
  32. if (!path_ordering2)
  33. {
  34. *better_sort = 1;
  35. return true;
  36. }
  37. if (!path_ordering1)
  38. {
  39. *better_sort = 2;
  40. return true;
  41. }
  42. if (path_ordering1->ordtype == MERGE_ORDER &&
  43. path_ordering2->ordtype == MERGE_ORDER)
  44. return equal(path_ordering1->ord.merge, path_ordering2->ord.merge);
  45. else if (path_ordering1->ordtype == SORTOP_ORDER &&
  46.  path_ordering2->ordtype == SORTOP_ORDER)
  47. {
  48. return sortops_order_match(path_ordering1->ord.sortop,
  49.    path_ordering2->ord.sortop,
  50.    better_sort);
  51. }
  52. else if (path_ordering1->ordtype == MERGE_ORDER &&
  53.  path_ordering2->ordtype == SORTOP_ORDER)
  54. {
  55. if (!path_ordering2->ord.sortop)
  56. {
  57. *better_sort = 1;
  58. return true;
  59. }
  60. return path_ordering1->ord.merge->left_operator == path_ordering2->ord.sortop[0];
  61. }
  62. else
  63. {
  64. if (!path_ordering1->ord.sortop)
  65. {
  66. *better_sort = 2;
  67. return true;
  68. }
  69. return path_ordering1->ord.sortop[0] == path_ordering2->ord.merge->left_operator;
  70. }
  71. }
  72. /*
  73.  * equal_path_merge_ordering
  74.  *   Returns t iff a path ordering is usable for ordering a merge join.
  75.  *
  76.  * XXX Presently, this means that the first sortop of the path matches
  77.  * either of the merge sortops.  Is there a "right" and "wrong"
  78.  * sortop to match?
  79.  *
  80.  */
  81. bool
  82. equal_path_merge_ordering(Oid *path_ordering,
  83.   MergeOrder *merge_ordering)
  84. {
  85. if (path_ordering == NULL || merge_ordering == NULL)
  86. return false;
  87. if (path_ordering[0] == merge_ordering->left_operator ||
  88. path_ordering[0] == merge_ordering->right_operator)
  89. return true;
  90. else
  91. return false;
  92. }
  93. /*
  94.  * equal_merge_ordering
  95.  *   Returns t iff two merge orderings are equal.
  96.  *
  97.  */
  98. bool
  99. equal_merge_ordering(MergeOrder *merge_ordering1,
  100.  MergeOrder *merge_ordering2)
  101. {
  102. return equal(merge_ordering1, merge_ordering2);
  103. }
  104. /*
  105.  * sortops
  106.  *
  107.  */
  108. /*
  109.  * equal_sort_ops_order -
  110.  *   Returns true iff the sort operators are in the same order.
  111.  */
  112. static bool
  113. sortops_order_match(Oid *ordering1, Oid *ordering2, int *better_sort)
  114. {
  115. int i = 0;
  116. *better_sort = 0;
  117. if (ordering1 == ordering2)
  118. return true;
  119. if (!ordering2)
  120. {
  121. *better_sort = 1;
  122. return true;
  123. }
  124. if (!ordering1)
  125. {
  126. *better_sort = 2;
  127. return true;
  128. }
  129. while (ordering1[i] != 0 && ordering2[i] != 0)
  130. {
  131. if (ordering1[i] != ordering2[i])
  132. break;
  133. i++;
  134. }
  135. if (ordering1[i] != 0 && ordering2[i] == 0)
  136. {
  137. *better_sort = 1;
  138. return true;
  139. }
  140. if (ordering1[i] == 0 && ordering2[i] != 0)
  141. {
  142. *better_sort = 2;
  143. return true;
  144. }
  145. return ordering1[i] == 0 && ordering2[i] == 0;
  146. }