এই প্রশ্নের জন্য একটি পুনরাবৃত্ত সিটিই সমাধান আলোচনা করার সময়:
@ টিউবকিউব একটি আশ্চর্যজনক ব্যতিক্রম হোঁচট খেয়েছে, যা আমাদের টাইপ সংশোধনকারীদের পরিচালনা তদন্ত করতে পরিচালিত করে। আমরা অবাক করা আচরণ পেয়েছি।
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 BY
LIMIT 1
max()
text
এসকিউএল ফিডল 3 টি জিনিস প্রদর্শন করছে:
- অবাক করার ফলাফল সহ একাধিক উদাহরণের বহিঃপ্রকাশ।
- একটি সাধারণ আরসিটিই যা
varchar
(সংশোধক ছাড়াই) সাথে কাজ করে । - একই আরসিটিই
varchar(n)
(মোডিফায়ার সহ) এর জন্য ব্যতিক্রম উত্থাপন করে ।
পোড়াটি পৃষ্ঠা 9.3 এর জন্য। আমি পৃষ্ঠা 9.4.4 এর জন্য স্থানীয়ভাবে একই ফলাফল পেয়েছি।
আমি ডেমো এক্সপ্রেশন থেকে টেবিল তৈরি করেছি যাতে সংশোধনকারী সহ সঠিক ডেটা টাইপ দেখাতে সক্ষম হয়। পিজএডমিন বাক্সের বাইরে এই তথ্যটি দেখায় এটি স্ক্যালফিল্ডল থেকে পাওয়া যায় না। লক্ষণীয়, এটি psql
(!) তেও উপলভ্য নয় । এটি পিএসকিএল-এর ঘাটতি হিসাবে পরিচিত এবং এর আগে পিএএসএসকিএল-হ্যাকারদের উপর একটি সম্ভাব্য সমাধান আলোচনা করা হয়েছে - তবে এখনও বাস্তবায়িত হয়নি। সমস্যাটি সনাক্ত না করা এবং এখনও ঠিক করা না হওয়ার এটি অন্যতম কারণ হতে পারে।
এসকিউএল স্তরে, আপনি pg_typeof()
টাইপটি পেতে (তবে সংশোধক নয়) ব্যবহার করতে পারেন ।
প্রশ্নাবলি
একসাথে, 3 টি সমস্যা গণ্ডগোল করে।
ভালো হবে, সমস্যা 1. সরাসরি জড়িত নয়, কিন্তু এটি নন-রিকার্সিভ মেয়াদে একটি ঢালাই সঙ্গে আপাতদৃষ্টিতে সুস্পষ্ট ফিক্স ধ্বংসাবশেষ: ARRAY[vc8]::varchar[]
বা অনুরূপ, যা বিভ্রান্তির যোগ করা।
এই আইটেমগুলির মধ্যে কোনটি বাগ, একটি ত্রুটিযুক্ত বা ঠিক কীভাবে এটি হওয়ার কথা?
আমি কি কিছু মিস করছি বা আমাদের একটি বাগ রিপোর্ট করা উচিত?
UNION
প্রশ্নের তুলনায় আরও কঠোর (কম স্মার্ট) হতে হবে তা নয় । এটি কি এমন হতে পারে যে আমরা একবারে তিনটি স্বাধীন ছোট বাগ পেয়েছি ? (মাসের পর মাসের মতো এরকম কোনও সন্ধান পাওয়া গেল না।) আপনার মধ্যে কোনটি বাগ হিসাবে ফাইল করা উচিত বলে মনে করেন?