PostgreSQL源码解读》(215)——查询# 122 (varstrfastcmp_locale)

  

  本节介绍了PostgreSQL在指定执行排序规则整理时的实现逻辑。   
  在指定整理为zh_CN时,排序规则与默认的C大不一致   <前>   <代码>   (本地):5432 pg12@testdb=#选择名字从unnest运算(数组(“名字”,“my-image.jpg”, ' my-third-image.jpg '])的名字顺序的名字核对“C”;   的名字   --------------------   的名字   my-image.jpg   my-third-image.jpg   (3行)   时间:78.843毫秒   (本地):5432 pg12@testdb=#选择名字从unnest运算(数组(“名字”,“my-image.jpg”, ' my-third-image.jpg '])的名字顺序的名字核对“zh_CN”;   的名字   --------------------   my-image.jpg   的名字   my-third-image.jpg   (3行)   时间:70.125毫秒      之前   

           二,源码解读   

  

  varstrfastcmp_locale函数用于现场定制化排序实现,主要的实现函数是strcoll_l,该函数是C库函数,如核对设置为zh_CN则使用拼音进行排序,不区分大小写。   

  <前>   <代码>/*   * sortsupport比较函数语言环境情况   */静态int   varstrfastcmp_locale (char * a1p int len1, char * a2p, int len2, SortSupport ssup)   {   VarStringSortSupport * sss=(VarStringSortSupport *) ssup→ssup_extra;   int结果;   bool arg1_match;/*快速提前预支了平等,讨论varstr_cmp () */如果(len1==len2,,memcmp (a1p、a2p len1)==0)   {/*   *在来或buf2内容没有变化,所以避免改变last_len1或   * last_len2。现有的缓冲区的内容可能仍然使用   *下一个电话。   *   *很好,允许BpChar填充字节的比较,   *即使这意味着memcmp()通常会   *执行BpChar调用者(虽然多字节字符   *仍然防止发生)。memcmp()仍然非常   *廉价,BpChar很有趣让我们删除语义尾随的空格   *(不限于填充),所以我们需要毫无区别   *填充空格字符和“真正的”空格字符。   */返回0;   }   如果(sss→typid==BPCHAROID)   {/*得到真正的字节数,忽略空间*/len1=bpchartruelen (a1p len1);   len2=bpchartruelen (a2p len2);   }   如果(len1祝辞=sss→buflen1)   {   pfree (sss→来);   sss→buflen1=Max (len1 + 1分钟(sss→buflen1 * 2, MaxAllocSize));   sss→来=MemoryContextAlloc (ssup→ssup_cxt, sss→buflen1);   }   如果(len2祝辞=sss→buflen2)   {   pfree (sss→buf2);   sss→buflen2=Max (len2 + 1分钟(sss→buflen2 * 2, MaxAllocSize));   sss→buf2=MemoryContextAlloc (ssup→ssup_cxt, sss→buflen2);   }/*   *我们可能会被要求重复比较相同的字符串,和   * memcmp()远远低于strcoll()是值得尝试缓存   *比较,尽管一般来说没有理由认为   *将工作(每个字符串数据可能是唯一的)。缓存是否   *不慢下来明显行不通时,速度   *的事情,而当它。在某种程度上,这是因为   * memcmp()比较数据需要从cachelines L1缓存   *当最后一个比较的结果不能被重用。   *///拷贝到瑞士的来中   arg1_match=true;   如果(len1 !=sss→last_len1 | | memcmp (sss→来,a1p, len1) !=0)   {   arg1_match=false;   memcpy (sss→来,a1p len1);   sss→来[len1]=' \ 0 ';   sss→last_len1=len1;   }/*   *如果我们比较两个字符串和上次相同,我们可以返回   *同样的回答没有调用strcoll ()。这是更有可能比   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

PostgreSQL源码解读》(215)——查询# 122 (varstrfastcmp_locale)