Changeset 26568
- Timestamp:
- 12/12/08 14:34:36 (4 years ago)
- Files:
-
- 1 modified
-
platform/mysql/top-n-sort/top-n-sort.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
platform/mysql/top-n-sort/top-n-sort.c
r26567 r26568 32 32 33 33 typedef struct _topn_info { 34 size_t refcnt;35 size_t count;34 int refcnt; 35 int count; 36 36 topn_item items[MAX_ITEMS]; 37 37 } topn_info; … … 113 113 long long topn_set(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) 114 114 { 115 // TODO 115 int max_items = (int)*(long long*)args->args[0]; 116 long long id = *(long long*)args->args[1], 117 value = *(long long*)args->args[2]; 118 topn_info *info = initid->ptr; 119 int keep; 120 121 for (keep = info->count - 1; keep >= 0; keep--) { 122 if (info->items[keep].value < value 123 || (info->items[keep].value == value && info->items[keep].id < id)) { 124 break; 125 } 126 } 127 if (i == max_items - 1) { 128 return 0; // cannot add 129 } 130 if (info->count < max_items) { 131 info->count++; 132 } 133 for (i = cnt - 2; i > keep; i--) { 134 memcpy(info->items + i + 1, info->items + i, sizeof(info->items[0])); 135 } 136 info->items[keep + 1].id = id; 137 info->items[keep + 1].value = value; 116 138 return 0; 117 139 } … … 141 163 { 142 164 topn_info *info = initid->ptr; 143 size_t idx = (size_t)*(long long*)args->args[0];165 int idx = (int)*(long long*)args->args[0]; 144 166 145 return idx < info->count ? info->items[idx].id : 0;167 return 0 <= idx && idx < info->count ? info->items[idx].id : 0; 146 168 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)