টাইপ সংশোধক সহ ডেটা ধরণের জন্য আশ্চর্যজনক ফলাফল


11

এই প্রশ্নের জন্য একটি পুনরাবৃত্ত সিটিই সমাধান আলোচনা করার সময়:

@ টিউবকিউব একটি আশ্চর্যজনক ব্যতিক্রম হোঁচট খেয়েছে, যা আমাদের টাইপ সংশোধনকারীদের পরিচালনা তদন্ত করতে পরিচালিত করে। আমরা অবাক করা আচরণ পেয়েছি।

1. টাইপ কাস্ট কিছু প্রসঙ্গে প্রকারের সংশোধকটিকে ধরে রাখে

এমনকি নির্দেশ না দিলেও। সর্বাধিক প্রাথমিক উদাহরণ:

SELECT 'vc8'::varchar(8)::varchar

কেউ আশা করতে পারে varchar(কোনও সংশোধক নয়), অন্তত আমি চাই। তবে ফলাফলটি varchar(8)(সংশোধক সহ)। নীচে বার্সার সাথে সম্পর্কিত অনেকগুলি মামলা।

২. অ্যারে সংক্ষেপণ কিছু প্রসঙ্গে প্রকারের সংশোধককে হারায়

প্রয়োজন ছাড়াই, সুতরাং এটি বিপরীত দিকে ভুল করে:

SELECT ARRAY['vc8']::varchar(8)[]
     , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8)

varchar(8)[]প্রত্যাশা অনুযায়ী 1 ম এক্সপ্রেশন ফলন দেয় ।
তবে ২ য়, দ্বিতীয়টিকে সম্মতি দেওয়ার পরে varchar(8)সবেমাত্র varchar[](কোনও সংশোধক নয়) এ জল দেওয়া হয় । অনুরূপ আচরণ array_append(), নীচের ফিডল মধ্যে উদাহরণ।

এগুলি বেশিরভাগ প্রসঙ্গেই কিছু যায় আসে না। পোস্টগ্রিজ ডেটা হারায় না এবং যখন কোনও কলামে বরাদ্দ করা হয়, মানটি যাইহোক ডান ধরণের কাছে জোর করা হয়। যাইহোক , বিপরীত দিক থেকে ভুল একটি অবাক বিস্ময়কর পরিণতি:

৩. রিকার্সিভ সিটিই হুবহু মিলে যাওয়ার জন্য ডেটা ধরণের দাবি করে

এই সরলীকৃত টেবিল দেওয়া:

CREATE TABLE a (
  vc8  varchar(8)  -- with modifier
, vc   varchar     -- without  
);
INSERT INTO a VALUES  ('a',  'a'), ('bb', 'bb');

এই rCTE জন্য কাজ করে যদিও varcharকলাম vc, এটা ব্যর্থ varchar(8)কলাম vc8:

WITH RECURSIVE cte AS (
   (
   SELECT ARRAY[vc8] AS arr  -- produces varchar(8)[]
   FROM   a
   ORDER  BY vc8
   LIMIT 1
   )

   UNION ALL
   (
   SELECT a.vc8 || c.arr  -- produces varchar[] !!
   FROM   cte c
   JOIN   a ON a.vc8 > c.arr[1]
   ORDER  BY vc8
   LIMIT 1
   )
   )
TABLE  cte;
ত্রুটি: পুনরাবৃত্ত ক্যোয়ারী "সিটি" কলাম 1-এ অক্ষরবিহীন পদে টাইপ অক্ষর (8) [] রয়েছে তবে চরিত্রটি পৃথকভাবে পৃথক []  
ইঙ্গিত: নন-রিকার্সিভ টার্মের আউটপুটটিকে সঠিক প্রকারে কাস্ট করুন। অবস্থান: 103

একটি দ্রুত কাজ শেষ করতে হবে text

একটি সরল UNIONক্যোয়ারী একই সমস্যা প্রদর্শন করে না: এটি সংশোধক ছাড়াই টাইপের জন্য স্থির হয়, যা সমস্ত তথ্য সংরক্ষণের গ্যারান্টিযুক্ত। তবে আরসিটিই আরও পিক।

এছাড়াও, আপনি / এর max(vc8)পরিবর্তে বেশি ব্যবহৃত সাধারণত সমস্যাগুলির মধ্যে দৌড়াবেন না , কারণ এবং বন্ধুরা এখনই স্থির হয়ে যায় (বা সংশোধন না করে সংশ্লিষ্ট বেস প্রকার)।ORDER BYLIMIT 1max()text

এসকিউএল ফিডল 3 টি জিনিস প্রদর্শন করছে:

  1. অবাক করার ফলাফল সহ একাধিক উদাহরণের বহিঃপ্রকাশ।
  2. একটি সাধারণ আরসিটিই যা varchar(সংশোধক ছাড়াই) সাথে কাজ করে ।
  3. একই আরসিটিই varchar(n)(মোডিফায়ার সহ) এর জন্য ব্যতিক্রম উত্থাপন করে ।

পোড়াটি পৃষ্ঠা 9.3 এর জন্য। আমি পৃষ্ঠা 9.4.4 এর জন্য স্থানীয়ভাবে একই ফলাফল পেয়েছি।

আমি ডেমো এক্সপ্রেশন থেকে টেবিল তৈরি করেছি যাতে সংশোধনকারী সহ সঠিক ডেটা টাইপ দেখাতে সক্ষম হয়। পিজএডমিন বাক্সের বাইরে এই তথ্যটি দেখায় এটি স্ক্যালফিল্ডল থেকে পাওয়া যায় না। লক্ষণীয়, এটি psql(!) তেও উপলভ্য নয় । এটি পিএসকিএল-এর ঘাটতি হিসাবে পরিচিত এবং এর আগে পিএএসএসকিএল-হ্যাকারদের উপর একটি সম্ভাব্য সমাধান আলোচনা করা হয়েছে - তবে এখনও বাস্তবায়িত হয়নি। সমস্যাটি সনাক্ত না করা এবং এখনও ঠিক করা না হওয়ার এটি অন্যতম কারণ হতে পারে।

এসকিউএল স্তরে, আপনি pg_typeof()টাইপটি পেতে (তবে সংশোধক নয়) ব্যবহার করতে পারেন ।

প্রশ্নাবলি

একসাথে, 3 টি সমস্যা গণ্ডগোল করে।
ভালো হবে, সমস্যা 1. সরাসরি জড়িত নয়, কিন্তু এটি নন-রিকার্সিভ মেয়াদে একটি ঢালাই সঙ্গে আপাতদৃষ্টিতে সুস্পষ্ট ফিক্স ধ্বংসাবশেষ: ARRAY[vc8]::varchar[]বা অনুরূপ, যা বিভ্রান্তির যোগ করা।
এই আইটেমগুলির মধ্যে কোনটি বাগ, একটি ত্রুটিযুক্ত বা ঠিক কীভাবে এটি হওয়ার কথা?
আমি কি কিছু মিস করছি বা আমাদের একটি বাগ রিপোর্ট করা উচিত?


এটি অবশ্যই সন্দেহজনক বলে মনে হয়। আমি সন্দেহ করি বিদ্যমান ইউনিয়ন প্রশ্নের জন্য পশ্চাদপদ সামঞ্জস্যতা কোনও ভূমিকা রাখতে পারে।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার: অনুরোধ করা সত্ত্বেও অ্যারে কনটেনটেশন কেন প্রয়োজনীয়তা ছাড়াই এবং নিক্ষিপ্ত হয় না তা আমি দেখতে পাই না। আরসিটিইকে কেন সাধারণ UNIONপ্রশ্নের তুলনায় আরও কঠোর (কম স্মার্ট) হতে হবে তা নয় । এটি কি এমন হতে পারে যে আমরা একবারে তিনটি স্বাধীন ছোট বাগ পেয়েছি ? (মাসের পর মাসের মতো এরকম কোনও সন্ধান পাওয়া গেল না।) আপনার মধ্যে কোনটি বাগ হিসাবে ফাইল করা উচিত বলে মনে করেন?
এরউইন ব্র্যান্ডসেটেটার

উত্তর:


1

এটি সম্পর্কের বৈশিষ্ট্যগুলির কারণে ( কোনও বিবৃতিতে সংজ্ঞায়িত pg_classএবং pg_attribute, বা গতিগতভাবে সংজ্ঞায়িত select) সমর্থনকারী সংশোধক (মাধ্যমে pg_attribute.atttypmod), যখন ফাংশন প্যারামিটারগুলি না করে। ফাংশনগুলির মাধ্যমে প্রক্রিয়া করার সময় মোডিফায়ারগুলি হারিয়ে যায় এবং যেহেতু সমস্ত অপারেটরগুলি ফাংশনগুলির মাধ্যমে পরিচালনা করা হয়, অপারেটরগুলি দ্বারা প্রসেস করার সময় সংশোধকগুলিও হারিয়ে যায়।

আউটপুট মানগুলির সাথে ফাংশনগুলি, বা সেগুলি রেকর্ডের সেটগুলি বা সমতুল্য returns table(...)এছাড়াও সংজ্ঞাতে অন্তর্ভুক্ত কোনও সংশোধককে ধরে রাখতে অক্ষম। যাইহোক, সারণীগুলি যেগুলি return setof <type>(প্রকৃতপক্ষে, সম্ভবত টাইপকাস্টে রাখতে হবে) এর জন্য সংজ্ঞায়িত কোনও সংশোধক typeরয়েছে pg_attribute

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.